1

我已經編寫了一個Linux應用程序來讀取&通過模擬串行端口的USB端口將二進制數據寫入遠程設備。當我從設備讀取數據時,我有一個USB嗅探器顯示這樣的二進制數據流(0x01,0x0A ...... 0x13),但是當我的程序讀取字節時,0x13不是在字節流 - 這是XOFF字符,但我沒有使用XON/XOFF流量控制(我認爲)。讀取設備數據流時缺少流量控制數據(0x13)

嘗試開放讀寫,以及在二進制模式下打開fread和fwrite,結果相同。有任何想法嗎?

+0

它可能是串行通過USB的協議增加一個校驗字節? –

回答

0

也許最好避免通過串口發送控制字符,而是稍微修改Linux和遠程設備上的應用程序,以便將它們編碼/解碼爲/從兩個字節開始。例如:

0x00 0x00 -> 0x00 
0x00 0x01 -> 0x13 (escape XOFF) 
0x00 0x02 -> 0x11 (escape XON) 

考慮到二進制流出現這3個字節的這不應該降低整體吞吐量,我認爲概率。

另外,XON/XOFF是一種軟件流程控制和串行/終端驅動程序的基本功能。實際上,這個函數也可以用於你的情況 - 爲了避免緩衝區溢出並丟失一些有價值的字節,你可以暫停(XOFF)或恢復(XON)傳輸。

1

感謝您的任何回覆,如網站。原來的stty顯示:

# stty -F /dev/ttyUSB0 

speed 115200 baud; 
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; 
eol2 = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; 
lnext = ^V; flush = ^O; min = 0; time = 10; 
-brkint -imaxbel 
-opost 
-isig -icanon -echo -echoe 

即使它看起來像流控制被關閉, 的解決方案是使用cfmakeraw設置,以瞭解所有的字符,而忽略了什麼。

cfmakeraw()將終端設置爲類似舊版本7終端驅動程序的「原始」模式:輸入可逐字符提供,回顯被禁用,並且終端輸入和輸出字符的所有特殊處理均被禁用。終端屬性設置如下:

termios_p->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP 
      | INLCR | IGNCR | ICRNL | IXON); 
termios_p->c_oflag &= ~OPOST; 
termios_p->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN); 
termios_p->c_cflag &= ~(CSIZE | PARENB); 
termios_p->c_cflag |= CS8; 

可以看到我的所有數據現在:)