Серийная связь Python - PullRequest
       9

Серийная связь Python

9 голосов
/ 18 мая 2011

Я работаю над проектом Arduino и связываю его со скриптом Python из-за ограничений памяти.На стороне Python у меня есть двумерная матрица, содержащая соответствующие значения 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 ?Что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 23 мая 2011

Я бы изменил связь так, чтобы 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);
        }
    }
}
5 голосов
/ 18 мая 2011

Вам следует немного подождать, пока поступят последовательные данные.

Код Arduino должен быть:

if (Serial.available()){
    delay(100); // Wait for all data.
    while (Serial.available()) {
        char d = Serial.read();
        str.concat(d);
    }
}

Кроме того, вы должны очистить строку перед ее повторным использованием.

[Редактировать]

Я забыл упомянуть ÿ == -1 == 255, что означает Serial.read(), что говорит, что ничего не может прочитать.

...