Python - коммуникация Arduino не надежна
Я пытаюсь установить базовую связь между python и моим arduino. Мне удалось получить сообщение, отправленное на arduino и отправленное обратно, но код, который достигает этой задачи, не дает согласованных результатов. Я запускаю python 3.5 с pyserial 3.3.
Мой код Arduino:
String incoming;
void setup() {
Serial.begin(9600); // opens serial port, sets data rate to 9600 bps
}
void loop() {
// send data only when you receive data:
if (Serial.available() > 0) {
// read the incoming byte:
incoming = Serial.readStringUntil('\n');
// say what you got:
Serial.print("I received: ");
Serial.println(incoming);
}
}
Мой код Python
import serial
arduinoSerialData = serial.Serial("COM5",9600,timeout=1)
print("Initial in waiting:")
print(arduinoSerialData.in_waiting)
print("Initial out waiting:")
print(arduinoSerialData.out_waiting)
while (arduinoSerialData.in_waiting>0):
garbage = arduinoSerialData.readline()
print(garbage)
nummessages =0
while (nummessages<5):
if (arduinoSerialData.in_waiting>0):
myData = arduinoSerialData.readline()
myData = myData.decode('utf-8')
myData = myData.strip()
print("The Arduino says:")
print(myData)
nummessages=nummessages+1
elif(arduinoSerialData.out_waiting>0):
pass
else:
arduinoSerialData.write(b'Hello Arduino!\n')
while (arduinoSerialData.in_waiting>0):
garbage = arduinoSerialData.readline()
print(garbage)
print("In Waiting: ")
print(arduinoSerialData.in_waiting)
print("Out Waiting: ")
print(arduinoSerialData.out_waiting)
arduinoSerialData.close()
Эти заявления печати в основном являются моей неудачной попыткой диагностировать проблему. Петли «мусор» были моей попыткой убедиться, что условия были как можно более идентичными при запуске кода python. Если я запустил программу arduino, а затем позвоню в эту программу python из моей командной строки, я получаю несогласованные результаты. Иногда мой первый вызов python «работает», а затем другие не будут, когда-то он работает несколько раз подряд, и этот вывод выводит первый вывод, в котором говорится: «Arduino Says: I» будет иметь различное количество " I Received: Hello Arduino "сообщение, которое должен был отправить ардуино. Любые идеи, которые могли бы вызвать это отсутствие согласованности? Если я сначала попытаюсь запустить код python, arduino даже не может запуститься.
1 ответ
Если другие люди столкнутся с подобными проблемами, я выложу то, что я нашел сегодня.
- Непоследовательный вывод был вызван тем, что при открытии последовательного соединения с python он сбрасывает Arduino, и поэтому python может отправлять сигналы без завершения работы arduino своей функции setup (). Если я поставлю задержку на 1 секунду на стороне python, несогласованность прекратится, и я больше не буду запускать ошибки байта. Я ищу альтернативные способы предотвращения этого сброса, так как временная задержка для меня является нарушителем транзакций.
UPDATE: Замена
arduinoSerialData("COM5",9600,timeout=1)
с
arduinoSerialData = serial.Serial()
arduinoSerialData.port = "COM5"
arduinoSerialData.baudrate = 9600
arduinoSerialData.timeout = 1
arduinoSerialData.setDTR(False)
#arduinoSerialData.setRTS(False)
arduinoSerialData.open()
, похоже, обходит сброс. Я включил функции setDTR и SetRTS, потому что, хотя setDTR работает для DUE, кажется, что некоторым другим платам Arduino требуется setRTS.
- Функция decode () имеет аргумент ключевого слова, называемый ошибками, который может быть установлен как «игнорировать», если вы хотите, чтобы код просто игнорировал вещи, которые не могут быть интерпретированы в желаемом формате. Только с этой настройкой ключевого слова я никогда не получал ошибок, но результат был несогласован из-за сброса.