【问题标题】:Shell script to write and read data from serial communication用于从串行通信写入和读取数据的 Shell 脚本
【发布时间】:2015-02-27 11:19:36
【问题描述】:

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

写我正在使用:

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

要阅读,我使用的是阅读:

cat -v < /dev/ttyUSB0

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

【问题讨论】:

    标签: linux shell


    【解决方案1】:

    我希望您的 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 不起作用,将标准输入重定向到设备。

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

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

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

    【讨论】:

    • 感谢您的回复。我已经尝试过您对 od -tx1 的建议,但它没有给我任何回应。我正在发送: echo -en '\xAA\x04\xC2' | od -tx1 > /dev/ttyUSB0。你能告诉我发送的完整命令吗?谢谢
    • 你给我的代码报错:stty: invalid argument `-F'
    • 尝试从标准输入重定向
    • 你能提供我的代码吗?我想发送 0xAA,0x04,0xC2,0x90,我将得到的输出是:0xAD。提前致谢
    • 你给我的代码给出的输出是这样的:阅读 当我在终端中测试了相同的命令时,我得到“M--”,你说的是 ascii(我可以处理 M--),但现在这个“读取 ”是什么。请帮忙解码。有没有一种方法可以检查我的十六进制值是否已正确发送到串行设备。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多