Raspberry Pi 3上的USB串行通信速度慢

时间:2018-04-17 00:02:37

标签: raspberry-pi serial-port usb raspberry-pi3 raspbian

上周我发布了一个类似的问题,但我的代码中出现了一些错误,我认为我现在已经解决了这个问题。

我有一台设备通过USB(cdc-acm)以10 fps的帧速率发送80x80 16位图像。

为了获得这些图像,我编写了一些我在Ubuntu笔记本电脑上测试的代码,以及Raspberry Pi 3 Model B上的代码。

代码在两个设备上工作正常(意味着我得到了正确的图像),但在Raspberry Pi上,帧率非常低!我最多只能达到5 fps。

从串行端口读取图像的代码部分在主程序的分离线程中运行。与此同时,覆盆子Pi(运行Raspbian Desktop)的“CPU使用率监视器”向我显示,只使用了大约20%(有时高达31%)的CPU,因此应该仍然有一些处理能力可供使用。我是对的吗?

有人知道问题的来源吗?

因为它可能来自我在代码中处理串行通信部分的方式,下面的代码显示了我是如何做到的。请注意,正如我在之前的帖子中建议的那样,我尝试使用不同的波特率,它根本不会改变任何内容。

/// INITIALISATION

// Try to open the serial port
int m_file_descriptor = open("/dev/ttyACM0", O_RDWR | O_NOCTTY /*| O_NDELAY*/);
// Failed to open
if (m_file_descriptor == -1)
{
    std::cerr << "Unable to open serial port" << std::endl;
}
// If success, configure serial like expected
else
{ 
    fcntl(m_file_descriptor, F_SETFL, 0);

    struct termios settings;
    tcgetattr(m_file_descriptor, &settings);  // Get current default settings
    cfmakeraw(&settings);  // Raw serial communication (custom bytes sending and parsing)
    //cfsetspeed(&settings, B115200); // Setting baud rates doesn't change anything

    // Now clean and set params
    tcflush( m_file_descriptor, TCIFLUSH );
    tcsetattr( m_file_descriptor, TCSANOW, &settings );
}


/// Getting Data : main loop of the serial com thread

unsigned char read_buffer[128];

while (m_isListening)
{
    int rd = read(m_file_descriptor, read_buffer, 128); // Blocking read

    // Octets were read
    if (rd > 0)
    {
        /// Processing read_buffer basically copy the pixels' octets into a class member image data buffer
    }
    else if (rd == 0)
    {
        std::cout << "No bytes read" << std::endl;
    }
    else
    {
        printf("%d %s \n", errno, strerror(errno));
    }
}

编辑:

基于评论,它可能来自于Raspberry Pi上的USB速度限制为USB 1.1速度。

在raspberry Pi上,当我插入设备时返回dmesg命令的第一行是:

usb 1-1.4: new full-speed USB device number 6 using dwc_otg

而在Ubuntu笔记本电脑上它是:

usb 1-6: new full-speed USB device number 5 using xhci_hcd

我对 dwc_otg xhci_hcd 了解不多,但我想问题就在这里......任何人都有想法?

编辑2:

显然,USB速度问题(特别是对非常见设备的速度重新分配)在Raspberry Pi上很常见。我找到了一个似乎使我的设备以10 fps工作的解决方法:

我在文件dwc_otg.speed=1中添加了/boot/cmdline.txt。根据我在互联网上发现的情况,这将限制USB速度达到全速12Mbps(USB 1.1)。

这增加了我的设备的帧率,但问题是,使用线路,插入Raspberry的鼠标和键盘不再响应。

0 个答案:

没有答案