отправка 4 байтов HEX по командной строке Linux - PullRequest
0 голосов
/ 14 марта 2019

У меня есть команда

for i in {1..9} ; do cansend slcan0 "7e0#02090"$i"0000000000"

Как я могу отправить ту же команду, но за $ я вместо этого отправляю 4 байта HEX.Вроде как грубая сила?

Ответы [ 2 ]

0 голосов
/ 14 марта 2019

Вы могли бы использовать расширение скобки для генерации списка всех 4-байтовых шестнадцатеричных кодовых последовательностей (00000000, 00000001, 00000002,…, FFFFFFFF).

{{0..9},{A..F}} создает список 0 1 2 … F.
{{0..9},{A..F}}{{0..9},{A..F}} создает список 00 0 02 … FF.
И т. Д.
Для 4 байтов вы должны повторять {{0..9},{A..F}} 8 раз, как каждый байтимеет две шестнадцатеричные цифры.

for i in {{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}{{0..9},{A..F}}; do
   cansend slcan0 "7e0#02090${i}0000000000"
done

Хотя этот подход может быть жизнеспособным для двух или трех цифр, я настоятельно рекомендую не использовать его в этом случае.Вышеупомянутый скрипт не читается и очень медленный.

Следующая лучшая вещь в bash будет…

bytes=4
((max=2**(bytes*8)-1))
for ((i=0; i<max; i++)); do
   printf -v hex %08x "$i"
   cansend slcan0 "7e0#02090${hex}0000000000"
done

… но имейте в виду, что это будет величины медленнее, чем отправка последовательностей из (например) программы на Python, которой не нужно запускать новый процесс каждый раз, когда вы хотите что-то отправить в slccan0.

0 голосов
/ 14 марта 2019

Вы можете использовать утилиту printf и %04x в качестве спецификатора формата (0 pad, 4 символов, форматировать как он x):

for i in {1..9}; do
  command=$(printf "7e0#02090%04x0000000000" $i)
  echo cansend slcan0 "$command"  # remove `echo` here :)
done

распечатывает

cansend slcan0 7e0#0209000010000000000
cansend slcan0 7e0#0209000020000000000
cansend slcan0 7e0#0209000030000000000
cansend slcan0 7e0#0209000040000000000
cansend slcan0 7e0#0209000050000000000
cansend slcan0 7e0#0209000060000000000
cansend slcan0 7e0#0209000070000000000
cansend slcan0 7e0#0209000080000000000
cansend slcan0 7e0#0209000090000000000
...