[技术问答] 细究uart

[复制链接]
1581|10
 楼主| shen_hao 发表于 2017-7-7 15:54 | 显示全部楼层 |阅读模式
这是我写的一个一个uart1 向uart2传数据的程序为什么uart只收到16bytes的数据,很奇怪啊。
我做了一个大胆的猜想:uart1向uart2传输数据,传的很快,uart2来不及接收,rx FIFO又只能存16byte的数据,或者说FIFO满了,缺没有去清理,清理不是应该是硬件的事情吗
void UART2_IRQHandler(void)
{
    uint8_t u8InChar = 0xFF;
                uint32_t u32IntSts = UART2->INTSTS;
if(u32IntSts & UART_INTSTS_RDAINT_Msk)
    {
        /* Get all the input characters */
        while(UART_IS_RX_READY(UART2))
        {
            /* Get the character from UART Buffer */
            u8InChar = UART_READ(UART2);

            printf("%c ", u8InChar);
     }
}
void UART1_IRQHandler(void)
{
   uint32_t u32IntSts = UART1->INTSTS;
    if(u32IntSts & UART_INTSTS_THREINT_Msk)
    {      
                        while(num < 52)
                        {                                       
                          while(UART_IS_TX_FULL(UART1));
                                //CLK_SysTickDelay(1000);
                                UART_WRITE(UART1, g_u8RecData[num]);
                                printf("%d,%c\t",num,g_u8RecData[num]);
                                num++;                                
                   }       
      //UART_Write(UART1,g_u8RecData,52);                       
                        UART_WRITE(UART1, '0');
                       
                        g_bWait1 = FALSE;       
    }
}
yubsh 发表于 2017-7-7 16:07 | 显示全部楼层
不要试图在循环中使用printf这类函数,它的运行时间太长了。把接收数据收到一个数组中,然后再检查它的内容。。

评论

解释很好,这也是为什么本人一直强调要知悉底层,基础要扎实的原因  发表于 2017-7-7 16:36
 楼主| shen_hao 发表于 2017-7-7 19:36 | 显示全部楼层
yubsh 发表于 2017-7-7 16:07
不要试图在循环中使用printf这类函数,它的运行时间太长了。把接收数据收到一个数组中,然后再检查它的内容 ...

 楼主| shen_hao 发表于 2017-7-7 19:41 | 显示全部楼层
yubsh 发表于 2017-7-7 16:07
不要试图在循环中使用printf这类函数,它的运行时间太长了。把接收数据收到一个数组中,然后再检查它的内容 ...

我把printf去掉后,果然好了很多,不过是接收了26个,还有一半没接收到
643757107 发表于 2017-7-7 21:27 | 显示全部楼层
学习了,这个总结的很到位。
yubsh 发表于 2017-7-8 16:34 | 显示全部楼层
shen_hao 发表于 2017-7-7 19:41
我把printf去掉后,果然好了很多,不过是接收了26个,还有一半没接收到

我没有细看你是怎样弄的,初步感觉你的用法还是有问题的。串口接收的过程,是当接收电路接收到一个字节,就会产生一次接收中断,而不是收到一堆数据后才产生一次中断。既然有中断产生,那么你在任何位置,使用任何查询都是不对的——比如while
PC机有串口硬件缓冲区的都是如此,单片机也应该不差。
所以,你的中断接收函数,每次响应时,只能接收一个字节——你把这个字节移到你的程序缓冲区,处理它,而不是其他。
 楼主| shen_hao 发表于 2017-7-8 20:17 | 显示全部楼层
yubsh 发表于 2017-7-8 16:34
我没有细看你是怎样弄的,初步感觉你的用法还是有问题的。串口接收的过程,是当接收电路接收到一个字节, ...

是的,我懂你的意思了。谢谢。
zhuomuniao110 发表于 2017-7-8 21:32 | 显示全部楼层
多多尝试,这个我也不是很懂。
oufuqiang 发表于 2017-7-10 15:43 | 显示全部楼层
要开环形缓冲区,而且两个串口的波特率要一样,或者UART1的小于UART2的

天灵灵地灵灵 发表于 2017-7-11 20:08 | 显示全部楼层
环形缓存确实是个好想法,不过是不少要用链表的概念?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

230

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部