Скрипт 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))

, 👍0

Обсуждение

До сих пор я обнаружил, что in_waiting возвращает 0 после запуска скрипта во второй раз. Я не могу понять, почему. Есть идеи?, @L_T


1 ответ


1

Последовательная связь всегда завершается определенным символом (обычно \n). Принимающее устройство будет накапливать входящие байты в буфере до тех пор, пока не получит этот завершающий символ.

Чтобы решить эту проблему, просто измените последнюю строку вашего цикла Arduino на Serial.println(sensor);

Также обратите внимание, что Arduino может работать быстрее, чем ваш скрипт Python, а это означает, что вы будете получать несколько значений датчика за одно считывание. Если это так, вам нужно добавить короткую задержку в цикл Arduino.

,