Skip to main content
 首页 » 编程设计

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

2024年10月01日34shanyou

我已经设法通过串口从我的 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 连接?

请您参考如下方法:

Teensy 是一个 ACM 设备? 是的!

获得额外的BULK IN 和BULK 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”模式打开设备以读取最后一行。