0331631 发表于 2010-10-11 22:27:09

求助 关于串口通讯 LPC2132 如果程序接收的数据大于程序设定的接收位 如何

具体现象:
LPC2132程序设置接受PC发送的 6位数据,并返回给PC接收的6位数据 。但是如果,PC一次发送8位数据给LPC2132,则第一次接收的数据为PC发送的前6位数据,第二次PC发送8位数据值LCP2132的时候,返回的数据为前一次接收的最后一位数据+但前接收的前5位数据!查看手册中解释 U0RBR 为只读,那我如何做才能把 多余的数据舍弃?


uint8 UART0_SeceiveByte (void)
{        uint8 data;
        while((U0LSR&0x01)==0);         //µÈ´ýÊý¾Ý½ÓÊÕ
        data=U0RBR;
        return (data);

}

void get_com0(uint8*s,uint32 n)
{
        int nm;
        for(nm=0;nm<n;nm++)
        //for (;n>0;n--)
        {
        jshou[(nm)]=UART0_SeceiveByte();
        }


}

void send_com0(uint8 const *aa,uint32 n)
{
//while(1)
// {
int nm1;
for (nm1=0;nm1<n;nm1++)
{
//if(*aa=='\0')break;
UART0_SendByte (jshou[(nm1)]);
}

}

int main (void)
{
        int k;
        int m,i;
       
        char *tem11;
        char *tem00,jieshou;
       
        int   biaozhi;
        uint8 kan1,kan2;
        float fa,fb,fc,fd,fe;
       
       
       
        biaozhi=0;
        shi=19;
        fen=13;
        miao=0;
        //PINSEL0 = 0x00000000;                // &Eacute;è&Ouml;&Atilde;&sup1;&Uuml;&frac12;&Aring;&Aacute;&not;&frac12;&Oacute;GPIO
        PINSEL0 = 0x00000005;          // &sup1;&Uuml;&frac12;&Aring;&Aacute;&not;&frac12;&Oacute;&acute;&reg;&iquest;&Uacute;UART0
        PINSEL1 = 0x00000000;       
        PINSEL2 = 0x00000004;          //&Eacute;è&Ouml;&Atilde;&sup1;&Uuml;&frac12;&Aring;&Aacute;&not;&frac12;&Oacute;GPIO       
        IO0DIR = 0x00000000 ;
        IO0CLR = 0x00000000 ;
        IO0SET = 0x00000000 ;
        IO0CLR = 0x00000000 ;       
       
        UART0_Init();                               
        while (1)
        {
               get_com0(jshou,6);
                DelayNS(10);               
               send_com0(jshou,6);
               DelayNS(10);
                if ((U0LSR&0x01)==0) IO1CLR|=(1<<17);
                else IO1CLR|=(1<<17);
        }
        return -1;

}

A-smith 发表于 2010-10-11 22:55:56

U0FCR 这个寄存器 可以清除 FIFO 中的数据bit1 置位是 Rx FIFObit2 是Tx FIFO


另外你也可以把接收FIFO 设置大点 比如 8/14然后软件屏蔽掉不用的

0331631 发表于 2010-10-12 21:11:09

回复【1楼】A-smith
u0fcr 这个寄存器 可以清除 fifo 中的数据bit1 置位是 rx fifobit2 是tx fifo
另外你也可以把接收fifo 设置大点 比如 8/14然后软件屏蔽掉不用的
-----------------------------------------------------------------------

谢谢

如果使用U0FCR寄存器的bit2 位清除fifo中的数据,那么在什么时候清除这个判断就比较难把握了。
第二种把接收点设置大点的啊,考虑还是会有点小问题,例如设置为接受12个数据,第一次发送8个,第二次发送8个那么接收到的数据就是第一次发送的8个+第二次发送的4个。循环下去的话就无法判断哪个数据是正确的了? 当然这个前提是没有约定数据格式是以何种格式开始,和结束!

A-smith 发表于 2010-10-12 21:55:15

1 FIFO 只能设置成 1 4 8 14 4种中的一种

2 给数据包加上包头包尾和效验=来区分不同的数据包   虽然增加了数据长度但是可靠性高

0331631 发表于 2010-10-12 22:24:31

回复【3楼】A-smith
-----------------------------------------------------------------------

再次感谢您的耐心指导!
目前使用的查询方式接收数据!正在思考如何写程序,串口程序是新事物,正在一边根据例程测试。一边学习!
页: [1]
查看完整版本: 求助 关于串口通讯 LPC2132 如果程序接收的数据大于程序设定的接收位 如何