求助 关于串口通讯 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; // ÉèÖùܽÅÁ¬½ÓGPIO
PINSEL0 = 0x00000005; // ¹Ü½ÅÁ¬½Ó´®¿ÚUART0
PINSEL1 = 0x00000000;
PINSEL2 = 0x00000004; //ÉèÖùܽÅÁ¬½Ó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;
} U0FCR 这个寄存器 可以清除 FIFO 中的数据bit1 置位是 Rx FIFObit2 是Tx FIFO
另外你也可以把接收FIFO 设置大点 比如 8/14然后软件屏蔽掉不用的 回复【1楼】A-smith
u0fcr 这个寄存器 可以清除 fifo 中的数据bit1 置位是 rx fifobit2 是tx fifo
另外你也可以把接收fifo 设置大点 比如 8/14然后软件屏蔽掉不用的
-----------------------------------------------------------------------
谢谢
如果使用U0FCR寄存器的bit2 位清除fifo中的数据,那么在什么时候清除这个判断就比较难把握了。
第二种把接收点设置大点的啊,考虑还是会有点小问题,例如设置为接受12个数据,第一次发送8个,第二次发送8个那么接收到的数据就是第一次发送的8个+第二次发送的4个。循环下去的话就无法判断哪个数据是正确的了? 当然这个前提是没有约定数据格式是以何种格式开始,和结束! 1 FIFO 只能设置成 1 4 8 14 4种中的一种
2 给数据包加上包头包尾和效验=来区分不同的数据包 虽然增加了数据长度但是可靠性高 回复【3楼】A-smith
-----------------------------------------------------------------------
再次感谢您的耐心指导!
目前使用的查询方式接收数据!正在思考如何写程序,串口程序是新事物,正在一边根据例程测试。一边学习!
页:
[1]