2

我正在尝试通过串行连接在 Raspberry Pi 和 Teensy 之间发送数据。

teensy 的代码:

void setup() {
  Serial1.begin(9600);
}

void loop() {
  Serial1.println("HELLO");
  delay(1000);
}

树莓派的 Python 代码:

import serial
import sys
import string

ser = serial.Serial('/dev/ttyAMA0', 9600)
while True :
    try:
        data=ser.readline()
        print(data)
    except:
        print("Unexpected error: {}".format(sys.exc_info()))
        sys.exit()

结果 :

在此处输入图像描述

为什么数据似乎已损坏?奇偶校验位不应该阻止这种情况吗?

4

3 回答 3

0

我以前使用的时候遇到过这个。为什么不直接使用 /dev/ttyUSB0?我现在正在使用它,没有任何问题。

于 2019-02-22T16:34:59.957 回答
0

我试图在笔记本电脑上运行的 Arduino 和 Python 3 之间进行通信。Arduino应该接收0x30,即ASCII0并用ASCII回复"Arduino reachable."(见最后的代码)。Python 代码非常简单:

import serial, time

ports=['/dev/ttyACM0']
fixture = serial.Serial(port=ports[0],baudrate=9600,timeout=2,stopbits=sm.serial.STOPBITS_ONE,parity=sm.serial.PARITY_EVEN,bytesize=sm.serial.EIGHTBITS)

fixture.write(b'0')
time.sleep(0.1)
if (fixture.inWaiting() > 0):
    dataStr = port.read(fixture.inWaiting())
    print(dataStr)

fixture.close()

Arduino 正在回复,但回复没有多大意义:'A.V¥n\x0b\x92\x95a,+\x89lY©'. 最后,我改变parityserial.PARITY_NONE,这就像做梦一样。

另外,我建议使用以下等待数据出现的方法:

TIMEOUT = 20
timeoutCounter=0

while fixture.inWaiting() <= 0: # Wait for data to appear.
    time.sleep(0.1)
    timeoutCounter += 1
    if timeoutCounter == TIMEOUT:
        fixture.close()
        raise BaseException('Getting test data from the Arduino timed out.')

相关Arduino代码

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

void loop()
{
    char cmdChar = '0'; // Which test case to execute. 0 - do nothing.
    // Wait until there is something in the serial port to read.
    if (Serial.available() > 0)
    {
        // Read the incoming serial data.
        cmdChar = Serial.read();
        // Eexecute the chosen test case.
        switch(cmdChar)
        {
            case '0':
                Serial.print("Arduino reachable."); // Send ASCII characters.
                break;
        }
    }
}

警告

很抱歉,我不得不在发布之前编辑此代码,并且没有机会重新测试它。但是,问题中报告的错误的主要解决方案仍然存在:

  1. 错误的奇偶校验(也可能是停止位),
  2. 等待数据出现的时间不足(可能不是问题的原因,但绝对是一种不好的做法)。
于 2019-02-21T11:25:51.480 回答
0

尝试插入ser.flushInput()和创建ser.flushOutput()ser

于 2016-12-04T10:39:18.567 回答