金牌会员
 
- 积分
- 1790
- 金钱
- 1790
- 注册时间
- 2018-3-26
- 在线时间
- 294 小时
|
1金钱
本帖最后由 htao 于 2019-12-9 17:11 编辑
硬件是 STM32F103C8 ,调用两个串口发送函数时,发现串口助手接收的速率差别很大...
用串口3发送的数据,
第一个发送函数是:
- void USART3_Send_Data(u8 *buf,u8 len)
- {
- u8 t = 0;
-
- for(t=0;t<len;t++) //循环发送数据
- {
- while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
- USART_SendData(USART3,buf[t]);
- }
-
- while(USART_GetFlagStatus(USART3, USART_FLAG_TC) == RESET);
- }
复制代码
第二个发送函数是:
- void USART3_printf (char *fmt, ...)
- {
- u16 i = 0;
- va_list arg_ptr;
- va_start(arg_ptr, fmt);
- vsnprintf((char *)USART3_TX_BUF, USART3_SEND_LEN+1, fmt, arg_ptr);
- va_end(arg_ptr);
- while ((i < USART3_SEND_LEN) && USART3_TX_BUF[i])
- {
- USART_SendData(USART3, (u8) USART3_TX_BUF[i++]);
- while (USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);
- }
- }
复制代码
结果第二个发送的速度,远远大于第一个速率,这是为啥啊。应该不是 sprintf 和 memset影响了,注释这两行,速率也没有加快。
|
最佳答案
查看完整内容[请看2#楼]
首先由清楚TEX与TC标志位对不同;
第二个发送使用判断TEX,就是发送寄存器是否为空,相当于使用了一个FIFO缓存,从时序上去看TXD发送的字节是一个紧挨着一个连续发送.
第一个TC是判断是否发送完成,去看TXD发送对字节与字节之间存在空闲.
|