Shell脚本用于从串行通信中写入和读取数据

时间:2015-02-27 11:19:37

标签: linux shell

我正在创建一个简单的shell脚本来向串行设备写入和读取数据。 我在终端使用这些命令并且它们正确响应:

写我正在使用:

echo -en '\xAA\x04\xC2' > /dev/ttyUSB0

要阅读我正在使用阅读:

cat -v < /dev/ttyUSB0

但是当我在shell脚本中包含它时,它没有响应。我需要帮助。 另外我想知道当我发送写命令时,它应该给我输出十六进制格式,但它给我输出这种格式M - * ^ NM- ^ H 还需要帮助。

1 个答案:

答案 0 :(得分:3)

我希望您的cat语句阻止等待文件结束。它可以将您的输入tty视为标准终端设备,在这种情况下,它将需要文件结束字符来终止输入(例如,Control-D),并且它可以对输入和输出应用其他处理。您最好熟悉stty命令及其选项(请参阅stty man page)。尝试执行stty -F /dev/ttyUSB0以查看已设置的选项。

读取输入的最简单方法可能是一次读取一个字符。您可以尝试使用以下脚本。这将从输入一次读取一个字符,直到输入“q”。

stty -F /dev/ttyUSB0 raw
stty -F /dev/ttyUSB0 -echo
while read -rs -n 1 c && [[ $c != 'q' ]]
do
        echo "read <$c>" # Replace this with code to handle the characters read
done < /dev/ttyUSB0

如果-F不起作用,请将stdin重定向到设备。

对于您的输出问题,我认为它正在工作,但您看到字符显示为字符而不是十六进制代码。要查看十六进制代码(仅用于验证测试 - 我认为您不想将十六进制代码发送到终端),请尝试:

echo -en '\xAA\x04\xC2' | od -tx1

您可能还希望在输出时设置原始模式,以避免驱动程序更改输出字符。