4

我正在尝试通过 Python 脚本不断地从我的Arduino Nano中读取数据。但大多数时候,readline 要么无法抛出异常,要么返回损坏的数据,比如丢失一个数字。

这是连接部分:

Arduino代码:

void loop() {
    // Send data only when you receive data:
    if (Serial.available() > 0) {

        // Check if it's the right signal.
        if (Serial.read()=='S') {
            // Send a string containing the rows and cols number.
            send_rows_cols();

        } // if(Serial.read()=='S')
        else {
            send_data();
        } // END: else if( Serial.read()=='Y')
    }// if(Serial.available() > 0)
}

在 中send_rows_cols(),我正在使用Serial.write,因为它可以工作,但在send_data()我必须使用Serial.println()将数据发回。

Python 部分。这是在返回合法值之前我不得不使用的荒谬的运行方式。

import serial
import time

locations=['/dev/ttyUSB0','/dev/ttyUSB1','/dev/ttyUSB2','/dev/ttyUSB3',
'/dev/ttyS0','/dev/ttyS1','/dev/ttyS2','/dev/ttyS3']

for device in locations:
    try:
        print "Trying...",device
        arduino = serial.Serial(device, 9600)
        break
    except:
        print "Failed to connect on",device

rows_cols =''

try:

    while True:
        arduino.write('S')
        rows_cols = str(arduino.readline())
        print len(rows_cols)
        print rows_cols
        if ( len(rows_cols)>3 ):
            break

except:
    print "Failed to send!"

到目前为止,它在一到两条 readlines 之后就可以工作了。这是负担得起的。但后来,我不得不使用更疯狂的代码。将一个字符从 Python 发送到 Arduino,这样连接就不会中断,然后您可以看到 Arduino 必须等待该字符。在 Arduino 接收到该字符后,它会发回我想要的数据(一串用逗号分隔的数字)。

最后一个 Python 部分是它一次又一次地从 Arduino 发送“Y”字符和读取行,直到没有异常或损坏的数据。这么多循环无用。

我想要的是一种从我的 Arduino 中连续获取数据的方法,而无需一直进行“握手”,并且这些数据不会一直都是垃圾。

有没有这样的方法?也许串行的超时选项?

4

1 回答 1

4

您还没有打开 Arduino IDE 串行监视器吗?我花了一个“愉快”的晚上调试我的“Python 到 Arduino 接口代码”,然后才意识到我已经把它打开了,它正在吃偶尔的字符:)

我当然使用了非常简单的代码Serial.write()Serial.println()代码readline()来一次连续运行数十分钟的“命令/响应”测试(数千行发送和接收)

于 2012-07-03T08:12:16.687 回答