STM32 使用USB3300虚拟串口,发送ADC数据,数据量60K字节以上,上位机下发指令,给一个指令发送一次数据,但是刚上电或者复位初始化后,前几次传输的数据会丢很多,不稳定,只有多传输几次才会正常传输不丢失
1条回答 默认 最新
- 吃不了席 2024-08-30 17:15关注
以下回复参考:皆我百晓生、券券喵儿等免费微信小程序作答:
这个问题可能是由于USB CDC HS的初始化和配置不正确导致的。请按照以下步骤检查和修改代码:
- 确保在初始化USB CDC HS之前,已经正确配置了时钟、GPIO和中断。
- 检查USB CDC HS的配置,包括波特率、数据位、停止位等参数是否正确。
- 在USB CDC HS的中断服务程序中,确保正确处理了接收到的数据和发送完成的事件。
- 检查上位机下发指令的处理逻辑,确保在接收到指令后立即发送ADC数据。
- 如果问题仍然存在,可以尝试在发送数据前添加一定的延时,以确保USB CDC HS已经正确初始化。
以下是一个简化的STM32 USB CDC HS初始化和发送数据的示例代码:
#include "stm32f1xx_hal.h" #include "usb_device.h" #include "usbd_cdc_if.h" /* 私有变量定义 */ CDC_HandleTypeDef hUsbDeviceFS; uint8_t buffer[60 * 1024]; // 60K字节缓冲区 /* 函数声明 */ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USB_OTG_FS_PCD_MT8201_Init(void); int main(void) { /* MCU Configuration--------------------------------------------------------*/ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_USB_OTG_FS_PCD_MT8201_Init(); /* Infinite loop */ while (1) { // 等待上位机下发指令 if (receivedCommand()) { // 读取ADC数据并存储到缓冲区 readADCData(buffer, sizeof(buffer)); // 发送数据 CDC_Transmit_FS(&hUsbDeviceFS, buffer, sizeof(buffer)); } } } /* 函数实现 */ void SystemClock_Config(void) { // ... 系统时钟配置代码 ... } static void MX_GPIO_Init(void) { // ... GPIO初始化代码 ... } static void MX_USB_OTG_FS_PCD_MT8201_Init(void) { // ... USB初始化代码 ... } bool receivedCommand(void) { // ... 检查是否收到上位机下发指令的代码 ... } void readADCData(uint8_t *buffer, uint32_t size) { // ... 读取ADC数据的代码 ... }
请根据实际项目情况修改代码,并进行测试。
解决 无用评论 打赏 举报
悬赏问题
- ¥15 pychram安装jupyter插件
- ¥60 悬赏破解越狱iphone4s中360保险箱密码遗忘
- ¥20 ARKts悬浮窗和快捷方式问题
- ¥15 linux中nginx服务器提示not found on accelerator,如何解决?(语言-php|操作系统-linux)
- ¥15 comparecluster没有办法kegg
- ¥15 远程访问linux主机超时
- ¥15 odoo17存货管理优势于中国国内该行业传统ERP或MES的详细解读和举例
- ¥15 CPU卡指令整合指令数据都在图片上
- ¥15 odoo17处理受托加工产品
- ¥15 如何用MATLAB编码图三的积分