【问题标题】:how to send asci and non asci character over serial port from bash (script)如何从bash(脚本)通过串口发送ascii和非ascii字符
【发布时间】:2020-11-12 10:08:51
【问题描述】:

我尝试发送一些十六进制值(与 asci 字符混合)。

我喜欢拥有的东西: send_string = {0x2d, 0x2e, 0x01,..., "你好"}

我能得到什么: send_string="0x2d0x2e0x10...你好"

脚本:

#!/bin/bash

#USB device path
USBDEV=/dev/ttyUSB0


#disable DTR
stty -F $USBDEV -hupcl
#set baud
stty -F $USBDEV 9600

pattern1=0x2d
pattern2=0x2e
adr=0x01
cmd=0x21

nl=0x0a
end=0x00

txt1="Hallo"
txt2="Bye"

string=$(echo ${pattern1}${pattern2}${adr}${cmd}"test"${nl}"haha"${end})
#string=$(echo \0x2e\0x2d\0x01\0x21"test"\0x0a"haha"\0x00)

echo $string
echo $string >> $USBDEV

exit 0

输出

0x2d0x2e0x010x21test0x0ahaha0x00

问题

vars pattern1, pattern2, adr, ... 的十六进制值应作为非 ASCI 字符存储在字符串中。

如果字符串按照我的需要准备,输出必须有非 asci 字符。但它没有。

我尝试了一些方法,但都只是感到困惑。

【问题讨论】:

    标签: linux bash serial-port hex non-ascii-characters


    【解决方案1】:

    您可以使用$'' 特殊引号。

    pattern1=$'\x2d'
    

    不过,这不适用于\x00。我知道的唯一可能的打印方法是

    printf '\x00'
    

    但您不能将其分配给变量。您需要切换到更高级的脚本语言才能做到这一点。例如,在 Perl 中

    $end = "\x00";
    

    工作正常。

    【讨论】:

    • 感谢您的提示!这让我有点前进。 0x00 似乎不是唯一不起作用的。 $'\x0a' (\n) 没有打印出来,也没有被 ttyUSB0 上的设备识别。此外,似乎pattern1pattern2adrcmd 已被 USB0 上的设备正确识别,但输出为:-.!test haha 我将使用您的提示和新的输出更新我的问题
    • 您需要对变量进行双引号以保持它们的完整性。使用printf 而不是echo 也更安全。
    【解决方案2】:

    我建议直接将printf 用于二进制数据;您不能在 shell 变量中存储任意二进制数据(即空字节)。

    #!/bin/bash
    
    #USB device path
    USBDEV=/dev/ttyUSB0
    
    
    #disable DTR
    stty -F $USBDEV -hupcl
    #set baud
    stty -F $USBDEV 9600
    
    printf '.-\001!%s\n%s\000' "$txt1" "$txt2" > "$USBDEV"
    
    exit 0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-12
      • 2010-12-30
      • 1970-01-01
      • 2012-01-21
      • 2016-01-04
      相关资源
      最近更新 更多