Как читать tty до EOT или другого символа в bash?

Я знаю, что ответ OP был решен, однако для тех, кто запускает CentOS из контейнера докеров, в котором отсутствуют как adduser , так и useradd , решение состоит в следующем. установить тень -утилиты(под корень очевидно):

yum install shadow-utils
0
24.02.2020, 03:29
1 ответ

Ну, я понял. Чтобы получить желаемое поведение (команда -> ответ между uart и bash )я написал что-то вроде этого:

Сторона микроконтроллера:

void UART_help_cmd_handler() 
{
    // this delay prevents buffer overflow on linux side if bash is too slow
    // see "However" section below
    __delay_ms(100); 


    printf("Available commands:\n");
    printf("search - starts search and returns device addresses\n");
    printf("help - prints this help\n");

    // second newline to mark end of transmission
    // that cat command can read
    printf("\n");  
}

**Сторона Баша**

#!/bin/bash

# send-command-read-response.sh

# send command 
# (in my case microcontroller needs 0x02 byte to find start of command 
$ and 0x03 byte for end of command

echo -ne "\x02${1}\x03" > /dev/ttyUSB0;

# read lines one by one until "" (empty line)
file="/dev/ttyUSB0"
terminator=""
while IFS= read line
do
    if [ "$line" = "$terminator" ]; then
        break
    else
        echo "$line"
    fi
done <"$file"

Однако:

  • когда ответ микроконтроллера быстрый -иногда bash не может выполнить команду "read" достаточно быстро, чтобы опустошить аппаратный буфер uart до его заполнения, поэтому мне пришлось добавить грязную задержку
  • возможно, проблема "быстрого отклика микроконтроллера" могла бы быть решена, если бы я мог использовать аппаратное управление потоком данных, но я не уверен

  • Я не могу найти способ как-то обрабатывать тайм-аут в bash (, если микроконтроллер по каким-то причинам не отвечает ).

Наконец

  • как @mosvy написал в комментарии к моему вопросу -bash не подходит для последовательной связи
  • Я думаю, что в bash можно поддерживать двустороннюю последовательную связь, если возможно аппаратное управление потоком. Тайм-аут можно установить с помощью stty, но я думаю, что для этого требуется слишком много усилий.
  • Я написал простое приложение, оно может обрабатывать тайм-аут и другие ошибки.

Я старался избегать приложений C/C++, потому что мне нужно заменить сценарий bash в каком-то большом веб-приложении, которое принимает сценарии bash, но дополнительные двоичные файлы «не приветствуются».

0
28.04.2021, 23:22

Теги

Похожие вопросы