
Tengo un dispositivo conectado en mi 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 $
Este es el guión
#!/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
Desde el protocolo del dispositivo veo:
1.read master version
sent: 5A 00 00 0d 0a 71
reply: A5 00+ "MASTER-FW:v1.0\r\n" + CS
Entonces tengo que enviar 5A 00 00 0d 0a 71
como datos, no como cadena, y recibiré una respuesta de datos hexadecimales. Lo hice en Windows usando la biblioteca cport, pero no sé cómo hacerlo en Debian (raspi3).
¿alguna idea?
Respuesta1
Podemos convertirlo usbArray
en una cadena de escape adecuada usando printf
:
printf ' \\x%s' "${usbArray[@]}"
Esto produce \x5A\x00\x00\x0d\x0a\x71
.
Luego pasa eso como argumento aotro printf
, para interpretarlos como códigos de escape:
printf '%b\n' "$(printf '\\x%s' "${usbArray[@]}")"
Para demostrar que tenemos el resultado correcto, inspecciónelo usando od
:
$ printf '%b\n' "$(printf '\\x%s' "${usbArray[@]}")" | od -t x1
0000000 5a 00 00 0d 0a 71 0a
0000007