【问题标题】:Python Serial communication Arduino (Teensy) to Raspberry PiPython 串行通信 Arduino (Teensy) 到 Raspberry Pi
【发布时间】:2018-04-16 11:57:04
【问题描述】:

我已经设法通过串行将它从我的 arduino (Uno) 写入我的 Raspberry Pi 3。

如果我在 pi 端使用相同的 python 脚本,在 arduino 端使用相同的 Sketch,但使用 Teensy,我无法读取 Arduino 的任何输出。

arduino Uno 和 teensy 根据串行通信有什么区别吗?

Arduino 草图:

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

void loop() {
  delay(1000);
  Serial.println("10.7;0.7;FFFF:FFFF:FFFF:FFFF:");
}

我的 Pi 上的 Python 脚本:

import serial
ser=serial.Serial("/dev/ttyACM0",115200)
while True:
    print("Waiting for messages from arduino..");
    read_ser=ser.readline()
    print(read_ser)

此代码适用于我的 Arduino Uno,但不适用于我的 Teensy。 ttyACM0 在这两种情况下都是正确的。

Pi 上的操作系统是 ubuntu mate 16.04。 我可以在 Arduino IDE 中看到两个 arduino 的输出。

我用 3 个不同的 Teensies 试过这个,所以硬件应该不是问题。

有什么建议吗?

** ser.isOpen() 是真的

bytesToRead = ser.inWaiting() print(ser.read(bytesToRead)) 没有区别。

会不会有区别,因为teensy用micro usb连接pi,而UNO用A to B USB连接?

【问题讨论】:

  • 删除这一行:ser.baudrate=115200
  • 在循环内执行print(ser.isOpen())
  • 如果没有硬件打开程序,您将无法读取teensy 上的数据 可能的缺失点:handshakeadditional data for open bus。转储总线数据,您将看到 pythonterminal 数据不同。
  • Arduino 有低速 usb-serteensy(3.X) 得到 6Mb/s(我测试过)总线。一些高速设备在开始通信之前需要额外的数据。
  • 不要这样做@MoritzSchmidt,单向通信是与设备通信最糟糕的事情。在teensy 速度定义Serial.begin(115200);Serial.begin(0);Serial.begin(12345678); 不重要,因为如果使用本机端口,则得到12Mb/s 连接。

标签: python arduino raspberry-pi


【解决方案1】:

Teensy 是 ACM 设备吗? 是的!

获得了额外的BULK INBULK OUT ENDPOINTS(Interrupt_dev = 0, CDC_dev=1)

您的Teensy 代码非常糟糕(如果不需要,为什么要计算和发送数据?)!

对于这样的测试程序:

unsigned long s = 0;
void setup(){
    Serial.begin(0);//Not important !(speed 12Mb/s)
    }

void loop(){
    if(Serial.available() > 0){
    while(Serial.available() > 0){//Buffer memory must always be clean !
        char read = Serial.read();
        delay(1);//wait until next_char
        }
    Serial.print("TEST : ");
    Serial.println(s, DEC);
    s++;
    }
}

Python 代码:

import thread
import time
time.sleep(20)
#Don't fight with the Kernel, wait some seconds for prepare device

class _CDC :
    def __init__(self):
        self.dev = "/dev/ttyACM0"
        self.query = ""
    def read(self,_passarg):
        with open("/dev/ttyACM0","r") as readBuff:
            while True :
                ans = readBuff.readline()
                if ans:
                    print ans[:-2]#Ignore "\r\n" parts ! 
                #time sleep for save cpu clocks
                time.sleep(0.001)
    def write(self,_passarg):
        with open("/dev/ttyACM0","a") as writeBuff:
            while True :
                if self.query != "" :
                    writeBuff.write(self.query+"\n")
                    self.query = ""
                #time sleep for save cpu clocks
                time.sleep(0.001)

CDC = _CDC()
thread.start_new_thread(CDC.read,(None,))
thread.start_new_thread(CDC.write,(None,))

for i in range(30):
    q = "SEND-TEST%02d"%i
    CDC.query = q+((64-len(q))*"\x00")
    time.sleep(0.1)

如果设备是ACM,则可以读写(如文件对象)。以“r”和“a”模式打开设备以读取最后一行。

【讨论】:

  • 我也无法从 Raspberry Pi 读取和写入 Teensy。你能举一个使用类 _CDC 的例子吗?我对你的代码感到困惑。 arg _passarg 用于读写是什么?能举个像文件一样读写的例子吗?
猜你喜欢
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多