這兩天在某嵌入式系統做了個串列埠通訊程式,遇到了每次只接收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 複製 以上 可以列出電腦上所有的可用串列埠,前提是電腦上是有串列埠的,如果沒有的話,會出現異...