这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 基础知识 » UART UART串口实验程序,大侠门都来参与参与!!!

共2条 1/1 1 跳转至

UART UART串口实验程序,大侠门都来参与参与!!!

院士
2006-09-17 18:14:16     打赏
UART UART串口实验程序,大侠门都来参与参与!!!



关键词: 串口     实验     程序     大侠     都来     参与    

院士
2006-12-22 22:43:00     打赏
2楼
问 本人做毕业设计是基于ARM7lpc2131的gps的接收与上传,接收gps的数据格式是
RMC指令
这有一程序是这样的
**函数名称:UART0_Init()
**函数功能:串口初始化,设置为8位数据位,1位停止位,无奇偶校验,波特率为115200
**入口参数:无
**出口参数:无
******************************************************
void UART_Init(void)
{  uint16 Fdiv;
   
   U0LCR=0x83;                //DLAB=1,允许设置波特率
   Fdiv=(Fpclk/16)/UART_BPS;  //设置波特率
   U0DLM=Fdiv/256;
   U0DLL=Fdiv%256;
   U0LCR=0x03;

}
/*****************************************************
但是我要接收的gps的数据又是这样的
$GPRMC,085056.996,A,4050.5602,N,11140.5101,E,000.0,172.8,250405,004.6,W*7A
请各位大侠帮帮忙,怎么样改改这段程序.
小生qq:308825966
emil:ysongzuishuai@163.com
多谢来参与!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!: 1: 对0813解码即可 2: 用队列来处理吧使用队列的处理方法,先把数据放在队列中,主程序解析协议。从上面的数据分析可以看出,$GPRMC, 为包头;逗号是分隔符号,也是处理数据的关键。程序中需要处理数值转换,因为串口传送的是二进制数,需要转换成你需要的格式。 3: 谢谢楼上的兄弟能不能说的再具体点,兄弟我现在一头雾水!请高手指教了. 4: ^-^,希望对你有帮助!
unsigned char Buf[BufMax];
unsigned char *p_In;                    //入数指针
unsigned char *p_Out;                    //取数指针
unsigned char m_Num;                    //缓冲区中的个数


//数据接收有p_In 处理,放在Buf

//解析:
static unsigned char Step=0;
static unsigned int Index=0;

if(m_Num)
{ //收到数据
     
     m_Num --;
  
  switch(Step)
  {
       case 0:   
                 if(*p_Out == '$' ){ //收到开始符了
                    Step = 1;
                    Index=0;                    
                 }
                 p_Out ++;
                 break;
       case 1:   if( *(p_Out+Index) == ',')
                 {  //收到逗号                         
                         while(Index)
                         {  //把逗号中间的数据放在一个缓冲中,进行分析
                               *BufTemp ++ = *p_Out ++;
                                Index --;
                         }
                         //分析 :
                         
                      if( '收到结束符 ' ) {Step=0; }  //进行下一个循环
                                               
                   }
                   Index ++;
                   break;
       default:
                break;
    }
} 5: 补充一下:如果数据量很大,m_Num应该定义为int 型,以上只是一个简单的框架,关键是
对 Index 和p_Out 指针的操作,否则容易丢数据;
同时在case 1:中,应该对Index 的数据进行限制,即
if(Index > XXXX){
   Step=0;   //是干扰,重新检测
} 6: 再补充:在实际中,应该注意指针的范围,即p_In  ,p_Out 都应该 Buf[]范围内,
  if(p_Out > Buf + BufMax ) p_Out = Buf;

对if( *(p_Out+Index) == ',') 改成:

  char *p;
  p = p_Out + Index;
  if(p > Buf + BufMax) p = Buf;
  if( *p == ',' )

不知道 对ysongsong  兄弟有无帮助?


                  7: 非常谢谢实在是太谢谢TRUE_ARM 了,我去调试一下,辛苦了,真希望能有很多象TRUE_ARM 这样的人,那么咱们做嵌入的人就都可以互相沟通了,也希望TRUE_ARM 等有知识的人能在ARM上飞起来.呵呵!!!!!!!!

共2条 1/1 1 跳转至

回复

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