打印
[ZLG-ARM]

请教各位大侠:LPC2368 的UART2数据接收

[复制链接]
1625|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
kernel99|  楼主 | 2008-6-12 14:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  用LPC2368的 UART2 接的一个千分表 
 
  接口的接口协议:

  4800波特率,1位起始位,8位数据位,1位停止位,无校验。
千分表的数据以ASCII码发送,每个测量数据结束后以回车符结束,不间断主动发送,频率是3次/秒。

   数据没有帧头,测量数据的ASCII码有10个字节,即开头是正号或负号,然后是七个数字、一个小数点及回车符,发送的字节是固定的。
一帧数据结束后是“回车符”的ASCII码。

   ★问题是:程序调试时,能接到10个字节,可是有的时候接收的字节顺序乱了.

   比如说,现在测量的数据是0.034mm, 正常的数据传过来,接收后应该是
2B(+), 30(0), 30(0), 30(0), 30(0), 30(0),2E(.),30(0),33(3),34(4),0D(回车)
  
   但有时候,就会出现代表 "+"号的0X2B,就不是第1个字节,等次序乱的情况

   注释:括号内是为方便大家看,写的每个字节代表的含义

程序代码如下:

   //接收数据的中断部分

void UART2Handler (void) __irq 
{
      
    static        INT8U    i;
    
    
    if ((U2IIR & 0x0F) == 0x04)                        // 设置接收到新的数据标志 //
    {
        
        if(i<10)
        {
            rcvbuf2 = U2RBR;                    // 读取FIFO的数据,并清除中断 //
            i+=1;
            if(i==10)
            {
                                
                                                      rcv_new = 1;
                                        
                                
                
                i=0;
            }//针对i=10;    
        }    
    }    
        
    
    VICVectAddr = 0x00;                                // 中断处理结束 //
}
       


   //初始化部分,波特率设置为4800
INT32U UART2Init( INT32U baudrate )
{
    INT32U Fdiv;
    PCONP |= 0x01000000;
    PINSEL0 =(PINSEL0&0xff0fffff )|0x00500000;       /* RxD2 and TxD2 */

    U2LCR = 0x83;        /* 8 bits, no Parity, 1 Stop bit */
    Fdiv = ( Fpclk / 16 ) / baudrate ;    /*baud rate */
    U2DLM = Fdiv / 256;                            
    U2DLL = Fdiv % 256;
    U2LCR = 0x03;        /* DLAB = 0 */
    U2FCR = 0x07;        /* Enable and reset TX and RX FIFO. */
    
    if ( install_irq( UART2_INT, (void *)UART2Handler, HIGHEST_PRIORITY+1 ) == FALSE )
    {
      return (FALSE);
    }
        
    U2IER=0x01;//2008年5月8号,中断使能由用到采集千分表时开启
    return (TRUE);
 
}



相关帖子

沙发
zlgarm| | 2008-6-13 15:48 | 只看该作者

回复

 kernel99  您好: 

这些程序没有什么问题,建议您在ADS调试环境下单步调试跟踪,相信可以找到问题原因。

on duty:zlgarm_LBH

使用特权

评论回复
板凳
kernel99|  楼主 | 2008-6-13 23:48 | 只看该作者

谢谢,哪位大侠还有好的建议!

使用特权

评论回复
地板
kernel99|  楼主 | 2008-6-18 22:58 | 只看该作者

自己顶下,大侠们提些建议

使用特权

评论回复
5
zlgarm| | 2008-6-19 14:00 | 只看该作者

楼主您好

在程序中,i并没有如您所想的清零。
        if(i<10) /*最大只能运行到9*/
        {
            rcvbuf2 = U2RBR;                    // 读取FIFO的数据,并清除中断 //
            i+=1;
            if(i==10)     /*这句得不到运行,因而并没有将i清零*/
            {
                                
                                                      rcv_new = 1;
                                        
                                
                
                i=0;
            }//针对i=10;    
        }
On duty:glh    

使用特权

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

本版积分规则

93

主题

177

帖子

1

粉丝