Python串口通信Arduino(Teensy)到Raspberry Pi

时间:2017-11-03 17:09:30

标签: python arduino raspberry-pi

我已经设法通过串口从我的arduino(Uno)写到我的Raspberry Pi 3。

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

根据串口通信,arduino Uno和teensy之间有什么区别吗?

Arduino sketch:

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上的OS是ubuntu伙伴16.04。 我可以在Arduino IDE中看到两个arduinos的输出。

我尝试了3种不同的Teensies,所以硬件应该不是问题。

有任何建议吗?

** ser.isOpen()是真的

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

可能会有区别,因为teensy与带有micro usb的pi连接,而UNO与A to B USB连接?

1 个答案:

答案 0 :(得分:2)

Teensy是 ACM 设备? 是!

获得额外 BULK IN BULK OUT ENDPOINTS(Interrupt_dev = 0,CDC_dev = 1)

ACM device

您的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"读取最后一行的模式。