[英]Python serial communication
我正在研究一個Arduino項目,由於內存限制,我正在將它與Python腳本連接起來。 在Python方面,我有一個2維矩陣,包含坐標的各個x,y值,在這個列表中是26000個坐標對。 因此,為了澄清所有人的數據結構, pathlist[0][0]
將返回列表的第一個坐標的X值。 在Python中對此列表執行不同的操作等沒有任何問題。 然而,我遇到麻煩的是將這些值通過串行發送到Arduino,這是有用的。
由於串行通信的性質(至少我認為是這種情況),我必須將每個整數作為一個字符串發送,一次只發送一個數字。 因此,像345這樣的數字將作為3個單獨的字符發送,當然,這些字符是3,4,然后是5。
我正在努力尋找一種方法來重建Arduino上的整數。
每當我發送一個值時,它就會接收數據並輸出它,如下所示:
//Python is sending over the number '25'
2ÿÿ52
//Python is sending the number 431.
4ÿÿ321ÿÿÿ2
Arduino代碼是:
String str;
int ds = 4;
void setup() {
Serial.begin(9600);
}
void loop(){
if (Serial.available()>0) {
for (int i=0; i<4; i=i+1) {
char d= Serial.read();
str.concat(d);
}
char t[str.length()+1];
str.toCharArray(t, (sizeof(t)));
int intdata = atoi(t);
Serial.print(intdata);
}
}
Python代碼如下所示:
import serial
s = serial.Serial(port='/dev/tty.usbmodemfd131', baudrate=9600)
s.write(str(25))
我幾乎可以肯定問題不是來自輸出方法( Serial.print
),看到當我聲明另一個int時,它在輸出上格式正常,所以我假設問題在於如何構造intdata
變量。
可能有助於診斷此問題的一點是,如果我將Serial.print(intdata)
更改為Serial.print(intdata+5)
我的結果是2ÿÿ57
,我期望30(25 + 5)。 無論輸入如何,都存在該7。 例如,我可以將271寫入序列,我的結果如下所示:
//For input 271.
2ÿÿ771ÿÿÿ7
在我看來,Arduino將值分成兩對,並將長度追加到最后。 我無法理解為什么會發生這種情況。
在我看來, ÿ
正在for循環中添加。 意味着它們被添加,因為當前沒有發送任何內容。 但即使通過添加另一個if(Serial.available()>0)
條件來修復它,結果仍然不會被視為整數。
那么,在這里使用Pickle會不合適? 我究竟做錯了什么?
您應該等一下串行數據到達。
Arduino代碼應該是:
if (Serial.available()){
delay(100); // Wait for all data.
while (Serial.available()) {
char d = Serial.read();
str.concat(d);
}
}
此外,您必須在重新使用之前清除字符串。
[編輯]
我忘記提及ÿ== -1 == 255這意味着Serial.read()
它說不能讀取任何內容。
我會改變通信,所以python在數字之間發送換行符,所以你不依賴於時間:
s.write(str(25)+'\n')
然后在接收方:
void loop(){
while (Serial.available() > 0) {
char d = Serial.read();
if (d == '\n') {
char t[str.length()+1];
str.toCharArray(t, (sizeof(t)));
int intdata = atoi(t);
Serial.print(intdata);
str = String();
}
else {
str.concat(d);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.