Добрый вечер! Прошу помощи в обработке информации, приходящий на последовательный(серийный) порт малинки. Подключил ардуину к малине по 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} приходит в таком виде: После преобразования в строку Если намеренно допускаю ошибку, то должен вернуться пакет вида PHP: {"error":2} А в порте я получаю А после преобразования в строку получаю: Все перепробовал, никак от переноса строк \r\n не могу избавиться. Помогите привести в нормальный вид, что бы гетом отправить на сарвер
Кусок кода отправлю, т.к. исходник на другом компе. Но в сериал тоже самое видно, что и в консоле Код (C++): char buffer[200]; StaticJsonDocument<200> docWrite; docWrite[(String(pin[i])] = value; serializeJsonPretty(docWrite, buffer); Serial.print(buffer);
В общем пришлось поправить библиотеку ArduinoJson убрал переносы строк, а пробелы так и не удалось убрать. Если кто то сможет поправить библиотеку PrettyJsonSerialize.hpp буду очень признателен, что бы не было ни пробелов, ни переносов строк
@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)
Спасибо за помощь, я поправил библиотеку, нашел еще где пробелы вставляются, все изменения закоментировал, теперь работает как надо
У меня есть еще один вопрос. Если перезагружаю ардуино, запускаю скрипт на малинке, то в консоле малинки тишина, я останавливаю скрипт, запускаю снова и все работает. Подскажите, как сделать автоматом, что если сериал не эвелибал, то перезапустить подключение в питоне? код я опубликовал выше
Читай список разделов в /dev/ модулем os , (почитай про него) там будет возвращён список . Его проверяешь на наличие ttyUSB0. Я до такого пока что догодался.
нет, дело не в том, что я перевоткну ардуину и адрес tty сменится, если перезагрузить, то адрес остается, или малинку перезагрузить, проблема, что с первого раза не всегда порт читается, а если скрипт, закрыть открыть то все пойдет
У меня никогда с ttyUSB0 не менялось. Можно просить Ардуино отвечать , если ответа нет то переинициализировать порт.