Serial-Console

ttyUSB0 的串列流控制問題

  • July 24, 2021

這與我大約一個月前創建的先前執行緒有關,該執行緒已得到回答。

今天,我嘗試在執行 Ubunutu 20 的筆記型電腦上設置串列控制台登錄提示,並使用 Belkin F5U409 USB 串列適配器。我遇到了同樣的問題,更大的文本輸出最終會分解成亂碼。但是,此時間設置stty ixon不會解決該行為。有關問題的範例輸出,請參見下文。

就上下文而言,我用來通過 RS232 連接到 Ubuntu 筆記型電腦的電腦是 EPSON PX-8。在 PX-8 上,我使用名為 TEL.COM 的終端仿真軟體。關於我在 PX-8 上配置的終端參數,請參見下文。

我正在使用 systemd 在 USB0 上啟用控制台systemctl start serial-getty@ttyUSB0.service。我需要使用 systemd 配置流量控制嗎?除了 stty 我還需要為 ttyUSB0 配置參數嗎?

我試圖在另一台執行 Debian 10 的筆記型電腦上進行設置,但得到了相同的行為。

PX-8 上的 TEL.COM 設置:

Baud: 9600, Char Bits: 8, Parity: NONE, Stop Bits: 2, RTS: ON, Flow Control: ON

當我嘗試輸出命令歷史記錄時出現此問題的範例:

albert@t450:/$ history
   1  sudo rasp-config
   2  sudo raspi-config
   3  sudo nano /boot/cmdline.txt
   4  tail /boot/cmdline.txt
   5  sudo shutdown -r now
   6  sudo vim ~/boot/cmdline.txt
   7  cd /./boot
   8  dir
   9  sudo vim cmdline.txt
  10  sudo vim config.txt
  11  sudo shutdown -r now
  12  dfgdf
  13  vim
  14  sudo vim cmdline.txt
  15  cd /./boot
  16  sudo vim cmdline.txt
  17  sudo shutdown -r now
  18  cd /./boot
  19  sudo vim cmdline.txt
  20  sudo shutdown -r now
  21  ping 8.8.8.8
  2 xprt TEM=Vvj9s9ds9j3oin so nat1 machine
 x Rom =vos cngas-2goses9g3
-xtiet n n5
-s oiy
y

Ubuntu機器上的stty配置:

albert@t450:/$ stty -a
speed 9600 baud; rows 40; columns 80; line = 0; intr = ^C; quit = ^\; erase = ^?; 
kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; 
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; discard = ^O; min = 1; 
time = 0; -parenb -parodd -cmspar cs8 -hupcl cstopb cread -clocal -crtscts -ignbrk 
-brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff -iuclc -ixany 
-imaxbel iutf8 opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 
bs0 vt0 ff0 isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop 
-echoprt echoctl echoke -flusho -extproc

請注意,所有這些參數都在 stty 中設置:

ixon
ixoff 
stop = ^S
start = ^Q;
cs8 
cstopb
-parenb

Belkin F5U 1 09 似乎是一款設計相當老舊的設備,因此具有相同 usb vendor:device id的 F5U **4 09 可能是相似的。**在這種情況下,由於 id 而選擇的 Linux 驅動程序是mct_u232.c。我們可以在.h 文件中讀取Flow control

除了 DTR/RTS 設置之外,沒有實現任何流控制特定請求。兩個信號都被丟棄,因為沒有流量控制,但被斷言用於硬體或軟體流量控制。

所以在這個驅動中似乎沒有實現XON/XOFF軟體流控,是通過嗅探Windows98下發出的usb命令導出的。也許硬體本身不提供這個功能。

您可以嘗試在使用者級別實現流控制,但這不太可能足夠,因為輸入和輸出上可能會有一個 fifo,因此當 XOFF 到達使用者級別時,可能仍然有太多字元已經在無法取消的先進先出。也許 PX-8 提供了可用於打包數據的其他協議?

通過連接額外的調製解調器線路 RTS 和 CTS(引腳 7 和 8 用於 9 針 DB9,4 和 5 用於 DB25),您仍然可以使用硬體流控制。如果您將 PX-8 連接為電腦而不是終端,則可能需要交換這些。你也需要stty crtscts,也許-clocal.

或者,由於製造商提供了足夠的文件,Linux 可以更好地支持其他串列 USB 設備,例如流行的 FTDI 系列。FTDI 驅動程序似乎具有在設備中設置 XON 和 XOFF 字元的程式碼,這將允許硬體對 XOFF 字元的接收做出快速響應,而無需等待字元到達核心。認可。FTDI 晶片存在非法複製品,因此請嘗試購買信譽良好的品牌以確保完全兼容。

引用自:https://unix.stackexchange.com/questions/659398