DMA串口问题
定义函数:#define OK
#ifdef OK
void sendstring1(unsigned char * fmt, ...)
{va_list arg_ptr;va_start(arg_ptr, fmt);vsprintf(pu8UR1DMATxBuffer,fmt, arg_ptr);va_end(arg_ptr);
DMA_UART1_ClearTxFlag();
DMA_UART1_SetTxAmount(strlen(pu8UR1DMATxBuffer)-1);DMA_UART1_TriggerTx();
}
#else
void sendstring1(unsigned char * fmt, ...)
{va_list arg_ptr;va_start(arg_ptr, fmt);vsprintf(pu8UR1DMATxBuffer,fmt, arg_ptr);va_end(arg_ptr);
{unsigned char c=0;while((DMA_UART1_CheckTxFlag()==0)&&(c<200)){c++;delay_us(1000);};}
DMA_UART1_ClearTxFlag();
DMA_UART1_SetTxAmount(strlen(pu8UR1DMATxBuffer)-1);DMA_UART1_TriggerTx();
}
#endif
main中:
#ifdef OK
sendstring1("abcd");while(DMA_UART1_CheckTxFlag()==0);DMA_UART1_ClearTxFlag();
sendstring1("efgh");while(DMA_UART1_CheckTxFlag()==0);DMA_UART1_ClearTxFlag();
sendstring1("ijkl\r\n");while(DMA_UART1_CheckTxFlag()==0);DMA_UART1_ClearTxFlag();
#else
sendstring1("abcd");
sendstring1("efgh");
sendstring1("ijkl\r\n");
#endif
当宏定义为OK时,得到了我预期的效果:
当未定义oK时,发送顺序有问题:
代码附后
请大师指点!!!
关于DMA串口通信中sendstring1函数的定义问题,以下是对代码逻辑及潜在问题的专业分析与建议:
该函数旨在通过DMA方式发送字符串数据,其核心逻辑涉及可变参数处理、缓冲区操作及DMA触发。从代码结构看,函数采用条件编译(#ifdef OK)区分不同实现路径,其中若定义OK,则使用DMA方式进行数据传输;否则,采用轮询方式发送。
在#define OK分支中,函数首先通过valist和vsprintf将格式化字符串写入全局缓冲区pu8UR1DMATxBuffer。随后调用DMAUART1ClearTxFlag()清除DMA发送标志位,再通过DMAUART1SetTxAmount()设置待发送数据长度,并触发DMA传输。此流程符合DMA通信的基本逻辑,但需注意以下几点:
1. 缓冲区有效性:确保pu8UR1DMATxBuffer为全局或静态变量,且大小足够容纳目标字符串。若为局部变量,可能导致未定义行为。
2. 长度计算:strlen(pu8UR1DMATxBuffer)-1用于排除字符串结束符\0,但需确认vsprintf实际写入内容是否包含该字符。若未正确处理,可能导致发送数据不完整或错误。
3. DMA配置:需确保DMAUART1SetTxAmount()与DMA通道配置匹配,包括传输方向、数据宽度及缓冲区地址。若配置不当,可能引发DMA传输失败或异常。
4. 状态检查:DMAUART1CheckTxFlag()用于判断DMA是否完成,但在轮询模式下(#else分支),若未及时检查状态或超时处理,可能导致死循环或响应延迟。
在#else分支中,函数通过轮询方式逐字节发送数据,但代码存在语法错误:`while((DMAUART1CheckTxFlag()==0)&&(c
[本文内容由国芯人工智能辅助生成,仅供参考]
是否超时机制引发,干掉试下
ercircle 发表于 2025-7-25 09:35
是否超时机制引发,干掉试下
跟前面我发的顺序不同的结果一样 我其实是想知道DMA方式下如何判断信息已经发出,如果没发出,就要等待,否则,就可以继续发。但是,非OK宏定义情况下,也确实要判断DMA_UART1_CheckTxFlag()的状态,不判断发出的是乱码。但是,增加了对DMA_UART1_CheckTxFlag()的判断后,发送的顺序变了,这个我实在搞不懂,希望都能得到支持!!
另外,增加一个变量计数,目的是为了防止第一次是0,如果是这样,等待一下就可以了,现在的方法是在主循环之外先发个信息,这个也无所谓。
现在主要是发送顺序问题,这个我实在搞不懂了。 中书门下平章事 发表于 2025-7-25 21:13
我其实是想知道DMA方式下如何判断信息已经发出,如果没发出,就要等待,否则,就可以继续发。但是,非OK宏 ...
还有个问题,你应该等发完了再改变pu8UR1DMATxBuffer内容,不然别人正在发你改了不就乱了~
可以看看传统库函数例程包,有大量DMA示例
问题解决了,程序中先写入了pu8UR1DMATxBuffer,这个时候,发送缓冲区的内容变化了,然后才判断DMA是否结束,两条语句反过来就解决了。
建议养成好的编码习惯,不要代码挤在一行~~,不好看也不方便排错。
ercircle 发表于 2025-7-25 21:37
建议养成好的编码习惯,不要代码挤在一行~~,不好看也不方便排错。
感谢指点。也许是我的习惯,这样可以看的内容更多些{:4_268:}
页:
[1]