为什么我使用 Pyusb 库会收到空列表?

问题描述 投票:0回答:0

我想从 STM32F103C8T6(Blue Pill) 的内部闪存中读取数据,我正在使用 USB 协议将数据从 Blue Pill 发送到我的 PC,并使用 Pyusb v1.2.1 库。

代码片段-1我是如何从主控(PC)请求时从Blue Pill板(从属)发送数据

if(Flash_Data_Transmission_Flag == 1){
    while(Flash_Address < 0x08010000){
        for(uint16_t j=0; j<Read_Size; j++){
            Read_Buffer[j] = *(__IO uint8_t *)Flash_Address;
            Flash_Address++;
        }
        CDC_Transmit_FS(Read_Buffer, sizeof(Read_Buffer));
    }
    if(Flash_Address == 0x08010000){
        Flash_Address = 0x0800C000;
    }
    Flash_Data_Transmission_Flag = 0;   //Reset Flag
}

在这里,

Flash_Data_Transmission_Flag
是从 USB 接收的中断服务程序设置的,我正在读取 16KB 的数据。

我如何在 Pyusb 接收方(PC)上进行数据处理的代码片段-2

DATA_BULK_WRITE_EP = 0x01
DATA_BULK_READ_EP  = 0x81
NUMBER_OF_BYTES_TO_READ = 8192
dev = usb.core.find(idVendor=VID, idProduct = PID)
ep = dev[0].interfaces()[0].endpoints()[0]
dev.set_configuration()

Main_List = []

for i in range(0,2):
    dev.write(DATA_BULK_WRITE_EP, bytes(0x9), 1000)
    Main_List.append(dev.read(DATA_BULK_READ_EP, NUMBER_OF_BYTES_TO_READ, TIMEOUT))

bytes(0x9)
用作设置
Flash_Data_Transmission_Flag
的命令,因此每次 Blue Pill(Slave)收到 9 字节时,应该在 ISR 中设置
Flash_Data_Transmission_Flag
并执行第一个 code snippet-1 中编写的序列上面开始发送从定义的内存地址读取的数据。

  • 预期响应:

在 pyusb 端接收数据时(代码块 2), 如果我发送第一个读取命令,理想情况下我应该接收 8192 字节,并且执行两次应该给我 16384 字节,我附加在 Main_List 中(在 code snippet-2 中实现)

的预期结构

Main_List
[ [8192] [8192] ]
其中
8192
是一维子列表中元素的总数。

  • 问题:

当我在 for 循环中运行 code snippet-2 2 次时, 我的

Main_List
收到:
[[8192][]]
我第二次收到空列表.

如果我循环运行四次,我的

Main_List
收到:
[[8192][][8192][]]
然后我得到 16384 个字节和 2 个空列表。

什么可能导致这个问题以及如何解决这个问题?

  • 更多问题:

即使循环运行 4 次也能得到预期的结果,但结果不一致并提供了错误的数据。

例子: 写入内部闪存的 8Kb 图像:

Reading 16KB of Flash Memory 预期结果:

在 20 次运行中收到大约 6-8 次错误输出并且模式不断变化:

python c usb stm32
© www.soinside.com 2019 - 2024. All rights reserved.