Чтение последовательного порта

Тема в разделе "Raspberry Pi", создана пользователем user999, 10 апр 2020.

  1. user999

    user999 Гик

    Добрый вечер!
    Прошу помощи в обработке информации, приходящий на последовательный(серийный) порт малинки.

    Подключил ардуину к малине по USB. Написал скрипт на питоне.
    Скрипт обращается гет-запросом на сервер, получает информацию и передает ее в серийный порт.
    Ардуино читает информацию, исполняет команды и передает обратную информацию в серийный порт. Питон, отдает ее на сервер так же гет-запросом.

    Проблема возникла в том, что json пакет от ардуино приходит с символами переноса строки. Я их никак не могу убрать, что бы этот пакет отправить в одну строчку в гет-запрос
    Код (Python):
    #!/usr/bin/python3
    # coding: utf-8
    import serial
    import requests

    while True:
        start = requests.get('http://localhost/tempdata.php', params = {'data':''})     #запросили у сервера данные
        msgwrite = bytes(start.text, "utf-8")                                            #перевели ответ сервера в байты
        ser=serial.Serial("/dev/ttyUSB1",9600)                                          #открыли порт
        ser.baudrate=9600                                                                #задали скорость передачи данных
        ser.write(msgwrite)                                                                #отправили в  порт ответ сервера
        print(msgwrite)
        msgread = ser.readline()                                                        #прочитали данные из порта
        msgstr = bytes.decode(msgread, encoding='utf-8')                                #перевели байты в строку
        answer = requests.get('http://localhost/tempdata.php', params = {'data':msgstr})#отправили ответ от устройства на сервер
        print(msgread)
        print(msgstr)
        print(answer.url)
    Пакет json {22:1,24:0,23:0,25:0} приходит в таком виде:
    [​IMG]
    После преобразования в строку
    [​IMG]
    Если намеренно допускаю ошибку, то должен вернуться пакет вида
    PHP:
    {"error":2}
    А в порте я получаю
    [​IMG]

    А после преобразования в строку получаю:
    [​IMG]

    Все перепробовал, никак от переноса строк \r\n не могу избавиться.
    Помогите привести в нормальный вид, что бы гетом отправить на сарвер
     
    Последнее редактирование: 10 апр 2020
  2. Daniil

    Daniil Гуру

    А как вы отправляете строку?
    Картинки не прогрузились
     
  3. user999

    user999 Гик

    Кусок кода отправлю, т.к. исходник на другом компе.
    Но в сериал тоже самое видно, что и в консоле
    Код (C++):
    char buffer[200];
    StaticJsonDocument<200> docWrite;

    docWrite[(String(pin[i])] = value;
    serializeJsonPretty(docWrite, buffer);
    Serial.print(buffer);
     
  4. user999

    user999 Гик

    В общем пришлось поправить библиотеку ArduinoJson убрал переносы строк, а пробелы так и не удалось убрать.
    Если кто то сможет поправить библиотеку PrettyJsonSerialize.hpp буду очень признателен, что бы не было ни пробелов, ни переносов строк
     
  5. Daniil

    Daniil Гуру

    Мне кажется, что это самое логичное решение)
     
  6. ZAZ-965

    ZAZ-965 Гуру

    @user999, питон практически не знаю, но знаю, что в нем до хрена возможностей работы со строками. Например, splitlines удалит все переносы, вернет правда уже список и его опять придется слепить в строку. Онлайн тест https://onlinegdb.com/BkPukJ1dU
    Код (Python):
    #!/usr/bin/python3
    #coding: utf-8

    S = '''{
    22:1,\r\n
    24:0,\r\n
    23:0,\r\n
    25:0\r\n
    }'''


    print (S)

    L=S.splitlines()
    print (L)

    S=''.join(L)
    print(S)
     
  7. user999

    user999 Гик

    Спасибо за помощь, я поправил библиотеку, нашел еще где пробелы вставляются, все изменения закоментировал, теперь работает как надо
     
  8. user999

    user999 Гик

    У меня есть еще один вопрос. Если перезагружаю ардуино, запускаю скрипт на малинке, то в консоле малинки тишина, я останавливаю скрипт, запускаю снова и все работает.
    Подскажите, как сделать автоматом, что если сериал не эвелибал, то перезапустить подключение в питоне? код я опубликовал выше
     
  9. Un_ka

    Un_ka Гуру

    Читай список разделов в /dev/ модулем os , (почитай про него) там будет возвращён список . Его проверяешь на наличие ttyUSB0.
    Я до такого пока что догодался.
     
  10. user999

    user999 Гик

    нет, дело не в том, что я перевоткну ардуину и адрес tty сменится, если перезагрузить, то адрес остается, или малинку перезагрузить, проблема, что с первого раза не всегда порт читается, а если скрипт, закрыть открыть то все пойдет
     
  11. Un_ka

    Un_ka Гуру

    У меня никогда с ttyUSB0 не менялось. Можно просить Ардуино отвечать , если ответа нет то переинициализировать порт.
     
  12. user999

    user999 Гик

    а как это сделать? сколько ждать?
     
  13. user999

    user999 Гик