關於串列埠通訊每次只能接收8個位元組

2021-08-07 15:44:45 字數 1014 閱讀 7841

這兩天在某嵌入式系統做了個串列埠通訊程式,遇到了每次只接收8個位元組的問題。相信很多人都遇到了。(註明:linux系統)

上網一查資料,找到串列埠配置結構體struct termios中的c_cc[vtime] 和 c_cc[vmin]引數。

c_cc[vtime]   // 等待時間,單位百毫秒 

c_cc[vmin]     // 最小位元組數 

vmin自然就是最少接收的位元組數了。那不足vmin的話怎麼辦呢? vtime就是經過這麼多個百毫秒後,即使不足vmin定義的最少位元組數,也讀出。

當vtime=0,就是一直等待。當然,串列埠需要設定成阻塞模式。

好,試一下:

程式中 read(fd, buf, 40);  //  偽**

c_cc[vtime] = 1;

c_cc[vmin]  = 10;

用串列埠工具傳送字串「1234567890123456789」

結果分為兩次接收

「1234567890123456」

「789」

不是8個位元組了,也不是10個位元組,變成了16個位元組。

看來,最少接收位元組數會被設定為大於vmin引數的那個8的倍數

為了測試接收延時,在程式中加入了毫秒級的時間列印資訊,然後測試接收長字串 「123456789012345678901234567890123456789」。

結果接收分成了3條。第一第二條之間的時間間隔約25毫秒,可能是我的其他**占用了些時間。

第二第三條之間間隔100毫秒。因為第三條不足16個位元組,所以等待到vtime時間才會被讀到。

另外測試得出:當vmin大於read的第三個引數時,以read的第三個引數為準

總結:1、嵌入式系統的預設串列埠緩衝是8個位元組,可被配成8的倍數。最大值未驗證。

2、vtime的單位是「百毫秒」,即最小等待100毫秒。對實時性要求較高的場合太長了。

3、為了保證資料接收完整性,串列埠通訊協議還是應該做的。

關於STM32串列埠接收中斷中只能接收乙個位元組

最近除錯stm32的串列埠接收時發現例程中只能接收乙個位元組 例程如下 1 初始化串列埠1 2 void uart init u32 bound 43 void usart1 irqhandler void 串列埠1中斷服務程式 44 53 54 55 56 57這是較為普遍的原始碼例程的寫法,用原...

關於STM32串列埠接收中斷中只能接收乙個位元組

最近除錯stm32的串列埠接收時發現例程中只能接收乙個位元組 例程如下 1 初始化串列埠1 2void uart init u32 bound 43void usart1 irqhandler void 串列埠1中斷服務程式44 5354 55 5657 這是較為普遍的原始碼例程的寫法,用原子的版本...

關於Java串列埠通訊

enumeration en commportidentifier.getportidentifiers commportidentifier portid while en.hasmoreelements 複製 以上 可以列出電腦上所有的可用串列埠,前提是電腦上是有串列埠的,如果沒有的話,會出現異...