You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将STM32H743外接NAND Flash中的文件通过USB串口传输至PC?

解决方案:STM32H743通过USB串口导出NAND Flash中的.txt文件

针对你用STM32H743两路SPI分别连接传感器和NAND Flash、需通过USB串口导出Flash中多个.txt文件的场景,可按以下步骤实现:

1. 实现NAND Flash的文件读取逻辑

假设你已基于FatFS实现了NAND Flash的文件系统(因已生成多个.txt文件),需遍历目录并读取文件内容:

// 头文件包含:#include "ff.h"、#include "string.h"等
FRESULT res;
FIL file;
DIR dir;
FILINFO fno;
uint8_t tx_buf[512]; // 匹配USB CDC最大包分块大小
UINT bytes_read;

// 打开NAND Flash根目录
if (f_opendir(&dir, "/") != FR_OK) {
    // 目录打开失败处理,比如LED提示
    return;
}

// 遍历目录筛选.txt文件
while (f_readdir(&dir, &fno) == FR_OK && fno.fname[0]) {
    if (strstr(fno.fname, ".txt")) {
        // 打开目标文件
        if (f_open(&file, fno.fname, FA_READ) != FR_OK) continue;
        
        // 先发送文件名到PC,用于区分保存
        USB_CDC_Send_String((uint8_t*)fno.fname, strlen(fno.fname));
        USB_CDC_Send_String((uint8_t*)"\n", 1);

        // 逐块读取并发送文件内容
        do {
            res = f_read(&file, tx_buf, sizeof(tx_buf), &bytes_read);
            if (bytes_read > 0) {
                USB_CDC_Send_Data(tx_buf, bytes_read);
                // 等待USB发送完成,需在CDC回调中更新发送状态
                while (hcdc->TxState);
            }
        } while (res == FR_OK && bytes_read == sizeof(tx_buf));

        // 发送文件结束标记
        USB_CDC_Send_String((uint8_t*)"\r\nFILE_END\r\n", 12);
        f_close(&file);
    }
}
f_closedir(&dir);

2. 完善USB CDC串口发送功能

确保已通过STM32CubeMX配置USB CDC为虚拟串口,补充以下发送函数:

#include "usbd_cdc.h"
extern USBD_HandleTypeDef hUsbDeviceFS;

// 发送字符串
void USB_CDC_Send_String(uint8_t *str, uint16_t len) {
    USBD_CDC_TransmitPacket(&hUsbDeviceFS, str, len);
    while (USBD_CDC_GetTxState(&hUsbDeviceFS));
}

// 发送二进制数据块,自动分块适配CDC最大包
void USB_CDC_Send_Data(uint8_t *data, uint16_t len) {
    uint16_t remain = len;
    uint16_t send_len;
    while (remain > 0) {
        send_len = remain > CDC_DATA_FS_MAX_PACKET_SIZE ? CDC_DATA_FS_MAX_PACKET_SIZE : remain;
        USBD_CDC_TransmitPacket(&hUsbDeviceFS, data, send_len);
        while (USBD_CDC_GetTxState(&hUsbDeviceFS));
        data += send_len;
        remain -= send_len;
    }
}

3. PC端接收与文件保存

方式1:串口助手手动保存

  • 打开串口助手(如串口调试助手、Putty),匹配STM32端的波特率/校验位/停止位。
  • 开启“自动保存到文件”功能,每次收到文件名时切换保存目标,收到FILE_END时结束当前文件保存。

方式2:Python脚本自动处理

用脚本自动识别文件名和结束标记,自动拆分保存:

import serial
import time

ser = serial.Serial('COMx', 115200, timeout=0.5)  # 替换为你的USB串口号
current_file = None

print("等待STM32发送数据...")
while True:
    data = ser.readline().decode('utf-8', errors='ignore').strip()
    if not data:
        time.sleep(0.1)
        continue
    
    if data.endswith('.txt'):
        # 切换到新文件
        if current_file:
            current_file.close()
        current_file = open(data, 'w', encoding='utf-8')
        print(f"开始接收:{data}")
    elif data == "FILE_END":
        if current_file:
            current_file.close()
            current_file = None
            print("当前文件接收完成")
    else:
        if current_file:
            current_file.write(data + '\n')

关键注意事项

  • NAND Flash读取需确保坏块处理逻辑正常,避免读取错误数据。
  • 若文件过大,可加入简单的ACK机制:PC端收到每块数据后回复ACK,STM32收到确认后再发送下一块,防止丢包。
  • 调试时可先发送小文件测试,确认逻辑无误后再处理大文件。

内容的提问来源于stack exchange,提问作者shrey gupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 06:15:11