python - pySerial发送和接收多个数据

标签 python arduino arduino-uno pyserial

我有一个关于使用 pySerial Python 库发送和接收多个数据的问题。据我了解,串口通信是使用字节变量进行的。

如何使用 write 方法发送四个不同的变量,然后使用 read 方法接收两个不同的变量?

举个例子:

import serial
import time

sendSerial = serial.Serial ("COM4", 9600)
readoutSerial = serial.Serial ("COM4", 9600)
time.sleep (2)
sendSerial.write ("data1" + "data2" + "data3" + "data4")
while True:
    readoutSerial.read ("data5" + "data6")

我应该怎么做才能用write发送四个变量,并通过某个字符进行区分,然后将它们分开以供每个变量各自使用? (对使用 read 接收到的两个变量应用相同的方法)另外,我该怎么做才能将变量作为 float 发送,并且不会与 byte 中的读取产生冲突

最佳答案

如果您正在传输文本,最简单的方法是选择一些字符来分隔各个字符串,它可以是\n(换行符)、逗号或任何字符。

ser = serial.Serial ("COM4", 9600)
ser.write(b"some string\n")
ser.write(b"some other string\n")

在Python中读取文本将是这样的:

s1 = ser.readline()

在arduino上,您将读取如下字符串(原始示例):

char buf[64];
int bufIdx = 0;
while(Serial.peek() != '\n') { // Continue till the end of line
  if(Serial.peek() != -1) { // If no char arrived in this loop, skip.
    buf[bufIdx] = Serial.read();
    bufIdx = (bufIdx + 1) % 64; // Wrap around, so it will not go crazy string too long
  }
}
buf[bufIdx] = '\0'; // End of string char

或者,如果您不介意在 Arduino 上使用字符串(您很可能不介意),那么您可能最好使用 readStringUntil功能:

string str1 = Serial.readStringUntil('\n');
string str2 = Serial.readStringUntil('\n');

在Python中,你甚至可以将数值转换为文本:

textStr = str(1234)

在 Arduino 端,您可以接收字符串形式的数字,如下所示:

int x = Serial.parseInt(); // Receives (string)"1234", returns (int)1234
float y = Serial.parseFloat(); // Receives (string)"1.24E13", returns (float)1.24E13

如果需要传输结构化二进制数据,Python 有一个名为 struct 的模块,这是在 python 中推荐的方法。在 arduino 方面,您很可能必须手动调整字节。例如,int16 将这样接收:

while(Serial.available() < 2); // Block, until at least 2 bytes are received
int int16;
int16 = Serial.read() | (Serial.read()<<8); // Little-endian, low byte first, high byte second

关于python - pySerial发送和接收多个数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48373982/

相关文章:

python - Pycharm 无法将解释器从 python 2.7 更改为 3.4

python - list(dict.items()) 是线程安全的吗?

c++ - 在类中初始化可变大小的数组

c - Arduino uno freertos 任务停止运行

c++ - Arduino方法制作

ubuntu - 如何在 Visual Studio 中编译和运行 arduino 代码? (Ubuntu)

python - 如何将python文件转换为可执行文件?

python - 减少 numpy 中缩放和堆叠列的代码行

c - 使用Arduino生成黄金码调制的正弦波

html - 如何在 Arduino 上检索 CSS/JS 文件?