Связь 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 в качестве эмулятора порта.
@user25642, 👍1
2 ответа
Как вы думаете, что должно получиться?
Я не эксперт по Python, но вы, похоже, используете struct pack, который, как я думаю, добавляет несколько байтов к данным для генерации 4-байтового слова. Вы используете NULL, 0 для упаковки структуры. Когда Serial.println() встречает NULL, он предполагает, что это конец строки. Так что вы, похоже, печатаете строку из нулевых байтов.
О, и Serial.read() считывает только один байт данных, так что с этим тоже есть проблема. Я подозреваю, что у вызова записи похожая проблема, обычно нужно указывать параметр размера, потому что это двоичные данные.
Имеет ли это смысл?
Когда вы запускаете свой код Python, вы видите то, что отправляете на экран?
Я думаю, вам нужно вызвать ser.open().
- Не удается связаться с ардуино с помощью python (Windows)
- AT-команда не отвечает на последовательный монитор
- Как отправить команду AT на sim800l с помощью SoftwareSerial
- Как остановить SoftwareSerial от получения данных и повторно включить его в какой-то другой момент?
- Последовательная связь Arduino с Python: отправка массива
- Ардуино для чтения с преобразователя RS232 в последовательный модуль TTL
- Построение графика на Python с использованием Tkinter Canvas
- Не нашел датчик отпечатков пальцев :( Arduino Mega 2560 Adafruit Fingerprint Sensor