我创建了一个音乐可视化工具,我想使用python的pyserial
库通过串行方式将38位整数(0-255)发送到Arduino。我的计算机上有一个名为rgb.txt
的文本文件,其中包含以下数据:8,255,255
。我使用以下代码通过串行方式发送数据:
import serial, time
arduino = serial.Serial('COM3', 9600, timeout=.1)
time.sleep(2) #give the connection a second to settle
while True:
with open("rgb.txt") as f:
rgb = f.read().strip("\n")
arduino.write(rgb.encode("ASCII"))
data = arduino.readline()
if data:
try:
print(data.decode('ASCII').strip("\r").strip("\n")) # (better to do .read() in the long run for this reason
except UnicodeDecodeError:
pass
time.sleep(0.1)
我收到它的代码是:
#include <stdio.h>
int r = A0;
int g = A1;
int b = A2;
void setup() {
Serial.begin(9600);
analogWrite(r, 255); delay(333); analogWrite(r, 0);
analogWrite(g, 255); delay(333); analogWrite(g, 0);
analogWrite(b, 255); delay(334); analogWrite(b, 0);
}
void loop() {
if(Serial.available() > 0) {
char data = Serial.read();
char str[2];
str[0] = data;
str[1] = '\0';
Serial.println(str);
}
}
我得到的结果是
8
,
2
5
5
,
2
5
5
我如何解析它以便接收:
8
255
255
最好是3个不同的变量(r
{
如果始终有一个“,”字符,则可以将其转换为int
Arduino代码:
Python代码:
现在要做的是读取一个
char
,将其转换为一个CStringstr
,然后在继续下一个char
之前println()
读取它您可能可以按照所需的方式将字节粘在一起,但将接收到的字节读入缓冲区并拆分结果更容易:
从Python中发送RGB值,用逗号分隔,末尾用
'\n'
分隔,然后在Arduino上执行类似的操作(未测试,但您明白了):注意:此代码中没有检查和错误处理
毫无疑问,有更漂亮的方式,但我首先想到了这一点,我认为它会起作用。也可以使用字符串对象来完成,但我尽量不这样做
为了使this other answer中的代码正常工作,需要添加一些东西(但我还没有测试这些添加是否足够):
请注意,在Python端,将从文件读取的内容转换为字符或整数,然后只发送三个字节,这将大大简化Arduino端的工作
相关问题 更多 >
编程相关推荐