我正在创建一个简单的shell脚本来向串行设备写入和读取数据。 我在终端使用这些命令并且它们正确响应:
写我正在使用:
echo -en '\xAA\x04\xC2' > /dev/ttyUSB0
要阅读我正在使用阅读:
cat -v < /dev/ttyUSB0
但是当我在shell脚本中包含它时,它没有响应。我需要帮助。 另外我想知道当我发送写命令时,它应该给我输出十六进制格式,但它给我输出这种格式M - * ^ NM- ^ H 还需要帮助。
答案 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
您可能还希望在输出时设置原始模式,以避免驱动程序更改输出字符。