我使用UART0口接收数据,查询方式,初始化UART如下:
void InitUart0(UINT32 BPS)
{
PCONP |= (0x01 << 3) ;
PINSEL0 &= ~((UINT32)0x0F);
PINSEL0 |= ((UINT32)0x05);
//设定波特率
U0LCR =0x80;
U0DLL=Fpclk/(16*BPS)&0x000000ff;
U0DLM=(Fpclk/(16*BPS)) >>8;
uU0LCR.Bits.DLAB_BIT =0x00;
U0LCR =0x03;
U0FCR =0xC1;
}
主函数里读取数据部分:
if((U0LSR & 0x01) !=0)
{
DataShift();
}
DataShift函数如下
void DataShift()
{
UINT32 UartStatus = 0;
UINT32 RcvCounter = 0;
switch(UartStatus)
{
case FH_STATUS:
if((UINT8)uU0RBR.Word == 0x80)
{
UartStatus++;
}
break;
case DATA_STATUS:
RSData[RcvCounter++].Word=(UINT8)uU0RBR.Word;
if(RcvCounter >3)
{
RcvCounter=0;
UartStatus++;
}
break;
case CB_STATUS:
if((UINT8)uU0RBR.Word == 0x06)
{
TemAndCnt[RcvCounter++] = (UINT8)uU0RBR.Word;
if(RcvCounter >2)
{
RcvCounter = 0;
CanSendFlag = 1;
}
}
UartStatus = 0;
break;
default:
UartStatus = 0;
CanSendFlag = 0;
RcvCounter = 0;
break;
}
}
我认为对U0RBR寄存器每进行一次读操作之后,其中的数据会更新为FIFO里的下一个数据,但是在实际单步调试的时候我发现当往串口发数的时候,U0RBR在每条指令执行的时候就自动更新,我发80,01,02,03,04,05,06,07,08,09,0a这十一个数,到if((UINT8)uU0RBR.Word == 0x80这条指令执行时U0RBR已经为02了。。。我试验了一下rbr[i++] = U0RBR,发现在执行i++命令时U0RBR也更新了一次数据,我对ARM初次接触不理解,东西又催得紧,求大神帮我看下,不胜感激!!!
------解决方案--------------------
你在主函数里面读取,不是一般在中断里面吗?你在串口中断里面执行它,注意在中断一开始就用一个临时变量读取数据,然后随这个临时变量操作
------解决方案--------------------
找厂家提供的库函数。用一次性读出全部FIFO数据的函数,然后自己慢慢处理。