在 Linux 上,我想将命令字符串(即一些数据)发送到串行端口(包含控制字符),并侦听响应(通常也可能包含控制字符)。
如何在 Linux 上尽可能简单地做到这一点?一个例子表示赞赏!
X T*_*ian 77
Unix 上的所有设备都映射到一个设备文件,串行端口将是 /dev/ttyS0
/dev/ttyS1
... 。
首先查看该文件的权限,假设您使用的是/dev/ttyS1
.
ls -l /dev/ttyS1
您将需要读写访问权限,如果这是一个共享系统,那么您应该考虑向所有人开放它的安全后果。
chmod o+rw /dev/ttyS1
Run Code Online (Sandbox Code Playgroud)
写入文件的一种非常简单的粗略方法是使用 simpleecho
命令。
echo -ne '\033[2J' > /dev/ttyS1
Run Code Online (Sandbox Code Playgroud)
并阅读
cat -v < /dev/ttyS1
Run Code Online (Sandbox Code Playgroud)
您可以让 cat 在一个终端中运行,并在第二个终端中运行 echo。
如果一切都是乱码,那么在开始发送之前可能需要设置波特率、位设置。stty
会这样做。!! 注意 stty 将使用 stdin 作为默认文件描述符来影响。
等效命令。
stty 19200 < /dev/ttyS1
stty 19200 -F /dev/ttyS1
Run Code Online (Sandbox Code Playgroud)
这可能足以让您编写脚本并记录?不确定你想要达到的目标。
对于更具交互性,请记住您的默认设置方法是使用
minicom
它只是一个程序,它可以完成我迄今为止提到的所有事情。(类似于 Windows 中的超级终端,您可能很熟悉)。
一个中间解决方案,将使用一个终端程序screen
,它可以在串行设备上运行。
screen /dev/ttyS1
Run Code Online (Sandbox Code Playgroud)
man screen
man minicom
man stty
想要查询更多的信息
Ale*_*lex 22
您所要做的就是打开两个终端。在第一个终端中,您cat
可以使用设备中的所有内容,例如
cat /dev/ttyS0
Run Code Online (Sandbox Code Playgroud)
在另一个终端中,您可以向终端发送任意十六进制字符和文本,例如:
echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0
Run Code Online (Sandbox Code Playgroud)
该echo -e
命令启用反斜杠转义的解释。
当然,必须确保 (i) 串行设置(速度、字长、流 ctrl 等)正确,并且 (ii) 串行设备(在另一端)没有阻塞。
Zib*_*bri 17
与串行设备通信的程序:
picocom
minicom
socat
Run Code Online (Sandbox Code Playgroud)
或者从外壳你可以这样做:
stty -speed 19200 < /dev/ttyS0 # sets the speed of the port
exec 99<>/dev/ttyS0 (or /dev/ttyUSB0...etc)
printf "AT\r" >&99
read answer <&99 # this reads just a CR
read answer <&99 # this reads the answer OK
exec 99>&-
Run Code Online (Sandbox Code Playgroud)
小智 13
这可能是一个更好的方法:
stty -F /dev/ttyUSB0 115200 raw -echo #CONFIGURE SERIAL PORT
exec 3</dev/ttyUSB0 #REDIRECT SERIAL OUTPUT TO FD 3
cat <&3 > /tmp/ttyDump.dat & #REDIRECT SERIAL OUTPUT TO FILE
PID=$! #SAVE PID TO KILL CAT
echo "R" > /dev/ttyUSB0 #SEND COMMAND STRING TO SERIAL PORT
sleep 0.2s #WAIT FOR RESPONSE
kill $PID #KILL CAT PROCESS
wait $PID 2>/dev/null #SUPRESS "Terminated" output
exec 3<&- #FREE FD 3
cat /tmp/ttyDump.dat #DUMP CAPTURED DATA
Run Code Online (Sandbox Code Playgroud)
您可以同时读取和写入设备,如下所示:
cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411
Run Code Online (Sandbox Code Playgroud)
cat
您的消息从发送到第二个stdin
,第一个cat
将响应转发到stdout
,将您的终端变成聊天室。
要完成,ctrl-c
,然后fg
再次运行ctrl-c
。