pySerial发送和接收多个数据

2024-09-30 22:19:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个关于使用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发送,而不与{}中的读数产生冲突?在


Tags: 数据方法importread字节timeserialsleep
2条回答

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

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

在python中阅读文本如下所示:

^{pr2}$

在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

线程化库中使用互斥体(锁),以避免发送/接收冲突,例如以下代码:

import serial
import time
from threading import Lock

mutex = Lock() 

sendSerial = serial.Serial ("COM4", 9600)
readoutSerial = serial.Serial ("COM4", 9600)
time.sleep (2)

mutex.acquire()
try:
    sendSerial.write ("data1" + "data2" + "data3" + "data4")
except:
    pass
finally:
    self.mutex.release()

while True:
    with mutex:
        readoutSerial.read ("data5" + "data6")

相关问题 更多 >