Эхо-программа между Arduino и Python - PullRequest
4 голосов
/ 25 февраля 2010

Я хочу отправить некоторые данные в Arduino через pyserial на Python. Все, что я хочу от Arduino, - это прочитать данные строки переменной длины из последовательного порта и записать их обратно, чтобы Python мог их прочитать. Поскольку я не смог этого сделать, в приведенном ниже коде Python отправляет только символ. Вот код Python:

import serial
import sys
import pywapi
import time

def main():
    ser = serial.Serial(3, 9600, timeout=1)
    print "Conn established"
    print "Sending: %s" % "z".__repr__()
    print ser.write('z'.encode("ascii"))
    time.sleep(2)
    print "Received: %s" % ser.read(10).__repr__()         
    ser.close()

Вот код Arduino:

void setup(){
  analogReference(DEFAULT);
  Serial.begin(9600);
}

void loop(){
  if(Serial.available() > 0)
    Serial.println("x");
  while(Serial.available() > 0){
    Serial.print(Serial.read(), BYTE);
  }
}

Выход:

Conn established
Sending: 'z'
1
Received: ''

Я знаю, что код для Arduino работает, потому что он работает, когда данные отправляются с терминала Arduino. Однако в тот момент, когда я пытаюсь отправить что-либо из Python, это не получается. Я боролся с этим весь день. Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

3 голосов
/ 25 февраля 2010

Я бы рекомендовал проверить две части независимо, используя отдельный последовательный порт и программное обеспечение последовательной связи на ПК.

например. если на вашем компьютере есть два последовательных порта, используйте нуль-модемный (петлевой) кабель для их подключения. Или используйте com0com , чтобы создать пару связанных виртуальных последовательных портов. Запустите программное обеспечение Python на одном последовательном порту, а программу терминала (Hyperterminal или RealTerm ) на другом последовательном порту. Проверьте вручную работу программы Python таким образом.

Затем подключите ваш компьютер напрямую к Arduino, как обычно, и используйте программное обеспечение терминала для ручной проверки работы программного обеспечения Arduino.

Этот процесс позволит вам сузить проблему. Как только вы проверите их обоих, они должны хорошо работать вместе.

Монитор последовательного порта

Другой метод, который вы можете использовать, - это программное обеспечение, которое подключается к драйверу последовательного порта ПК и позволяет вам отслеживать трафик через последовательный порт. В прошлом я использовал программное обеспечение Free Serial Port Monitor от HHD Software, и оно хорошо работало для наших целей. Он позволяет контролировать любой из последовательных портов ПК и отображает журнал (в шестнадцатеричном и текстовом виде) последовательных данных, проходящих через порт в обоих направлениях.

3 голосов
/ 25 февраля 2010

Попробуйте увеличить или удалить тайм-аут и установить размер чтения равным 1. Вы также можете увеличить задержку сна или даже реализовать простой цикл чтения.

Что-то вроде:

try:
    while True:
        data = ser.read(1).__repr__()
        if data:
            print "Received: %s." % data
        else:
            print "Looping."
except KeyboardInterrupt:
    print "Done."
except:
    raise
finally:
    ser.close()
    print "Closed port."

Тогда просто используйте ctrl-c, чтобы остановить его.

0 голосов
/ 11 мая 2012

Причина, по которой вам может потребоваться отправить дважды, заключается в том, что при подключении через USB первое последовательное соединение сбрасывает Arduino.

0 голосов
/ 25 февраля 2010

Вам нужно удалить отправленный символ из любого буфера последовательного порта?

Возможно, ваш персонаж на самом деле не покидает COM-порт и не прибывает в Arduino. Когда вы тестируете это с помощью терминала Arduino (я предполагаю, что вы имеете в виду UI-терминал в среде разработки), вы фактически отправляете свою строку + возврат каретки, я думаю, а не только символ. (т. е. нажимаете ли вы клавишу возврата после того, как набрали в своем тесте «z»?)

Попробуйте ser.flush () или, возможно, также отправьте символ \ r. После вашего тестирования Arduino работает просто отлично, это программа на python, которая, похоже, ничего не отправляет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...