Скрипт Python не читает серийный номер, если teensy не перезагружен
Я хочу отправить некоторые данные аналогового датчика с Teensy 3.2 на Mac, на котором запущен скрипт Python (я использую обычный модуль pyserial и отправляю данные с помощью Serial.print() в скетче Arduino). Я использую Teensy, но думаю, то же самое можно сказать и о Arduino Uno. Подросток правильно отправляет данные на последовательный порт, как я вижу, используя последовательный монитор. Однако только при первом запуске скрипта python данные обрабатываются самим скриптом, если я останавливаю скрипт, то в последовательном буфере данные не считываются. Чтобы скрипт заработал, мне обязательно нужно перезапустить Arduino IDE, а затем загрузить скетч.
Действительно, когда я запускаю скрипт во второй раз (после его остановки), я вижу, что функция pyserial serial_port.inWaiting() не дает никаких данных.
if (serial_port.inWaiting() > 0):
print("serial_port.inWaiting() > 0") # ничего не печатает при втором запуске скрипта
Я проверил, что при втором запуске сценария последовательное соединение открыто (используя self.serial_port.isOpen())
Что мешает скрипту Python получить серийные данные во второй раз? Почему serial_port.inWaiting() не видит, что во входном буфере есть данные?
В код скетча Arduino я добавил строку while(!Serial); в недействительной настройке()
EDIT: я публикую код. Это код arduino (я тестирую на teensy, поэтому начальное рукопожатие не требуется, так как teensy не перезагрузится)
int sensor = 0;
void setup() {
Serial.begin(115200);
while(!Serial);
}
void loop() {
sensor = analogRead(0);
Serial.print(sensor);
}
А это код Python:
#!/usr/bin/env python3
import serial
import time
import signal
import sys
def keyboard_interrupt(signal, frame):
serial_port.close()
time.sleep(2)
exit(0)
serial_port = serial.Serial("/dev/tty.usbmodem1225061", 115200)
signal.signal(signal.SIGINT, keyboard_interrupt)
signal.signal(signal.SIGTERM, keyboard_interrupt)
if serial_port.isOpen():
print(serial_port.name + ' is open...')
while True:
if (serial_port.inWaiting() > 0):
sensor = serial_port.read().decode("utf-8")
print('sensor: "{}" '.format(sensor))
@L_T, 👍0
Обсуждение1 ответ
Последовательная связь всегда завершается определенным символом (обычно \n
). Принимающее устройство будет накапливать входящие байты в буфере до тех пор, пока не получит этот завершающий символ.
Чтобы решить эту проблему, просто измените последнюю строку вашего цикла Arduino на Serial.println(sensor);
Также обратите внимание, что Arduino может работать быстрее, чем ваш скрипт Python, а это означает, что вы будете получать несколько значений датчика за одно считывание. Если это так, вам нужно добавить короткую задержку в цикл Arduino.
- Вложенный цикл
- В чем разница между выводами SCLK и CLK?
- Как прервать соединение HM10 Bluetooth?
- C++ Undefined reference to 'Class:Function()'
- Быстрее TimerOne с Teensy 4.0 (600 МГц)
- Последовательная связь между Teensy и Teensy через USB-разъем
- Какой аналог PORTx для Teensy (4.0)?
- 5 В MCP2515 в 3.3V Teensy. Как уменьшить напряжение MISO
До сих пор я обнаружил, что in_waiting возвращает 0 после запуска скрипта во второй раз. Я не могу понять, почему. Есть идеи?, @L_T