我正在尝试编写一个 bash 脚本,该脚本应该能够从 ttyS0 收集数据并放入变量中。
我需要与串行线上的设备进行通信,该模块能够接收 AT 命令,我可以使用 echo > ttyS0 发送这些命令并在变量中捕获相关答案。可以在不将收到的答案存储在变量中(即 cat /dev/ttyS0 & )的情况下执行此操作,但如果我尝试将此数据放入变量中(即 VAR=$(cat /dev/ttyS0 &) ,它不会不起作用(在VAR中我在模块的答案之后找不到任何东西)。
我可以通过 gnome 终端(我正在使用 Ubuntu 发行版)“手动”执行以下操作:
从我称为 (A) 的 GNOME 终端,我运行(以 root 身份)
# VAR=$(cat /dev/ttyS0)
此命令不会返回 root 提示符
#
,因为可能cat /dev/ttyS0
正在运行并等待输入。从我称为 (B) 的另一个 GNOME 终端,我运行
# echo -en "hello in VAR\r" > /dev/ttyS0
该
hello in VAR
字符串应该/dev/ttyS0
由 cat 放入VAR
然后从(B):
# killall cat
从 GNOME 终端 (A) 我可以看到提示符 (
#
) 返回;最后从 GNOME 终端 (A):
# echo "$VAR"
我收到了
hello in VAR
字符串。
我尝试通过 bash 脚本以这种方式实现这一点:
#!/bin/bash
killall cat
BASHTESTS_DIR=/root/Desktop/Tips_tricks_tutorials/bash_scripting
cd $BASHTESTS_DIR
echo "before VARcat_dev_ttyS0"
VAR=$(cat /dev/ttyS0)
echo "after VARcat_dev_ttyS0"
echo -en "hello in VAR\r" > /dev/ttyS0
sleep 2
killall cat
echo "content of VAR: $VAR"
exit 0
但脚本在echo "before VARcat_dev_ttyS0"
How can I Implement what I Want or What I'mable to do with Two GNOME Terminals?之后停止
答案1
看来您正在尝试用作ttyS0
连接两个进程的方法。这不会可靠地工作,因为ttyS0
它是串行线的接口(COM1:
在 Windows 中)。
另一方面,您的问题可能缺少信息。如果您的串行端口上确实有设备,请说清楚。
我相信你正在寻找的是一根管道。在文件系统中,这看起来很像一个文件,但允许从另一侧读取写入一侧的数据。这是无处不在的运算符的幕后内容|
,例如id | nl
。
您可以使用该命令创建管道mkfifo
,或者mknod p
如果您坚持的话。
1号航站楼
mkfifo /tmp/pipe # Create the pipe
ls -l /tmp/pipe # Notice the first character is 'p'
echo hello > /tmp/pipe # Write to it
rm -f /tmp/pipe # Remove the pipe
2 号航站楼
cat /tmp/pipe # Read from the other side of the pipe
您可以像这样扩展 Terminal #2 代码。但请记住,对于管道上的每次新读取(实际上是打开/读取/关闭),您需要为其提供新数据。
read VAR </tmp/pipe # Read one line from the pipe
VAR=(cat /tmp/pipe) # Read from the pipe until EOF