尝试通过 cat 方法将动态输入数据放入变量中

尝试通过 cat 方法将动态输入数据放入变量中

我正在尝试编写一个 bash 脚本,该脚本应该能够从 ttyS0 收集数据并放入变量中。

我需要与串行线上的设备进行通信,该模块能够接收 AT 命令,我可以使用 echo > ttyS0 发送这些命令并在变量中捕获相关答案。可以在不将收到的答案存储在变量中(即 cat /dev/ttyS0 & )的情况下执行此操作,但如果我尝试将此数据放入变量中(即 VAR=$(cat /dev/ttyS0 &) ,它不会不起作用(在VAR中我在模块的答案之后找不到任何东西)。

我可以通过 gnome 终端(我正在使用 Ubuntu 发行版)“手动”执行以下操作:

  1. 从我称为 (A) 的 GNOME 终端,我运行(以 root 身份)

    # VAR=$(cat /dev/ttyS0) 
    

    此命令不会返回 root 提示符#,因为可能cat /dev/ttyS0正在运行并等待输入。

  2. 从我称为 (B) 的另一个 GNOME 终端,我运行

    # echo -en "hello in VAR\r" > /dev/ttyS0 
    

    hello in VAR字符串应该/dev/ttyS0由 cat 放入VAR

  3. 然后从(B):

    # killall cat
    

    从 GNOME 终端 (A) 我可以看到提示符 ( #) 返回;

  4. 最后从 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

相关内容