如何将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
相关产品推荐
相关产品推荐

