Terminal

當僅從串列設備接收 CR 時,如何使螢幕向下一行並從頭開始?

  • August 15, 2019

我正在使用 screen: 連接到串列埠screen /dev/cu.usbserial-A703XAOG。另一端的設備只發送一個輸入到不同的行。screen 在收到輸入時只從行首開始,不會下一行,因此會用下一行輸出覆蓋最後一行輸出。

我可以更改icrnl串口的設置,它會將輸入轉換為換行。儘管螢幕現在在寫入下一行輸出之前下降了一行,但當僅接收換行時它不會從開頭開始。

Ctrl-A我使用, Ctrl+轉儲了 .termcap 文件.。我閱讀了 termcap 並了解到:

如果終端有一個移動到下一行第一列的命令,則該命令可以作為 nw(換行符)給出。

來源

所以這是我目前的~/.screenrc文件:

termcap SC nw=^M

WhereSC與轉儲的 .termcap 文件中的名稱匹配。

這並沒有達到我希望的效果。也許termcap命令不是要走的路?

當僅從串列設備接收 CR 時,如何使螢幕向下一行並從頭開始?

編輯:

這是sudo stty -f /dev/cu.usbserial-A703XAOG -a螢幕連接到串口時的輸出:

speed 9600 baud; 0 rows; 0 columns;
lflags: -icanon -isig iexten -echo echoe echok echoke -echonl echoctl
       -echoprt -altwerase -noflsh -tostop -flusho -pendin -nokerninfo
       -extproc
iflags: -istrip -icrnl -inlcr -igncr -ixon -ixoff -ixany -imaxbel -iutf8
       -ignbrk brkint -inpck ignpar -parmrk
oflags: -opost -onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd -hupcl clocal -cstopb -crtscts -dsrflow
       -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = ^@; eol2 = ^@;
       erase = ^?; intr = ^C; kill = ^H; lnext = ^V; min = 100;
       quit = ^\; reprint = ^R; start = ^Q; status = ^T; stop = ^S;
       susp = ^Z; time = 2; werase = ^W;

編輯:

我了解某些軟體可能會解決此問題,例如,在PuTTY中我需要啟用“每個 CR 中的隱式 LF”設置,而在串列中我需要啟用“將獨立 CR 解釋為 CRLF”。但我的問題具體是關於screen,因為那是我目前用來連接串口的軟體。

編輯:

螢幕模擬 VT100 終端,它應該辨識控制序列()。我需要設置“自動換行模式”(也稱為換行模式)。這應該使用參數值為 20: 的設置模式控制序列來完成ESC [ 20 h

如何將此控制序列傳遞給螢幕?

似乎對我有用的東西是通過向它發送你找到的換行模式轉義序列來操縱螢幕具有的偽 tty,並給它一個 stty 命令將輸入轉換為換行符。用於ps a查找 pty:

16947 pts/4    Ss+    0:00 screen -S myscreen /dev/ttyS0

然後給出命令

pty=/dev/pts/4
stty -F $pty  ocrnl
echo -en '\e[20h' >$pty

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