我正在尝试使用串行USB线缆在Python脚本和我的Arduino Pro Mini之间进行通信。在Python中,我可以阅读Arduino所写的内容,但是Arduino既不能读取Python写的内容,也不能读取我无法处理的形式。这种现象最明显的方式是当我尝试编写Arduino刚从Python读取的内容时,再到Python。 Python中没有显示任何内容。
当我在串行监视器中使用它时,我的Arduino草图似乎工作得很好,即它可以读写,所以我怀疑它是Python端的东西。造成这种情况的原因是什么?
我希望能够测试我能够多快地将64字节长的信息发送到我的Arduino。为此,我编写了一个Python脚本,可以定期向我的Arduino发送各种信息。我可以改变时间,从而测试我能得到什么样的速度。
然而,尽管我的Arduino草图与串行监视器配合得很好,即我可以发送信息并从中读取信息,但我无法使用它。
使用我的Python脚本,我可以打开连接并阅读Arduino写的内容,但由于某些原因,从Python编写时存在问题。我尝试了以下但没有一个有效:
Serial.println()
函数中添加get_data()
语句。什么都没打印出来。sscanf()
提取数字。使用if语句检查数字并打开板载LED。没用。raw_data[]
中。它不是。device.write(b"mystring")
和device.write("mystring".encode())
我不知道接下来会尝试什么......
import serial, time, random, string
device = serial.Serial('/dev/tty.usbserial-A105YOZX', baudrate = 38400)
initial_time = time.time()
current_time = time.time()
counter = 0
control = 0
while counter < 1000:
current_time = time.time()
if current_time - initial_time > 0.1:
initial_time = current_time
counter += 1
device.read()
if current_time - initial_time > 1 and control == 0:
device.write(b"Message being sent")
control = 1
#define RAW_LEN 64 //max length of incoming string (buffer size is only 64 bytes)
//variables for incoming data
char raw_data[RAW_LEN];
int raw_data_i = 0; //index
unsigned long my_time;
int control = 0;
int for_print;
int get_data(int i) {
//fills up raw_data[] with serial data. Clears raw_data if it gets too long
if (Serial.available()>0) {
raw_data[i] = Serial.read();
Serial.println(raw_data[i]);
//Serial.println(raw_data[i]);
if (i<RAW_LEN-1){
i++;
}
}
return i;
}
void clear_data() {
//clears raw_data and resets raw_data_i
raw_data_i = 0;
memset(raw_data,'\0',RAW_LEN-1);
}
//print functions
void raw_print(char data[]) {
Serial.println("Received data: ");
//if (raw_data[0] == 'T') {digitalWrite(LED_BUILTIN, HIGH);}
for (int i=0; i< RAW_LEN;i++) {
Serial.println(data[i]);
}
}
void setup() {
Serial.begin(38400);
Serial.println("Restart");
pinMode(LED_BUILTIN, OUTPUT);
digitalWrite(LED_BUILTIN, LOW);
}
void loop() {
my_time = millis();
raw_data_i = get_data(raw_data_i);
//clear raw_data if it gets full
if (raw_data_i == RAW_LEN-1) {
clear_data();
}
if (my_time > 5000 && control == 0) {
Serial.println("Here");
raw_print(raw_data);
control = 1;
}
}
答案 0 :(得分:1)
问题最终出现在Python代码中。在df['diff']=np.nan
df['diff']=df.loc[df.variation!='control','diff'].\
fillna(df.revenue-df.groupby('experiment').revenue.transform('first'))
df
Out[498]:
experiment variation revenue diff
0 exp_1 control 100 NaN
1 exp_1 variation_1 90 -10.0
2 exp_1 variation_2 155 55.0
3 exp_2 control 50 NaN
4 exp_2 variation_1 95 45.0
5 exp_3 control 300 NaN
6 exp_3 variation_1 500 200.0
7 exp_3 variation_2 250 -50.0
8 exp_3 variation_3 610 310.0
循环中,第一个while
语句在0.1秒后为if
,然后在第二个True
语句为if
之前再执行9次。
问题是True
如果没有收到字符就会挂起。因为我没有从Arduino发送足够的字符,所以Python代码在device.read()
暂停,而且从未进入第二个device.read()
语句。
一个令人烦恼的错误需要一段时间来弄明白,希望这个问题和答案能为其他人节省大量的调试时间。