在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

“串口阻塞”你真的會用嗎?

ZLG致遠電子 ? 2025-02-13 11:42 ? 次閱讀

導讀

在串口通信開發(fā)中,數(shù)據(jù)錯亂是常見問題。本文將快速介紹串口標志位的作用及配置方法,幫助解決數(shù)據(jù)傳輸錯誤。

這是一個真實案例,用戶反饋“串口向另外的設備發(fā)送數(shù)據(jù),發(fā)現(xiàn)運行一段時間后,發(fā)送的消息會阻塞很久才會發(fā)出來,一下子出來很多數(shù)據(jù)”。經(jīng)過幫客戶檢查應用程序源碼,發(fā)現(xiàn)應用程序在串口阻塞方面沒有做正確的處理,修改后解決。

85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?非阻塞打開串口

open("/dev/ttyS1", O_RDWR | O_NOCTTY | O_NONBLOCK);

  • O_NOCTTY:如果打開的是一個終端設備,這個程序不會成為對應這個端口的控制終端,如果沒有該標志,任何一個輸入,例如鍵盤中止信號等,都將影響進程。
  • O_NONBLOCK:該標志與早期使用的O_NDELAY標志作用差不多。程序不關(guān)心DCD信號線的狀態(tài),也就是不關(guān)心端口另一端是否已經(jīng)連接。如果不指定該標志,進程將一直在休眠狀態(tài),直到DCD信號線為0。簡單點就是以非阻塞方式打開串口。

85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?設置串口成阻塞方式可用fcntl設置串口的阻塞/非阻塞。1. 阻塞:fcntl(fd, F_SETFL, 0)fcntl中的F_SETFL只可以更改標志O_APPEND,O_NONBLOCK,O_SYNC 和 O_ASYNC;而0則表示清空這幾個標志,其中O_NONBLOCK也沒了,所以就變成了阻塞。2. 非阻塞:fcntl(fd, F_SETFL, O_NONBLOCK)檢測打開的文件描述符是否連接到一個終端設備,進一步確認串口是否正確打開。

85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?獲取和設置termios1. 獲取termios結(jié)構(gòu)體(串口屬性)

  • inttcgetattr(intfd,structtermios*termptr);
  • termptr:接收返回的termios,成功:0,失敗:-1。

2. 保存先前的串口配置inttcsetattr(intfd,intopt,conststructtermios*termptr); 3. 設置串口屬性3.1 opt:在串口驅(qū)動程序里有輸入緩沖區(qū)和輸出緩沖區(qū)。在改變串口屬性時,緩沖區(qū)可能有數(shù)據(jù)存在,如何處理緩沖區(qū)中的數(shù)據(jù),可通過opt 參數(shù)實現(xiàn)。

  • TCSANOW:更改立即發(fā)生;
  • TCSADRAIN:發(fā)送了所有輸出后更改才發(fā)生,若更改輸出參數(shù)則應用此選項;
  • TCSAFLUSH:發(fā)送了所有輸出后更改才發(fā)生,在更改發(fā)生時未讀的所有輸入數(shù)據(jù)被刪除(Flush)。

3.2 成功:0。3.2 失?。?1。

85db0ba6-e9bc-11ef-9434-92fbcf53809c.jpg ?設置波特率1. 設置輸入波特率

int cfsetispeed(struct termios *termptr, speed_t speed);

2.設置輸出波特率

int cfsetospeed(struct termios *termptr, speed_t speed);

85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?設置數(shù)據(jù)位(也稱設置字符大小)通過 c_cflag 設置。

CSIZE //數(shù)據(jù)位屏蔽CS5//5個數(shù)據(jù)位CS6 //6個數(shù)據(jù)位CS7 //7個數(shù)據(jù)位CS8 //8個數(shù)據(jù)位

例如,設置串口的數(shù)據(jù)位為 8 位:

c_cflag &= ~CSIZE; //清除CSIZEc_cflag |= CS8; //設置CS8

85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?設置奇偶校驗位設置串口的奇偶校驗是在 c_cflag 設置。

  • PARENB 進行奇偶校驗。
  • PARODD 奇校驗,否則為偶校驗。

1. 無校驗

c_cflag &= ~PARENB;

2.偶校驗

c_cflag |= PARENB;c_cflag &= ~PARODD;

3. 奇校驗

c_cflag |= PARENB;c_cflag |= ~PARODD;

85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?設置停止位設置串口停止位是在 c_cflag 設置。1. 設置 1 位停止位

c_cflag &= ~CSTOPB; //清除CSTOPB標志位

2.設置 2 位停止位

c_cflag |= CSTOPB; //設置CSTOPB標志位

85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?設置最少字符和等待時間c_cc[VTIME]和c_cc[VMIN]設置最少字符和等待時間,針對 read 而言。如果設置為0的話,則在任何情況下read()函數(shù)立即返回:

c_cc[VTIME] = 0;c_cc[VMIN] = 0;

85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?清除串口緩沖由于串口在重新設置之后,需要對當前的串口設備進行適當?shù)奶幚恚ǔJ褂胻cflush實現(xiàn)。

int tcdrain(int fd); //使程序阻塞,直到輸出緩沖區(qū)的數(shù)據(jù)全部發(fā)送完畢。int tcflow(int fd, int action); // 用于暫?;蛑匦麻_始輸出。int tcflush(int fd, int queue_selector); //用于清空輸入/輸出緩沖區(qū)。

使用tcflush()函數(shù),對于在緩沖區(qū)中的尚未傳輸?shù)臄?shù)據(jù),或者收到的,但是尚未讀取的數(shù)據(jù)進行處理。queue_selector設置:

  • TCIFLUSH:對接收到而未被讀取的數(shù)據(jù)進行清空處理。
  • TCOFLUSH:對尚未傳送成功的輸出數(shù)據(jù)進行清空處理。

TCIOFLUSH:即對尚未處理的輸入輸出數(shù)據(jù)進行清空處理。


85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?激活選項CLOCAL 和 CREAD 分別用于本地連接和接收使能。激活這兩個選項:

c_cflag |= CLOCAL | CREAD;

85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?激活串口配置(屬性)

在完成全部串口配置之后,要激活剛才的配置并使配置生效。使用屬性設置函數(shù) tcsetattr(),前面已有其說明。


85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?向串口寫數(shù)據(jù)

直接調(diào)用wtrite()即可。


85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?從串口讀數(shù)據(jù)調(diào)用read()讀取串口數(shù)據(jù),但在非規(guī)范模式/原始模式下需要設置VMIN和VTIME。

  • VMIN:非規(guī)范模式下讀取的最小字符數(shù)。
  • VTIME:非規(guī)范模式下讀數(shù)據(jù)時的延時,VTIME個1/10秒。

VMIN和VTIME組合有四種情況:

  • VMIN=0,VTIME=0:讀取的最少字符數(shù)為0,延時時間為0,read立即返回。
  • VMIN>0,VTIME=0: read阻塞到讀取VMIN個字符才返回。
  • VMIN=0,VTIME>0:有數(shù)據(jù)就返回,無數(shù)據(jù)等待VTIME個1/10秒返回。

VMIN>0,VTIME>0:讀取VMIN個字符或前后兩個字符的輸入間隔超過VTIME個1/10秒后返回,因為在輸入第一個字符之后系統(tǒng)才會啟動定時器,所以在這種情況下,read至少讀取一個字符。


85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?串口操作順序

  1. 保存原有串口屬性(可選);
  2. 設置波特率;
  3. 設置激活選項,如c_cflag |= CLOCAL | CREAD;
  4. 設置數(shù)據(jù)位大小;
  5. 設置奇偶校驗位;
  6. 設置停止位;
  7. 設置輸出(可選),如c_oflag=0;0是清空標志;c_oflag&=~OPOST;
  8. 設置輸入(可選);
  9. 設置c_lflag,如原始模式cfmakeraw(&termios);
  10. 設置讀取特性,c_cc[VTIME]和c_cc[VMIN];
  11. 刷新緩沖區(qū),tcflush();
  12. 設置串口屬性,tcsetattr()。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5114

    文章

    19343

    瀏覽量

    311402
  • 串口
    +關(guān)注

    關(guān)注

    14

    文章

    1575

    瀏覽量

    78010
  • zlg
    zlg
    +關(guān)注

    關(guān)注

    1

    文章

    66

    瀏覽量

    38401
收藏 0人收藏

    評論

    相關(guān)推薦

    真的會用示波器嗎?

    下面就以我見到的很多工程師常犯的問題予以糾正,分享一下我掌握的一些知識。
    發(fā)表于 01-19 10:34 ?5217次閱讀
    <b class='flag-5'>你</b><b class='flag-5'>真的</b><b class='flag-5'>會用</b>示波器嗎?

    Verilog語言中阻塞和非阻塞賦值的不同

    來源:《Verilog數(shù)字系統(tǒng)設計(夏宇聞)》 阻塞和非阻塞賦值的語言結(jié)構(gòu)是Verilog 語言中最難理解概念之一。甚至有些很有經(jīng)驗的Verilog 設計工程師也不能完全正確地理解:何時使用非阻塞
    的頭像 發(fā)表于 08-17 16:18 ?6524次閱讀

    串口設備框架serial_v2源碼分析-阻塞模式

    在serial_v2中,串口設備以應用層視角,即阻塞模式或非阻塞模式來作為該串口設備的開啟標志.
    的頭像 發(fā)表于 09-14 11:34 ?2409次閱讀

    linux串口通信阻塞與非阻塞問題。

    一般情況下串口通信中read()函數(shù)都是阻塞的。當然也可以通過設置文件等方法把串口設為非阻塞的。這里就有一個問題,當串口設置為
    發(fā)表于 07-14 15:57

    關(guān)于串口讀寫阻塞,沒有設置非阻塞標志,為什么還能繼續(xù)打印

    我打開這個串口的時候沒有設置非阻塞的標志,應該是默認阻塞的吧,但是上位機不向串口發(fā)送東西,也就是read沒有讀到東西的時候下面的printf還是會一直打印。我理解的
    發(fā)表于 03-15 16:51

    HIDDongle例子修改成串口出現(xiàn)阻塞

    想問個問題啊,我用HIDDongle那個例子修改,弄成串口的,為什么會有串口阻塞的問題出現(xiàn)呢
    發(fā)表于 03-31 09:11

    UART阻塞方式收發(fā)

    博主能力有限,有錯誤望大佬指出0x00 文章內(nèi)容:UART阻塞方式收發(fā)UART中斷方式收發(fā)UART中斷回調(diào)函數(shù)UART DMA方式收發(fā)printf()函數(shù)串口重定向0x01 UART阻塞方式收發(fā)
    發(fā)表于 08-10 07:32

    解決串口傳輸“阻塞”問題的方案資料下載

    電子發(fā)燒友網(wǎng)為提供解決串口傳輸“阻塞”問題的方案資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-20 08:45 ?2次下載
    解決<b class='flag-5'>串口</b>傳輸“<b class='flag-5'>阻塞</b>”問題的方案資料下載

    總結(jié):這些Keil 軟件仿真的串口調(diào)試技巧,都記熟了沒有?資料下載

    電子發(fā)燒友網(wǎng)為提供總結(jié):這些Keil 軟件仿真的串口調(diào)試技巧,都記熟了沒有?資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、
    發(fā)表于 04-21 08:48 ?11次下載
    總結(jié):這些Keil 軟件仿<b class='flag-5'>真的</b><b class='flag-5'>串口</b>調(diào)試技巧,<b class='flag-5'>你</b>都記熟了沒有?資料下載

    時序邏輯中的阻塞和非阻塞

    Verilog HDL的賦值語句分為阻塞賦值和非阻塞賦值兩種。阻塞賦值是指在當前賦值完成前阻塞其他類型的賦值任務,阻塞賦值由=來完成;非
    的頭像 發(fā)表于 03-15 13:53 ?3206次閱讀

    阻塞與非阻塞通信的區(qū)別 阻塞和非阻塞應用場景

    阻塞通信(Blocking Communication):當進行阻塞通信時,調(diào)用者在發(fā)起一個I/O操作后會被阻塞,直到該操作完成返回才能繼續(xù)執(zhí)行后續(xù)代碼。
    的頭像 發(fā)表于 06-15 17:32 ?6390次閱讀

    什么是阻塞?怎么設計才能滿足阻塞指標?

    阻塞就是外部有阻塞干擾信號的時候,設備還可以正常運行。一般分為帶內(nèi)阻塞和帶外阻塞,由于直放站都是做寬帶設備,一般只提帶外阻塞。
    的頭像 發(fā)表于 10-10 11:22 ?2474次閱讀

    HAL_UART_Transmit阻塞時會影響串口中斷接收嗎?

    最近項目里使用了兩路串口透傳數(shù)據(jù),串口3中斷接收數(shù)據(jù),組包后通過串口1阻塞發(fā)送出去。
    的頭像 發(fā)表于 10-26 14:24 ?2243次閱讀
    HAL_UART_Transmit<b class='flag-5'>阻塞</b>時會影響<b class='flag-5'>串口</b>中斷接收嗎?

    作為射頻工程師,真的會用“dB”?

    作為射頻工程師,真的會用“dB”?
    的頭像 發(fā)表于 12-06 14:51 ?739次閱讀
    作為射頻工程師,<b class='flag-5'>你</b><b class='flag-5'>真的</b><b class='flag-5'>會用</b>“dB”?

    什么是阻塞和非阻塞?

    什么是阻塞和非阻塞?我們就用管道的讀寫來舉例子。
    的頭像 發(fā)表于 03-25 10:04 ?645次閱讀

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術(shù)信息
    • 參加活動獲取豐厚的禮品
    主站蜘蛛池模板: 中国业余老太性视频 | 色麒麟影院 | 天天摸天天干 | 成人欧美一区二区三区视频不卡 | 国产拍拍拍免费视频网站 | 久久久久久毛片免费播放 | 你懂的在线视频观看 | 欧美日韩一区二区三区视频在线观看 | 免费播放欧美毛片欧美aaaaa | 五月开心六月伊人色婷婷 | 欧美黄色片免费看 | 亚洲日韩色图 | 好男人社区www在线观看 | 日本高清免费一本视频在线观看 | 性欧美激情在线观看 | 欧美一级特黄aa大片 | 欧美精品成人a多人在线观看 | 性久久久久久久久 | 狠狠色婷婷丁香六月 | 久久视频精品36线视频在线观看 | 天天插夜夜操 | sss欧美华人整片在线观看 | 亚洲国产精品久久久久婷婷软件 | 在线种子搜索 | 91大神精品全国在线观看 | 爱操综合网 | 国产无圣光高清一区二区 | 99久久99这里只有免费费精品 | 综合网在线观看 | jk黑色丝袜美腿老师啪啪 | 久久电影www成人网 久久电影福利 | 国产农村三片免费网站 | 亚洲高清免费在线观看 | 亚洲福利二区 | 国产精品午夜久久久久久99热 | 特黄色片 | 福利社看片 | 久久久伊香蕉网站 | 手机看高清特黄a大片 | 免费公开在线视频 | 欧美经典三级春潮烂漫海棠红 |