Не удается получить данные из кода Python
Я хочу отправить 4 числа с плавающей точкой из кода Python на Arduino; Я пытался отправить его по последовательному каналу, и у меня возникли некоторые проблемы.
вот мой код на Python:
import time
import serial
import struct
data = serial.Serial('COM6', 9600, timeout=1)
time.sleep(1)
while True:
a = str(47.256*1000)
data.write(a.encode())
Вот мой код Arduino :
String msg;
void setup()
{
Serial.begin(9600);
pinMode(13, OUTPUT);
}
void loop()
{
if (Serial.available()) {
msg = Serial.readString();
}
if (msg.toInt()>30){
digitalWrite(13, 1);
}
}
конец кода
Заранее спасибо.
Моя проблема в том, что он не работает (индикатор не включается, когда я отправляю данные из кода Python в цикле while; когда я удаляю время и заставляю его отправлять данные 1 раз, он работает (индикатор включается). Есть какие-нибудь идеи, почему это могло произойти?
@marwan barky, 👍1
Обсуждение1 ответ
Было бы проще, если бы вы использовали библиотеки, совместимые с Arduino <--> и Python, чтобы обеспечить надежную и надежную связь между ними. Примером таких библиотек могут быть pySerialTransfer и SerialTransfer.h.
pySerialTransfer устанавливается с помощью pip и совместим с несколькими платформами. SerialTransfer.h работает на платформе Arduino и может быть установлен через менеджер библиотек Arduino IDE.
Обе эти библиотеки обладают высокоэффективными и надежными алгоритмами упаковки/синтаксического анализа с простыми в использовании API.
Пример скрипта на Python:
import time
from pySerialTransfer import pySerialTransfer as txfer
if __name__ == '__main__':
try:
link = txfer.SerialTransfer('COM17')
link.open()
time.sleep(2) # allow some time for the Arduino to completely reset
while True:
send_size = 0
###################################################################
# Send a list
###################################################################
list_ = [1, 3]
list_size = link.tx_obj(list_)
send_size += list_size
###################################################################
# Send a string
###################################################################
str_ = 'hello'
str_size = link.tx_obj(str_, send_size) - send_size
send_size += str_size
###################################################################
# Send a float
###################################################################
float_ = 5.234
float_size = link.tx_obj(float_, send_size) - send_size
send_size += float_size
###################################################################
# Transmit all the data to send in a single packet
###################################################################
link.send(send_size)
###################################################################
# Wait for a response and report any errors while receiving packets
###################################################################
while not link.available():
if link.status < 0:
if link.status == -1:
print('ERROR: CRC_ERROR')
elif link.status == -2:
print('ERROR: PAYLOAD_ERROR')
elif link.status == -3:
print('ERROR: STOP_BYTE_ERROR')
###################################################################
# Parse response list
###################################################################
rec_list_ = link.rx_obj(obj_type=type(list_),
obj_byte_size=list_size,
list_format='i')
###################################################################
# Parse response string
###################################################################
rec_str_ = link.rx_obj(obj_type=type(str_),
obj_byte_size=str_size,
start_pos=list_size)
###################################################################
# Parse response float
###################################################################
rec_float_ = link.rx_obj(obj_type=type(float_),
obj_byte_size=float_size,
start_pos=(list_size + str_size))
###################################################################
# Display the received data
###################################################################
print('SENT: {} {} {}'.format(list_, str_, float_))
print('RCVD: {} {} {}'.format(rec_list_, rec_str_, rec_float_))
print(' ')
except KeyboardInterrupt:
link.close()
except:
import traceback
traceback.print_exc()
link.close()
Пример скетча Arduino:
#include "SerialTransfer.h"
SerialTransfer myTransfer;
void setup()
{
Serial.begin(115200);
myTransfer.begin(Serial);
}
void loop()
{
if(myTransfer.available())
{
// send all received data back to Python
for(uint16_t i=0; i < myTransfer.bytesRead; i++)
myTransfer.txBuff[i] = myTransfer.rxBuff[i];
myTransfer.sendData(myTransfer.bytesRead);
}
}
Обратите внимание, что с помощью этих библиотек вы можете отправлять не только отдельные символы. С помощью библиотек можно передавать плавающие точки, int, байты, массивы и даже структуры (или любую комбинацию подобных) в вашей программе! Смотрите примеры в SerialTransfer.h для получения дополнительной информации
Для изучения теории надежной последовательной связи ознакомьтесь с учебными пособиями "Основы последовательного ввода" и "Расширенныйпоследовательный ввод".
- Отправка числа с плавающей запятой из python в arduino
- Float печатается только 2 десятичных знака после запятой
- Не удается связаться с ардуино с помощью python (Windows)
- Последовательная связь Arduino с Python: отправка массива
- Построение графика на Python с использованием Tkinter Canvas
- Как отправить целое число через pyserial с Python на Arduino и получить тот же результат?
- Сброс последовательного порта Arduino в последовательном мониторе и Python
- Serial Comm. проблема синхронизации между Arduino и Pyserial
https://www.instructables.com/id/Interface-Python-and-Arduino-with-pySerial/, @Filip Franik
"Я не могу этого сделать" - не очень хорошее описание проблемы. В чем именно заключается ваша проблема при написании кода? Что именно вы пытались сделать? Пожалуйста, добавьте эту информацию в вопрос, отредактировав его, @chrisl
Когда вы говорите, что это не работает, что вы имеете в виду? Что именно происходит? Что находится в вашем методе `init ()"? Вы настраиваете сериал? Вы настраиваете светодиод для вывода? Пожалуйста, отправьте полный код., @GMc
Этот цикл while в коде python будет отправлять это число снова и снова очень быстро. Я задаюсь вопросом, не следует ли вам немного притормозить. Поместите вызов сна в этот цикл while., @Delta_G