这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » UART 请教关于UART的问题

共2条 1/1 1 跳转至

UART 请教关于UART的问题

院士
2006-09-17 18:14:16     打赏
UART 请教关于UART的问题



关键词: 请教     关于     问题    

院士
2006-12-22 22:43:00     打赏
2楼
问 我在编PC机和ARM通过串口通讯的程序,调试中遇到了奇怪的问题。
我在ARM中用Uart_Getch()函数接收字符,用PC机发字符0x55和0xaa,ARM中调用两次Uart_Getch()接收,存到数组RvData[]中。
ARM中的程序如下:
RvData[0]=Uart_Getch();
RvData[1]=Uart_Getch();
奇怪的是:
当我分两次把0x55和0xaa填入上位机程序的发送区,点击“发送”按钮发送后,ARM可以正确地收到两个数据。但是,当我把0x55和0xaa一起填入上位机程序的发送区,点击“发送”按钮发送后,ARM只接收到0x55,RvData[1]=Uart_Getch()这句程序还在等待接收中断,说明0xaa没有接收到,就丢失了。
难道Uart_Getch()还没把0x55从接收缓冲保持寄存器中读出,0xaa就传输到了,造成了0xaa的丢失。

另外,我用上位机给单片机发0x55和0xaa,却可以正确收到这两个数据。按理说,ARM单片机的接收原理都是一样的,都是等待中断的啊。 1: re:ARM比51快啊,你的ARM接收不到是由于你在第二个数据没有进来的时候就去读寄存器了 2: 看看这个函数的原形或者跟踪一下我通常的做法是直接控制硬件,不用系统提供的这些函数。没出现过这种问题。 3: RE:Uart_Getch()的函数原型如下:
char Uart_Getch(void)
{
    if(whichUart==0)
    {        
    while(!(rUTRSTAT0 & 0x1)); //Receive data read
    return RdURXH0();
    }
    else
    {
    while(!(rUTRSTAT1 & 0x1)); //Receive data ready
    return    rURXH1;
    }
}
我觉得这个函数和51不同的是:51的接收中断RI是自己手动清零,而ARM中rUTRSTAT0不是手动清零.
我在Uart_Getch()后加了rUTRSTAT0=rUTRSTAT0&0x0,但是RvData[1]中收到的还不是我想要的0xaa.
我以前用单片机通过串口和ARM通讯,使用Uart_Getch()进行数据接收都没有出过问题,为什么偏偏接收PC机的数据时会出问题啊? 4: 又有了新的问题我现在连续发多个0x55,ARM可以正确接收到.但我发其他数据时,却不能全部收到正确的数据.

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]