Не удается получить данные из кода 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 раз, он работает (индикатор включается). Есть какие-нибудь идеи, почему это могло произойти?

, 👍1

Обсуждение

https://www.instructables.com/id/Interface-Python-and-Arduino-with-pySerial/, @Filip Franik

"Я не могу этого сделать" - не очень хорошее описание проблемы. В чем именно заключается ваша проблема при написании кода? Что именно вы пытались сделать? Пожалуйста, добавьте эту информацию в вопрос, отредактировав его, @chrisl

Когда вы говорите, что это не работает, что вы имеете в виду? Что именно происходит? Что находится в вашем методе `init ()"? Вы настраиваете сериал? Вы настраиваете светодиод для вывода? Пожалуйста, отправьте полный код., @GMc

Этот цикл while в коде python будет отправлять это число снова и снова очень быстро. Я задаюсь вопросом, не следует ли вам немного притормозить. Поместите вызов сна в этот цикл while., @Delta_G


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 для получения дополнительной информации

Для изучения теории надежной последовательной связи ознакомьтесь с учебными пособиями "Основы последовательного ввода" и "Расширенныйпоследовательный ввод".

,