首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

用UART serial port接收数据的一些问题

用UART serial port接收数据的一些问题

  在做一个设计,简单来说就是,用FPGA接收GPS的数据,我用UART serial port。


  GPS是一个卫星控制系统,数据都是ASCII,比如说:$GPGGA,110040,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47
  这个不重要。


  我给UART写了一个中断,每当有数据从GPS发来,产生中断,读取数据并且把储存到buffer里。为了检测程序是不是能够获得数据,我就加了个print的功能,但是运行后,只能收到很多方块~~~~
  说明是有数据进来的,又调试了一下,发现status的rrby bit没有变成过1,也就是说中断没有产生,不知道是为什么?
 
  另外,GPS传输数据的波特率是4800,我的系统中定义的UART波特率是115200。速度比GPS快,我需要把它改成4800吗?不是很懂baud rate这个东西~~~望指教。


  程序如下:


#define quelen  2048
char queue[quelen]; 
int input_index = 0;
int output_index = 0;



static void init_uart_receiver();
static void handle_uart_interrups(void* context, alt_u32 id);



int main(void)
{
int ch;
int temp_index;
char *gga ="GPGGA";


init_uart_receiver();


while(1)
{
  if(output_index != input_index)
   {
    temp_index =output_index;
    if(temp_index >=quelen)
      temp_index=0;
    ch =queue[temp_index];
    output_index =temp_index+1;
   }


  if(ch=='$')
   {
    if(strncmp(gga,&queue[temp_index+1],5)==0)
     printf("%c", queue[temp_index+7]);
   }
}


return 0;
}



static void init_uart_receiver()
{
void* status_ptr;
IOWR_ALTERA_AVALON_UART_CONTROL(UART1_BASE, 0x80);
IOWR_ALTERA_AVALON_UART_STATUS(UART1_BASE, 0x0);
IOWR_ALTERA_AVALON_UART_RXDATA(UART1_BASE, 0x0);
alt_irq_register(UART1_IRQ,status_ptr,handle_uart_interrups);
}



static void handle_uart_interrups(void* context, alt_u32 id)
{
char ch;
int temp_index;


volatile char* status_ptr =(volatile char*)context;
*status_ptr =IORD_ALTERA_AVALON_UART_STATUS(UART1_BASE);


if(IORD_ALTERA_AVALON_UART_STATUS(UART1_BASE) ==0x80)
{
ch =IORD_ALTERA_AVALON_UART_RXDATA(UART1_BASE);
temp_index =input_index;


  if(temp_index>=quelen)
  temp_index =0;
  if(temp_index != output_index)
    {
    queue[temp_index] =ch;
    input_index =temp_index+1;
    }
}


IOWR_ALTERA_AVALON_UART_STATUS(UART1_BASE, 0x0);
}


非常感谢!!

有哪位大侠可以抽空帮我看一下程序吗?

我的程序大致思路是这样的,我只需要接受数据,所以就设置了control的irrdy位为1,
其他status和RXD清0,当有数据近来,status是不是应该自己变成1了?
于是中断就发生了,读取RXD里的数据,并且储存到buffer里(程序里为queue)
为了看结果,我把buffer里的东西,用printf显示到console window上,但是一直出现乱码

是还欠缺什么吗?我自己已经干掉了,不知道是什么问题了,望指教!!!
论坛上有不少人是UART的问题,你和别人交流一下吧,本来是不会出现这样的问题的。
在交流中前进,共同实现nios的应用。
以上问题,偶已经解决了,只是很傻的小错误~~~hohoho
返回列表