簡體   English   中英

Linux串行端口:使用超時阻止讀取

[英]Linux Serial Port: Blocking Read with Timeout

我已經研究了許多有用的線程和一些教程,但我仍然遇到一些應該非常簡單的問題。 這里參考一些我已經閱讀過的主題:

如何在讀取函數調用中實現超時?

如何在C中從串口打開,讀取和寫入

無論如何,我有點問題。 如果我收到數據,我的代碼工作正常。 如果我不這樣做,read()函數會停止並且退出程序的唯一方法是使用kill -9(注意:我使用信號處理來向讀取串行數據的線程發出信號以終止。這不是罪魁禍首,即使我已經刪除了我的信號處理,read()調用仍然停止。 我想要做的是讀取一次阻塞和讀取一個塊(因此節省CPU使用率),但是如果讀取沒有數據,我就不會超時。

以下是我正在應用於端口的設置:

struct termios serial_struct;
serial_struct.c_cflag = B115200 | CS8 | CLOCAL | CREAD;
serial_struct.c_iflag = IGNPAR;
serial_struct.c_oflag = 0;
serial_struct.c_lflag = 0;
serial_struct.c_cc[VTIME] = 1;  // timeout after .1s that isn't working
serial_struct.c_cc[VMIN] = 64;  // want to read a chunk of 64 bytes at a given time

然后我使用tcsetattr()設置這些設置,並確認端口通過tcgetattr()接收設置。 我認為我的設置可能有沖突,因為我的讀取似乎是阻塞並等待直到收到64個字節,但是沒有做任何關於超時的事情。 我知道我可以使用select()來處理超時,但我希望避免多個系統調用。

一如既往,感謝您的幫助。

來自man 3 termios

MIN> 0; TIME> 0:TIME指定計時器的限制,以十分之一秒為單位。 一旦輸入的初始字節變為可用,則在接收到每個進一步的字節后重新啟動定時器。 read(2)在請求的字節數或MIN字節的較小者或者字節超時到期時返回。 由於定時器僅在初始字節可用后啟動,因此將至少讀取一個字節。

請注意,在收到至少一個字節的數據之前,定時器不會啟動 在接收到第一個數據字節后,如果在接收連續數據字節之間存在TIME十分之一秒的間隔,則讀取將超時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM