hong1414 2024-02-29 20:24 采纳率: 100%
浏览 21
已结题

QT的USB数据采集程序速度极低,怎么解决

#usb速度远低于正常速度
以下是一些运行截图和代码:

img


我采用的是stm32F103C8T6芯片,并且在USBlyser中可以查看为USB2.0

img

以下是部分代码贴图:
上位机关键代码如下:

m_xfer = libusb_alloc_transfer(0);
    
    libusb_fill_bulk_transfer(m_xfer,
                        dev_handle,
                        EP1ADDR, // Endpoint ID
                        recv_buf,
                        RECV_LEN,
                        WinUSBDriver::completeCallback,
                        this,
                        0
                        );

void LIBUSB_CALL WinUSBDriver::completeCallback(libusb_transfer *xfer) {
    WinUSBDriver *driver = (WinUSBDriver *)xfer->user_data;

    switch (xfer->status) {
    case LIBUSB_TRANSFER_COMPLETED:
        if (xfer->actual_length > 0) {
// 并行处理数据接收和处理
#pragma omp parallel sections
            {
#pragma omp section
                {
                    // 更新总字节数和传输速率
                    driver->totalBytesReceived += xfer->actual_length;
                    auto current_time = std::chrono::high_resolution_clock::now();
                    auto time_elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(current_time - driver->last_transfer_time).count();
                    if (time_elapsed > 0) {
                        driver->speed = static_cast<double>(xfer->actual_length/1024) / (time_elapsed / 1000.0); // 计算速度
                    }
                    driver->last_transfer_time = current_time;
                }
                qDebug()<<"speed:"<<driver->speed;
#pragma omp section
                {
                    // 处理接收到的数据
                    memcpy(driver->recv_buf_tmp, xfer->buffer, xfer->actual_length);
                    emit driver->recvSignals(driver->recv_buf_tmp, driver->recv_len);
                }
            }
        }
        break;

以下是下位机关键代码:

while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
        
        /*origin
      char str[] = "hello stm32f3c8t6\r\n";
      CDC_Transmit_FS(str,strlen(str));
      HAL_Delay(1);
         origin*/
        //update
        char str[1024]; // ?????1024??
    int index = 0;
    for (int i = 0; i <= 1024; i++)
    {
        index += sprintf(str + index, "%d", i); // 
    }
    str[1023] = '\0'; // 

    CDC_Transmit_FS((uint8_t *)str, 1024); // 
    HAL_Delay(1); // 
        //update
  }

  • 写回答

3条回答 默认 最新

  • GISer Liu 2024-02-29 20:26
    关注

    该回答引用自GPT-3.5,由博主GISer Liu编写:

    问题分析:
    根据描述,您的QT USB数据采集程序速度极低,可能的原因和解决方案如下:

    1. 数据发送频率问题 :在下位机代码中,您使用了一个循环来发送数据,但是发送的数据量非常大(1024字节),而且发送频率过快,可能会导致USB传输速度跟不上。建议适当降低发送频率或者减少发送的数据量。
    2. USB传输设置问题 :在上位机代码中,您使用了libusb库进行USB传输,但是未对USB传输的参数进行详细设置。您可以尝试调整传输参数,如端点大小、传输类型等,以提高传输效率。
    3. 并行处理可能存在问题 :在上位机代码中,您使用了OpenMP来进行并行处理数据接收和处理。但是并行处理可能会引入竞争条件和线程安全问题,从而导致性能下降。建议您确保并行处理的正确性,并考虑是否真正需要并行处理。
      解决方案:
    4. 优化下位机代码 :调整下位机代码,适当降低发送频率或者减少发送的数据量,以确保USB传输速度跟得上。
      cCopy code
      while (1) {
      char str[64]; // 减少发送的数据量
      sprintf(str, "%d", index++);
      CDC_Transmit_FS((uint8_t *)str, strlen(str));
      HAL_Delay(10); // 适当降低发送频率
      }
      
    5. 优化上位机代码 :对libusb进行参数设置,尝试调整传输参数以提高传输效率。
      cppCopy code
      m_xfer = libusb_alloc_transfer(0);
      libusb_fill_bulk_transfer(m_xfer,
      dev_handle,
      EP1ADDR, // Endpoint ID
      recv_buf,
      RECV_LEN,
      WinUSBDriver::completeCallback,
      this,
      0
      );
      // 添加参数设置,如端点大小等
      libusb_set_bulk_transfer_streaming(m_xfer, 1); // 设置为流式传输
      libusb_set_bulk_transfer_timeout(m_xfer, TIMEOUT); // 设置超时时间
      
    6. 检查并行处理的正确性 :确保并行处理数据接收和处理的逻辑正确,并且考虑是否真正需要并行处理。
      cppCopy code
      if (xfer->actual_length > 0) {
      // 移除并行处理,确保逻辑正确
      // 更新总字节数和传输速率
      totalBytesReceived += xfer->actual_length;
      auto current_time = std::chrono::high_resolution_clock::now();
      auto time_elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(current_time - last_transfer_time).count();
      if (time_elapsed > 0) {
      speed = static_cast<double>(xfer->actual_length/1024) / (time_elapsed / 1000.0); // 计算速度
      }
      last_transfer_time = current_time;
      // 处理接收到的数据
      memcpy(recv_buf_tmp, xfer->buffer, xfer->actual_length);
      emit recvSignals(recv_buf_tmp, recv_len);
      }
      
      通过以上优化方案,可以提高QT USB数据采集程序的传输速度。

    如果该回答解决了您的问题,请采纳!如果没有,请参考以下方案进行修订

    用户答题指南

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 3月13日
  • 已采纳回答 3月5日
  • 创建了问题 2月29日

悬赏问题

  • ¥15 有关类的报错,在模块里调用另一个模块的方法下的变量时出错
  • ¥15 delphi7 HMAC_SHA256方式加密
  • ¥15 关于#qt#的问题:我想实现qcustomplot完成坐标轴
  • ¥15 下列c语言代码为何输出了多余的空格
  • ¥15 kali linux用wget archive.kali.org/archive-key.asc指令下载签名无效(失败)
  • ¥15 openHarmony 利用c++程序在dayu210开发板上实现拉取RTSP视频流并且在屏幕上显示
  • ¥15 GD32H757的can通信配置
  • ¥20 nist随机数测试的问题
  • ¥20 帮我解决这个项目,thank you各位程序员
  • ¥15 哪位能用ea软件做一下,有偿