国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

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

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

“串口阻塞”你真的會(huì)用嗎?

ZLG致遠(yuǎn)電子 ? 2025-02-13 11:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

導(dǎo)讀

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

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

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

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

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

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

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

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

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

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

3.2 成功:0。3.2 失敗:-1。

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

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

2.設(shè)置輸出波特率

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

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

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

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

c_cflag &= ~CSIZE; //清除CSIZEc_cflag |= CS8; //設(shè)置CS8

85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?設(shè)置奇偶校驗(yàn)位設(shè)置串口的奇偶校驗(yàn)是在 c_cflag 設(shè)置。

  • PARENB 進(jìn)行奇偶校驗(yàn)。
  • PARODD 奇校驗(yàn),否則為偶校驗(yàn)。

1. 無(wú)校驗(yàn)

c_cflag &= ~PARENB;

2.偶校驗(yàn)

c_cflag |= PARENB;c_cflag &= ~PARODD;

3. 奇校驗(yàn)

c_cflag |= PARENB;c_cflag |= ~PARODD;

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

c_cflag &= ~CSTOPB; //清除CSTOPB標(biāo)志位

2.設(shè)置 2 位停止位

c_cflag |= CSTOPB; //設(shè)置CSTOPB標(biāo)志位

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

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

85aca540-e9bc-11ef-9434-92fbcf53809c.jpg ?清除串口緩沖由于串口在重新設(shè)置之后,需要對(duì)當(dāng)前的串口設(shè)備進(jìn)行適當(dāng)?shù)奶幚恚ǔJ褂胻cflush實(shí)現(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ù),對(duì)于在緩沖區(qū)中的尚未傳輸?shù)臄?shù)據(jù),或者收到的,但是尚未讀取的數(shù)據(jù)進(jìn)行處理。queue_selector設(shè)置:

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

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


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

c_cflag |= CLOCAL | CREAD;

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

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


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ī)范模式/原始模式下需要設(shè)置VMIN和VTIME。

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

VMIN和VTIME組合有四種情況:

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

VMIN>0,VTIME>0:讀取VMIN個(gè)字符或前后兩個(gè)字符的輸入間隔超過(guò)VTIME個(gè)1/10秒后返回,因?yàn)樵谳斎氲谝粋€(gè)字符之后系統(tǒng)才會(huì)啟動(dòng)定時(shí)器,所以在這種情況下,read至少讀取一個(gè)字符。


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

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

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

    關(guān)注

    5198

    文章

    20443

    瀏覽量

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

    關(guān)注

    15

    文章

    1619

    瀏覽量

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

    關(guān)注

    1

    文章

    72

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    真的會(huì)用示波器嗎?

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

    Verilog語(yǔ)言中阻塞和非阻塞賦值的不同

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

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

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

    linux串口通信阻塞與非阻塞問(wèn)題。

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

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

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

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

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

    UART阻塞方式收發(fā)

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

    解決串口傳輸“阻塞”問(wèn)題的方案資料下載

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

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

    電子發(fā)燒友網(wǎng)為提供總結(jié):這些Keil 軟件仿真的串口調(diào)試技巧,都記熟了沒有?資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、
    發(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>都記熟了沒有?資料下載

    時(shí)序邏輯中的阻塞和非阻塞

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

    阻塞與非阻塞通信的區(qū)別 阻塞和非阻塞應(yīng)用場(chǎng)景

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

    什么是阻塞?怎么設(shè)計(jì)才能滿足阻塞指標(biāo)?

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

    HAL_UART_Transmit阻塞時(shí)會(huì)影響串口中斷接收嗎?

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

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

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

    什么是阻塞和非阻塞

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