簡體   English   中英

Python串口通訊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM