在Linux上,我想将命令字符串(即一些数据)发送到串行端口(包含控制字符),并监听响应(通常也可能包含控制字符)。
我怎样才能在 Linux 上尽可能简单地做到这一点?举个例子表示赞赏!
答案1
Unix 上的所有设备都映射到一个设备文件,串行端口将是 /dev/ttyS0
/dev/ttyS1
...。
首先查看该文件的权限,假设您正在使用/dev/ttyS1
.
ls -l /dev/ttyS1
您将需要读写访问权限,如果这是一个共享系统,那么您应该考虑向所有人开放它的安全后果。
chmod o+rw /dev/ttyS1
写入文件的一种非常简单粗暴的方法是使用简单的echo
命令。
echo -ne '\033[2J' > /dev/ttyS1
并阅读
cat -v < /dev/ttyS1
您可以让 cat 在一个终端中运行,并在第二个终端中运行 echo。
如果一切都是乱码,那么波特率、位设置可能需要在开始发送之前设置。stty
会那么做。 !!注意 stty 将使用 stdin 作为默认文件描述符来影响。
等效命令。
stty 19200 < /dev/ttyS1
stty 19200 -F /dev/ttyS1
这可能足以让您编写一些脚本并记录?不确定您想要实现什么目标。
为了更具交互性,请记住您的默认设置方法是使用
minicom
它只是一个程序,它可以执行我到目前为止提到的所有操作。 (类似于 Windows 中的超级终端,您可能很熟悉)。
screen
中间解决方案将使用可在串行设备上运行的终端程序。
screen /dev/ttyS1
man screen
man minicom
man stty
了解更多信息
答案2
您所要做的就是打开两个终端。在第一个终端中,您可以cat
从设备中获取所有内容,例如
cat /dev/ttyS0
在另一个终端中,您可以将任意十六进制字符和文本发送到终端,如下所示:
echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0
该echo -e
命令启用反斜杠转义的解释。
当然,必须确保(i)串行设置(速度、字长、流量控制等)正确,并且(ii)串行设备(另一端)没有阻塞。
答案3
与串行设备通信的程序:
picocom
minicom
socat
或者从 shell 你可以这样做:
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>&-
答案4
您可以同时读取和写入设备,如下所示:
cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411
cat
您的消息从发送到第二个stdin
,第一个cat
将响应转发到stdout
,将您的终端变成聊天室。
要完成, ,然后再次ctrl-c
运行。fg
ctrl-c