如何将数据发送到串行端口并查看答案?


37

在Linux上,我想将命令字符串(即某些数据)发送到串行端口(包含控制字符),并侦听响应(通常也可能包含控制字符)。

如何在Linux上做到最简单?一个例子,不胜感激!



我没有安装拦截器。
Alex

指定重新开放-并非建议的重复。
彼得

有些人太愚蠢了,他们只是提一些重复的问题。首先,请阅读问题和答案。
丹尼斯

Answers:


54

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在一个终端中运行,并在第二个终端中回显。

如果一切都是乱码,那么波特率,位设置可能需要在开始发送之前进行设置。stty会做到的。!! 注意stty将使用stdin作为默认文件描述符来影响。

等效命令。

stty 19200 < /dev/ttyS1
stty 19200 -F /dev/ttyS1

这可能足以让您编写脚本并登录?不确定您要达到的目标。

对于更具交互性的内容,请记住您的默认设置方法是使用 minicom它只是一个程序,该程序可以完成我到目前为止提到的所有事情。(类似于Windows中的超级终端,您可能很熟悉)。

一个中间解决方案,将使用screen将在串行设备上运行的终端程序。

screen /dev/ttyS1

man screen man minicom man stty 想要查询更多的信息


我根本没有任何输出。有什么想法吗?
金牌名称

可能是硬件流控制,请通过atty命令关闭或将串行电缆扎紧,以查找空调制解调器电缆。
X天

1
# stty -speed 38400 -f /dev/ttyUSB1返回stty: invalid argument '-speed'
Pro Backup

1
暂时,使用-F(大写F)设置设备。另外,您的速度参数是错误的。您可以使用speed来获取端口的波特率,或者使用ispeed或ospeed(不带减号)来设置输入和输出速度,或者仅使用一个数字来设置输入和输出速度,例如:stty 19200 -F / dev / ttyS ....
Paulus

令人惊讶的是,之前没有人注意到,谢谢@Pro Backup我已经纠正了示例。
X田

11

您所要做的就是打开两个终端。在第一个终端中,您可以cat从设备中获取所有信息

cat /dev/ttyS0

在另一个终端中,您可以向终端发送任意十六进制字符和文本,例如,如下所示:

echo -e "\x7E\x03\xD0\xAF und normaler Text" > /dev/ttyS0

echo -e命令启用反斜杠转义的解释。

当然,必须确保(i)串行设置(速度,字长,流量ctrl等)正确,并且(ii)串行设备(在另一端)没有阻塞。


我在上面写了我的答案后10分钟,您已经回答了这个问题,您根本没有添加任何进一步的信息!
X田

抱歉,我没有完整阅读您的答案。我看到我的答案已包含在您的答案中,因此,正如您所描述的,我将接受您的答案为正确的答案。
亚历克斯

我对COM端口了解不多。您能否解释一下“(另一端)串行设备没有阻塞”是什么意思?防火墙有问题吗?
Sopalajo de Arrierez

9

与串行设备通信的程序:

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>&-

您的答案很棒,它教会了我有关双向文件描述符的知识。但是,您确定关闭描述符的最后一行语法正确吗?我收到语法错误。我认为exec 99<&-或者exec 99>&-应该使用。还是两者都有?
Yankee

1
错字..你是对的
Zibri

7

这可能是一个更好的方法:

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

这非常好,因为它可以使过程自动化!我要做的唯一更改(完全是可选的)是确认收到的内容与发送的内容相同-可能只是计数或完全不同。
HiDefLoLife

4

您可以像这样同时读取和写入设备:

cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411

您的消息会cat从发送到第二个消息stdin,第一个消息cat会将响应转发到stdout,从而将您的终端变成聊天室。

要完成,,然后再次ctrl-c运行。fgctrl-c

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.