Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pySerial发送和接收多个数据_Python_Arduino_Arduino Uno_Pyserial - Fatal编程技术网

Python pySerial发送和接收多个数据

Python pySerial发送和接收多个数据,python,arduino,arduino-uno,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 ("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
发送,并且不会与
字节中的读取产生冲突?

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

ser = serial.Serial ("COM4", 9600)
ser.write(b"some string\n")
ser.write(b"some other string\n")
用python阅读文本的过程如下:

s1 = ser.readline()
int x = Serial.parseInt(); // Receives (string)"1234", returns (int)1234
float y = Serial.parseFloat(); // Receives (string)"1.24E13", returns (float)1.24E13
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
在arduino上,您将读取如下字符串(基本示例):

或者,如果您不介意在Arduino上使用字符串(您很可能不介意),则最好使用函数:

string str1 = Serial.readStringUntil('\n');
string str2 = Serial.readStringUntil('\n');
在python中,您甚至可以将数值转换为文本:

textStr = str(1234)
在Arduino端,您可以接收如下字符串形式的数字:

s1 = ser.readline()
int x = Serial.parseInt(); // Receives (string)"1234", returns (int)1234
float y = Serial.parseFloat(); // Receives (string)"1.24E13", returns (float)1.24E13
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有一个名为的模块,这是python中推荐的方法。在arduino方面,您很可能需要手动洗牌字节。例如,int16的接收方式如下:

s1 = ser.readline()
int x = Serial.parseInt(); // Receives (string)"1234", returns (int)1234
float y = Serial.parseFloat(); // Receives (string)"1.24E13", returns (float)1.24E13
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
while(Serial.available()<2);//块,直到至少接收到2个字节
int16;
int16=Serial.read()|(Serial.read()使用互斥锁(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循环中发送上面连接的字符串

    • 对于范围内的i len(var):
      sendSerial.write(变量)

  • 在我使用python脚本处理PSoc的串行端口时,这对我来说很有效。

    这与什么有关?通过
    tkinter
    我有一个图形界面,在这里输入和读取变量的值。为了避免发送和获取冲突,可以使用.mutex()在线程库中,我还没有测试过你的代码,但作为一个新用户,你的代码非常复杂。继续努力!+1尝试在回答中格式化代码:选择它,然后按Ctrl+k。