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

Ale*_*lex 61 serial-port

在 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)

  • 速度在 ubuntu stty -F /dev/ttyS0 9600 cs8 -cstopb -parenb 上未被识别为有效参数 (2认同)

小智 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)

  • 当我在 bash 函数中扭曲上面的代码并通过 `watch -n 0.2 ./send.sh` 循环调用我的整个脚本时,我发现在几次调用之后或当发送 `CTRL+C` 信号并重新执行它时,我的输出数据以奇怪的方式打印。原因是 left cat-s 进程可以模拟访问我的端口。您可以通过 `lsof /dev/ttyUSB0` 列出它,所以我添加 `lsof -t /dev/ttyUSB0 | xargs -r Kill -9` 在开始时,以确保在我的函数的给定运行时中只存在一个 cat 进程。 (2认同)

dia*_*lic 5

您可以同时读取和写入设备,如下所示:

cat /dev/cu.usbmodem411 & cat > /dev/cu.usbmodem411
Run Code Online (Sandbox Code Playgroud)

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

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