91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuà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標志作用差不多。程序不關心DCD信號線的狀態(tài),也就是不關心端口另一端是否已經(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)系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5152

    文章

    19675

    瀏覽量

    317676
  • 串口
    +關注

    關注

    15

    文章

    1588

    瀏覽量

    79958
  • zlg
    zlg
    +關注

    關注

    1

    文章

    70

    瀏覽量

    38647
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    真的會用示波器嗎?

    下面就以我見到的很多工程師常犯的問題予以糾正,分享一下我掌握的一些知識。
    發(fā)表于 01-19 10:34 ?5277次閱讀
    <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 ?6681次閱讀

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

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

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

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

    關于串口讀寫阻塞,沒有設置非阻塞標志,為什么還能繼續(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)為提供解決串口傳輸“阻塞”問題的方案資料下載的電子資料下載,更有其他相關的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(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)試技巧,都記熟了沒有?資料下載的電子資料下載,更有其他相關的電路圖、源代碼、課件教程、中文資料、英文資料、參考設計、用戶指南、
    發(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 ?3359次閱讀

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

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

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

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

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

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

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

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

    什么是阻塞和非阻塞

    什么是阻塞和非阻塞?我們就用管道的讀寫來舉例子。
    的頭像 發(fā)表于 03-25 10:04 ?831次閱讀
    主站蜘蛛池模板: 中文字幕精品一区 | 日日操夜夜 | 午夜视频网站在线观看 | 九色婷婷 | 欧美无遮挡一区二区三区 | 日产精品卡二卡三卡四卡无卡乱码 | 99热这里只有精品69 | 男人搡女人视频免费看 | 国产黄色a三级三级三级 | 五月天婷婷丁香中文在线观看 | 成人综合网址 | 手机在线你懂得 | 一区二区网站 | 国产精品嫩草影院午夜 | 欧美色图首页 | 美女一级毛片免费观看 | 亚洲精品国产成人 | 5252色欧美在线激情 | 日本黄色免费网站 | 久久sp| v视界影院最新网站 | 国产色爽免费视频 | 五月婷婷久久综合 | 欧美影院入口 | 久久思re热9一区二区三区 | 香蕉久久高清国产精品免费 | 一级做α爰片久久毛片 | 菲菲国产在线观看 | 色综合小说天天综合网 | 666夜色666夜色国产免费看 | 一级欧美日韩 | 国产三级精品在线 | 三级日韩| 久久在精品线影院精品国产 | 色视频色露露永久免费观看 | 超级乱淫片67194免费看 | 黄色h网站| 日本一视频一区视频二区 | 大香交伊人 | 99色吧| 欧美性色生活片天天看99 |