打印

关于c8051f020的双串口通信

[复制链接]
5035|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
king_dan|  楼主 | 2012-7-30 17:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在利用f020的Uart1接收解析GPS(达伽马的SR-088V)并通过Uart0发送PC时发现,无论GPS是否有数据进来,通过串口小助手看到的结果都是FF,已排除硬件上的原因(硬件我用的是新华龙提供的开发板套件),也用其他的范例程序测试过,2个串口都能正常收发,复位也没问题,现将自己的程序贴上,请各位大侠帮忙看看,到底哪里有错误
//22.1184MHz外晶振,Uart1 9600波特率用于接收GPS,Uart0 1200波特率发送PC
#include<C8051F020.h>
#define uchar unsigned char
#define uint unsigned int

sbit neg=P0^4;  //通过这个管脚输出一个低脉冲
bit flag;             //串口收发标志位



bit ReceivingF = 0;
bit EndF = 0;
bit GGAF = 0;

uchar GPS_time[9];          //UTC时间
uchar xdata GPS_wd[12];     //纬度
uchar xdata GPS_jd[13];     //经度
uchar GPS_alt[8];           //海拔
uchar GPS_sv[3];            //使用卫星
uchar idata GPS[46];    //将各提取数据合并,便于输出

uchar Segment;              //逗号计数
uchar Bytes_counter;
//段字节计数器
uchar Command;

void GPGGA(uchar);      //解析GPGGA段语句
void gps(uchar);
void Creat_GPS();

void Creat_GPS(void)       //将上述5个解析出的GPS数组合1
{
  uint i,j,k,l,m;
  for(i=0;i<9;i++)
  {
  
GPS[i]=GPS_time[i];
  }
  for(j=0;j<12;j++)
  {
  
GPS[j+9]=GPS_wd[j];
  }
  for(k=0;k<13;k++)
  {
  
GPS[k+21]=GPS_jd[k];
  }
  for(l=0;l<3;l++)
  {
  
GPS[l+34]=GPS_sv[l];
  }
  for(m=0;m<8;m++)
  {
  
GPS[m+37]=GPS_alt[m];
  }
}

void gps(uchar tmp)      
{
  if(tmp == '$')           //起始标志
  {
    Command = 0;
    ReceivingF = 1;
    Bytes_counter = 0;
    Segment = 0;             //清空语句段计数器
    return;
   }
  if(ReceivingF)
  {
    if(tmp == ',')
    {

  ++Segment;
      Bytes_counter = 0;       //清空段字节计数器
      return;

}
    if(tmp == '*')           //收到结束标志
    {

  ReceivingF = 0;
      EndF = 1;
      return;

}
    if(Segment == 0)
    {

  if(Bytes_counter == 4)   //段0,语句类型判断
      switch(tmp)
      {

    case 'G':Command = 1;    //语句类型 $GPGGA
                 GGAF = 1;
        break;
        default:Command = 0;     //非有效数据类型,终止当前数据接收
                ReceivingF = 0;
        break;

   }

}

else
        {

  switch(Command)
          {

    case 1:GPGGA(tmp);
            break;

   }
         }

++Bytes_counter;

   }
       return;
}

void GPGGA(uchar tmp)
{
  switch(Segment)
  {
    case 1:if(Bytes_counter == 2 || Bytes_counter == 5)  //$GPGGA段1,UTC时间,hhmmss(时分秒)格式,取前6位 转换为HH:MM:SS格式

       {

         GPS_time[Bytes_counter] = ':';

         ++Bytes_counter;

        }

       if(Bytes_counter<8)

         GPS_time[Bytes_counter] = tmp;

       GPS_time[8] = '\0';

break;

case 2:if(Bytes_counter == 3)  //$GPGGA 段2处理 纬度ddmm.mmmm(度分)格式

       {

         GPS_wd[Bytes_counter] = '.'; //接收第二个字节后插入'.'

         ++Bytes_counter;

         GPS_wd[11] = '\0';

        }

       if(Bytes_counter == 0)

         ++Bytes_counter;

       GPS_wd[Bytes_counter] = tmp;

break;

case 3:GPS_wd[0] = tmp;       //$GPGGA第3段处理 纬度半球N(北半球)或S(南半球)

break;

case 4:if(Bytes_counter == 4) //$GPGGA 段4处理 经度dddmm.mmmm(度分)格式

        {

          GPS_jd[Bytes_counter] = '.';  //接收第3个字节后插入'.'

          ++Bytes_counter;

          GPS_jd[12] = '\0';

         }

        if(Bytes_counter == 0)

          ++Bytes_counter;

        GPS_jd[Bytes_counter] = tmp;

break;

case 5:GPS_jd[0] = tmp;       //$GPGGA第5段处理 经度半球E(东经)或W(西经)

break;

case 7:if(Bytes_counter<2)    //$GPGGA第7段处理? 正在使用解算位置的卫星数量(00~12)(前面的0也将被传输)

          GPS_sv[Bytes_counter] = tmp;

        GPS_sv[2] = '\0';

break;

case 9:if(Bytes_counter<7)    //$GPGGA第9段处理 海拔高度(-9999.9~99999.9)

        {

          GPS_alt[Bytes_counter] = tmp;

          GPS_alt[Bytes_counter+1] = '\0';

         }

break;

default:break;
   }
}

void Timer_Init()
{
    CKCON     = 0x60;
}

void UART0_Init()     //Send
{
    PCON      = 0x00;

SCON0     = 0x50;
    T2CON     = 0x34;
    RCAP2L    = 0xC0;
    RCAP2H    = 0xFD;
}

void UART1_Init()    //Receive
{
    SCON1     = 0x50;
    T4CON     = 0x34;
    RCAP4L    = 0xB8;
    RCAP4H    = 0xFF;
}

void Port_IO_Init()
{
    XBR0      = 0x04;

XBR1      = 0x00;
    XBR2      = 0x44;
    P0MDOUT   = 0x05;
}

void Oscillator_Init()
{
    int c = 0;
    OSCXCN    = 0x67;
    for (c = 0; c < 3000; c++);  
    while ((OSCXCN & 0x80) == 0);
    OSCICN    = 0x88;
}

void Init_Device(void)  //各功能初始化,这块我是通过SILICON自带的configure wizard写入的,自己也反复验证过,没问题
{
    Timer_Init();
    UART0_Init();

UART1_Init();
    Port_IO_Init();
    Oscillator_Init();
}

void Delay()
{
  uint b;
  for(b=0;b<60000;b++);
}

void Uart1_ISR(void)interrupt 20   //从这里开始到下面的Send_String,我怀疑问题出在这里,通过UART0的DEBUG窗口看,SBUF0一直是00没变过
{ uchar king;
  if((SCON1&0x01)==0x01)
  {
    SCON1&=0xFE;

king=SBUF1;

gps(king);

flag=1;
   }
}

void Send0_Char(uchar ch)
{
  SBUF0 = ch;                             
  while(TI0 == 0);                        
  TI0 = 0;                                
}

void Send_String(uchar *str,uint Len)
{
  uint a=0;
  do
  {
    Send0_Char(*(str+a));
    a++;
  }
  while(a<Len);
}

void main(void)
{
    WDTCN     = 0xDE;
    WDTCN     = 0xAD;     //关狗

Init_Device();
    EIE2=0x40;
  //开启串口1中断,即ES1=1

IE=0x80;
  //开总中断,即EA=1
    while(1)
    {
      neg=1;
      {

    if(flag==1)

{

flag=0;

Creat_GPS();

Send_String(GPS,46);

}

  }
      Delay();
      neg=0;
     }
}

相关帖子

沙发
dlyt_test001| | 2012-7-31 08:31 | 只看该作者
这么长的程序,估计没有人有时间看!
还是把你的流程图写出来,让大家帮看看!

使用特权

评论回复
板凳
ayb_ice| | 2012-7-31 10:21 | 只看该作者
都搞GPS了,还串口。。。

使用特权

评论回复
地板
阮天宇00| | 2012-7-31 17:58 | 只看该作者
先把程序写的规范,不然别人没法帮你。
我有时候左东西调不通了,老程序员基本几下就找出问题来了。一方面是老程序员厉害,一方面是我写的很规范。

PS:别人不包括我,你比我高端多了呵呵。
不过我这个菜鸟,倒是能把程序写的非常清晰。

使用特权

评论回复
5
xuqiyang126| | 2012-7-31 21:07 | 只看该作者
呵呵,来看看的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

18

帖子

0

粉丝