今天再用HAL库做简单的串口DMA发送时突然出现了一个小问题,感觉有点意思,以此记录; 一开始时再主程序中直接测试串口功能的, 如下发送: HAL_UART_Transmit_DMA(&huart2, (uint8_t *)'AT+NAME=helloworld', strlen('AT+NAME=helloworld'); 发送顺利,串口另一端的设备应答一切顺利,既然测试正常,就开始进行功能开发;于是再启动设备的时候准备 MCU 的UNIQUE ID修改一下名称,于是有了如下的 方法: #define _NAME 'AT+NAME=' void SetName(void) {undefined uint8_t str[48] = {0}; sprintf((char *)str, '%sSimulator-%02X-%02X-%02X', _NAME, *((uint32_t *)0x1FFF7590), \ HAL_UART_Transmit_DMA(&huart2, (uint8_t *)str, strlen(str)); } 于是奇怪的事情发生了,HAL_UART_Transmit_DMA调用一切正常,串口设备竟然没有回应,刚才测试的时候还是好的呢? 换上测试代码,重新测试,一切OK, 反复来回切换,确定了上面的代码有问题;于是跟踪了进去,发现HAL_UART_Transmit_DMA 接收的参数内容都正常, 一步步下来,突然发现了这么一句代码: 这就让我猜测 DMA发送应该是一种异步模式;跟踪进去感觉可能性就更明显了,这应该是跟DMA发送机制相关,明显我欠缺了一些基础,既然判定了原因,于是直接将局部变量 uint8_t str[48] = {0}; 设置为static,再重新编译运行,果然一切顺利; 一个小小的问题,反应了硬件与软件的结合,感觉有点意思,以此为记; |
|