데비안의 직렬 포트에 16진수 바이트를 보내는 방법은 무엇입니까?

데비안의 직렬 포트에 16진수 바이트를 보내는 방법은 무엇입니까?

내 raspi3에 장치가 연결되어 있습니다

pi@raspberrypi:/home $ sudo bash main.sh
%s\t%s\n 0 Bus 001 Device 004: ID 1a86:7523 QinHeng Electronics HL-340 USB-Serial adapter
%s\t%s\n 1 Bus 001 Device 005: ID 1a2c:0e24 China Resource Semico Co., Ltd
%s\t%s\n 2 Bus 001 Device 006: ID 0424:7800 Standard Microsystems Corp.
%s\t%s\n 3 Bus 001 Device 003: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
%s\t%s\n 4 Bus 001 Device 002: ID 0424:2514 Standard Microsystems Corp. USB 2.0 Hub
%s\t%s\n 5 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

Target device:

%s\t%s\n 1 Bus 001 Device 005: ID 1a2c:0e24 China Resource Semico Co., Ltd
pi@raspberrypi:/home $

이게 스크립트야

#!/bin/bash

usbArray=()
while IFS= read -r line; do
    usbArray+=( "$line" )
done < <( lsusb )


for i in "${!usbArray[@]}"; do 

  echo "%s\t%s\n" "$i" "${usbArray[$i]}"

done

echo ""
echo "Target device:"
echo ""

for i in "${!usbArray[@]}"; do 

  if [[ ${usbArray[$i]} == *"China Resource Semico"* ]]; then
    echo "%s\t%s\n" "$i" "${usbArray[$i]}"
  fi

done

장치 프로토콜에서 다음을 볼 수 있습니다.

1.read master version 
sent: 5A 00 00 0d 0a 71
reply: A5 00+ "MASTER-FW:v1.0\r\n" + CS

따라서 문자열이 아닌 데이터로 보내야 하며 5A 00 00 0d 0a 71이에 대한 응답으로 16진수 데이터를 받게 됩니다. cport 라이브러리를 사용하여 Windows에서 이 작업을 수행했지만 debian(raspi3)에서는 이 작업을 수행하는 방법을 모르겠습니다.

어떤 아이디어가 있나요?

답변1

usbArray다음을 사용하여 적절한 이스케이프 문자열로 변환할 수 있습니다 printf.

printf ' \\x%s' "${usbArray[@]}"

그러면 \x5A\x00\x00\x0d\x0a\x71.

그런 다음 매개변수로 전달합니다.다른 printf, 이를 이스케이프 코드로 해석합니다.

printf '%b\n' "$(printf '\\x%s' "${usbArray[@]}")"

올바른 출력이 있는지 확인하려면 다음 명령을 사용하여 확인하십시오 od.

$ printf '%b\n' "$(printf '\\x%s' "${usbArray[@]}")" | od -t x1
0000000 5a 00 00 0d 0a 71 0a
0000007

관련 정보