Связь Arduino-Pyserial на Python 3, машина Windows: Pyserial.write(), похоже, ничего не делает

Недавно я получил в руки Arduino (или, скорее, Genuino, но общая архитектура должна быть такой же) UNO. Сейчас я использую этот Arduino для проверки того, как данные передаются с USB на последовательный разъем в Arduino.

Я уже убедился, что передача данных с Arduino на ПК возможна с помощью hTerm и PySerial. Однако всякий раз, когда я отправляю данные с Pyserial или hTerm, они не отображаются в последовательном терминале Arduino. Кроме того, я использую SoftwareSerial для настройки вторичного последовательного терминала, чтобы увидеть, что получает Arduino. (Я использую стандартный последовательный порт для отправки данных на терминал и порт SoftwareSerial для подключения к USB-последовательному разъему.)

Вот мой код на данный момент:

Сторона Python:

import serial
import time
import sys
import struct
ser = serial.Serial('COM3', 9600, timeout=0)
time.sleep(10)
while 1:
    print(ser.write(struct.pack('>B', 0)))
    time.sleep(2)
    print(1)
    sys.stdout.flush()

Сторона Arduino выглядит так и по сути является примером по умолчанию: https://www.arduino.cc/en/Tutorial/SoftwareSerialExample

#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
void setup() {
  // поместите сюда ваш код настройки для однократного запуска:
  if (Serial) {
    Serial.end();
  }
  Serial.begin(9600);
  while (!Serial) {
    ;
  }

  Serial.println("Godnight moon!");

  mySerial.begin(9600);
  mySerial.println("Hello, world?");
}

void loop() {
  // поместите сюда свой основной код для многократного выполнения:
  mySerial.listen();
  if (mySerial.available() > 0) {
    Serial.println("Hello User");
    Serial.println(mySerial.read());
  }
}

Терминал никогда не печатает "Hello User". Кроме того, никакие другие сигналы не печатаются. Удалив условие if, я получаю кучу "Hello User" и "-1" в последовательном мониторе Arduino IDE.

Относительно моей настройки:

У меня есть преобразователь USB в последовательный порт, который подключен как "COM3". С другой стороны, у меня есть Arduino UNO, который подключен через USB к тому же компьютеру. Контакт TX преобразователя подключен к контакту RX Arduino и наоборот. Кроме того, заземление подключено к заземлению. Кроме того, я использую блокнот Jupyter/IPython для запуска моего скрипта Python и стандартную среду разработки Arduino для компиляции программ для моего Arduino. В случае, если я получил данные от Arduino, я использовал скрипт, указанный в предоставленном URL, который очень похож на тот, который я уже показываю здесь. Кроме того, ser.write() заменен на ser.read(1), так что он считывает один байт за раз. Моя система - Windows 7 (64 бит).

Редактировать: Вот установленное соединение между hTerm (последовательным терминалом) и скриптом Python при использовании com0com в качестве эмулятора порта. Успешная связь между скриптом Python и hTerm

, 👍1


2 ответа


1

Как вы думаете, что должно получиться?

Я не эксперт по Python, но вы, похоже, используете struct pack, который, как я думаю, добавляет несколько байтов к данным для генерации 4-байтового слова. Вы используете NULL, 0 для упаковки структуры. Когда Serial.println() встречает NULL, он предполагает, что это конец строки. Так что вы, похоже, печатаете строку из нулевых байтов.

О, и Serial.read() считывает только один байт данных, так что с этим тоже есть проблема. Я подозреваю, что у вызова записи похожая проблема, обычно нужно указывать параметр размера, потому что это двоичные данные.

Имеет ли это смысл?

,

0

Когда вы запускаете свой код Python, вы видите то, что отправляете на экран?

Я думаю, вам нужно вызвать ser.open().

,