打印
[技术问答]

细究uart

[复制链接]
1307|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这类函数,它的运行时间太长了。把接收数据收到一个数组中,然后再检查它的内容。。

使用特权

评论回复
评论
kingTek 2017-7-7 16:36 回复TA
解释很好,这也是为什么本人一直强调要知悉底层,基础要扎实的原因 
板凳
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个,还有一半没接收到

使用特权

评论回复
5
643757107| | 2017-7-7 21:27 | 只看该作者
学习了,这个总结的很到位。

使用特权

评论回复
6
yubsh| | 2017-7-8 16:34 | 只看该作者
shen_hao 发表于 2017-7-7 19:41
我把printf去掉后,果然好了很多,不过是接收了26个,还有一半没接收到

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

使用特权

评论回复
7
shen_hao|  楼主 | 2017-7-8 20:17 | 只看该作者
yubsh 发表于 2017-7-8 16:34
我没有细看你是怎样弄的,初步感觉你的用法还是有问题的。串口接收的过程,是当接收电路接收到一个字节, ...

是的,我懂你的意思了。谢谢。

使用特权

评论回复
8
zhuomuniao110| | 2017-7-8 21:32 | 只看该作者
多多尝试,这个我也不是很懂。

使用特权

评论回复
9
oufuqiang| | 2017-7-10 15:43 | 只看该作者
要开环形缓冲区,而且两个串口的波特率要一样,或者UART1的小于UART2的

使用特权

评论回复
10
天灵灵地灵灵| | 2017-7-11 20:08 | 只看该作者
环形缓存确实是个好想法,不过是不少要用链表的概念?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

79

主题

230

帖子

2

粉丝