无法通过pyserial发送超过8个字节的数据

时间:2020-07-19 23:30:26

标签: python arduino communication pyserial

我最近开始将Arduino Due用于高速ADC项目,并且我需要能够以Arduino代码的开销将〜3MBit / s写入PC,以与该ADC进行通信。我一直在使用SerialUSB(arduino_USB_slow.ino)对本地arduino速度进行一些测试,并且可以使用pySerial与简单的python脚本进行通信。

随着块大小的增加,我能够提高数据速率(从一次将一个字节写入SerialUSB的1.22MBit / s变为一次使用8个字节的7.58Mbit / s)。这很棒,但是我受周期限制,需要做得更好。但是,如果我尝试使用SerialUSB.write()命令一次发送8个以上的字节,那么我根本不会通过串行端口传输任何数据。打开端口后,我的pySerial输入缓冲区保持为0字节,我使用port.in_waiting进行检查。尝试写入8个字节时,在arduino端编译代码没有问题,在上传代码时也没有问题,并且arduino或pyserial都没有问题。仅当我尝试写入8个以上的字节时才存在问题(我尝试过9、10、16、64,但没有一个起作用)。

串行库文档中没有指示输入字节数组大小的限制,并且据我了解,如果缓冲区不够大,则Arduino端的SerialUSB库将阻止进一步执行,直到硬件缓冲区被重新填充足够的次数以获取所有数据。其他人设法使用更大的块大小没有困难。

这似乎是一个pySerial问题,因为当我使用minicom打开USB设备并运行:

sudo cat /dev/tty.usbmodem11414

我收到一堆二进制barf,该二进制barf在设备不传输时不存在。这告诉我问题不在于Arduino(它可以正常发送其数据),而是pySerial或我如何使用它。接收数据流时,pyserial是否有字限制?这似乎很奇怪。 pyserial代码非常简单:

import serial
import numpy as np

maxBytes = 1000000
byteCounter = 0
dataBuffer = np.zeros(maxBytes + 1020)

arduino = serial.Serial()
arduino.port = '/dev/cu.usbmodem14141'
arduino.open()

while byteCounter < maxBytes:
    bytesAvailable = arduino.in_waiting
    dataBuffer[byteCounter:byteCounter+bytesAvailable] = np.frombuffer(arduino.read(bytesAvailable), dtype='uint8')
    byteCounter += bytesAvailable
    print(byteCounter)

下面是Arduino代码:

char adcData[16] = {'a', 'a', 'a', 'a','a', 'a', 'a', 'a','a', 'a', 'a', 'a','a', 'a', 'a', 'a'};

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

void loop() {
   SerialUSB.write(adcData);
}

0 个答案:

没有答案