pySerial发送和接收多个数据
pySerial sending and receiving multiple data
我对使用 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] = '[=12=]'; // 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
使用mutex(Lock)避免发送和接收冲突:
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")
将字符串存储在变量中,例如:
- var = "data1\r" + "data2\r" + "data3\r" + "data4\r"
然后在for循环中发送上面的连接字符串
- 我在 len(var) 范围内:
sendSerial.write (变量)
当我使用 python 脚本玩弄 PSoc 的串口时,这对我有用。
我对使用 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] = '[=12=]'; // 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
使用mutex(Lock)避免发送和接收冲突:
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")
将字符串存储在变量中,例如:
- var = "data1\r" + "data2\r" + "data3\r" + "data4\r"
然后在for循环中发送上面的连接字符串
- 我在 len(var) 范围内:
sendSerial.write (变量)
- 我在 len(var) 范围内:
当我使用 python 脚本玩弄 PSoc 的串口时,这对我有用。