打印

问一个关于串口接收程序的问题

[复制链接]
3487|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zuidaeji|  楼主 | 2007-12-13 22:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
通讯协议格式为协议:  包标识(0xaa)    设备号(1BYET)     包长度(命令字+命令项的字节数)    命令字(1byte)   命令项   校验和(2byte,累加和)
ReceivePack[]存储的是接收的数据。



/***************************************/
/*      串口中断                       */
/***************************************/
 void COMint() interrupt 4 using 0
  {     unsigned  char  TrCount=0,ReCount=0x08;
       ES=0;
      if(!TI)
         {     if(SBUF==0xAA)
              TR0=1;
                   while(ReCount--)
                 { if(RI)
                   {ReceivePack[TrCount++]=SBUF;
                        TH0=0x0;                        /*超时*/
                    TL0=0x0;
                      RI=0;}
                      if(TF0)
                     {  timeout=1;    //超时
                       break;  }
                  }
                
              if(ReceivePack[1]==0x01)      //本机数据
                 RXbit=1;                 //接收数据处理标志
               else  
                 RXbit=0; 
              }       
   RI=0;
   TR0=0;
   TF0=0;
   TH0=0;          
   TL0=0;
   ES=1;
  
 }
/***********************************/
/*-------接收处理程序--------------*/
/***********************************/
void     COM_Process(void)
 {unsigned  char  i,j;
  EA=0;
  i=ReceivePack[2];
  j=ReceivePack[i+3]*0x100+ReceivePack[i+4];
  for(sum=0;i>0;i--)
   { sum+=ReceivePack[2+i];}

   if(sum==j)
   {  switch(ReceivePack[3])
         {case 0x01:
            TX[3]=0x03;
            State();   /*上传门状态*/
            break;
          case 0x02:          /*开门*/
            P2=ReceivePack[4];
            P1=ReceivePack[5];
            TX[3]=0xCC;   /*确认接收*/
            Transmit();
            P2=P1=0xff;
            break;
          case 0xCC:      /*收到确认*/

            break;
          case 0xEE:

            Transmit();   /*重传数据*/
            break;
          default:
            TX[3]=0xEE;   /*接收出错报警*/
            Transmit();   
            break;
          }
       }
    else
      {TX[3]=0xEE;   /*接收出错报警*/
       Transmit();}
    EA=1;
    }

现在的问题是用串口调试助手调试时,单片机主动上传的状态数据是正确的。但给单片机发送一个命令时,返回的数据就没有正确过。
 
 



相关帖子

沙发
zuidaeji|  楼主 | 2007-12-13 22:16 | 只看该作者

现在的问题是

用串口调试助手调试时,单片机主动上传的状态数据是正确的。但给单片机发送一个命令时,返回的数据就没有正确过。

使用特权

评论回复
板凳
hotpower| | 2007-12-13 22:26 | 只看该作者

没必要关中断~~~因为发送用TI=1就不会干坏事了~~~

使用特权

评论回复
地板
zuidaeji|  楼主 | 2007-12-13 22:32 | 只看该作者

没看懂

我在中断里接收数据,接收时把中断继续打开我的问题就能得到解决???

使用特权

评论回复
5
hotpower| | 2007-12-13 22:57 | 只看该作者

我认为串口程序不是这样写的~~~附例程一份,注意TI=1的用法~~~

使用特权

评论回复
6
zuidaeji|  楼主 | 2007-12-14 00:29 | 只看该作者

谢谢楼上



写串口的思维方式明白点了,串口中断一次,就是处理一个数据!!!

使用特权

评论回复
7
hotpower| | 2007-12-14 00:46 | 只看该作者

本来是要收选美证的,现在不需要了~~~到文潭看串口大杂烩

仔细找...有51,avr,pic,arm,dsp,spcomm,mscomm,hotcomm


不过要用Keil的话,下面的工具太方便了~~~和真的一样!!!

根本不需要上硬件~~~
相关链接:http://blog.**/hotpower/14048/message.aspx

使用特权

评论回复
8
zuidaeji|  楼主 | 2007-12-14 00:55 | 只看该作者

HH~~

老兄你不应该把人家的IP一起复制进去吧

使用特权

评论回复
9
hotpower| | 2007-12-14 01:03 | 只看该作者

哈哈~~~才看见,不过KeilCOMTool2确实是个好玩意~~~

使用特权

评论回复
10
农民讲习所| | 2007-12-14 09:44 | 只看该作者

void COMint() interrupt 4 using 0的using 0去掉先

使用特权

评论回复
11
computer00| | 2007-12-14 10:16 | 只看该作者

using 0害死人

使用特权

评论回复
12
我想IC| | 2007-12-14 16:59 | 只看该作者

好想学!请高手指教!!!!!

使用特权

评论回复
13
dai_weis| | 2007-12-14 17:11 | 只看该作者

求喜欢用using 0 的人还是少用了,要不会死的很惨

使用特权

评论回复
14
hellomcu| | 2007-12-14 22:23 | 只看该作者

用这种结构

void COMint() interrupt 4 using 0
 {   
       if(TI)
       {
            ....
        }


        if(RI)
        {
          ......
          }
  
 }

超时在定时器内计  
先试着发两个字节,对的话再加协议部分  如果项目内容较多,还是不要用using 0了
相关链接:http://shop35088126.taobao.com

使用特权

评论回复
15
zuidaeji|  楼主 | 2007-12-16 00:03 | 只看该作者

谢谢热心群众

 void main(void)
  {Start();           /*初始化*/

     
   State();          /*初始状态上传*/
  
   while(1)
     { if(timeout) 
         {    timeout=0;
            TX[3]=0xEE;   /*接收出错报警*/
            Transmit();      
         }
        else
             if(RXbit)
              {  RXbit=0;
                 COM_Process();
               }
         if(Tds1)
         {    TX[4]=DOPEN2;
              TX[5]=DOPEN1;
              Transmit();
              Tds1=0;
              DOPEN1=DOPEN2=0xFF;
          }
    }
}
/***********************************/
/*----------发送程序--------------*/
/***********************************/
void  Transmit(void)
 {unsigned  char  i,j;
  _nop_();
  _nop_();
  _nop_();
  _nop_();
  EA=0;
  i=TX[2];
  for(sum=0;i>0;i--)
   { sum+=TX[2+i];}
   i=TX[2];
  TX[i+3]=sum/0x100;
  TX[i+4]=sum%0x100;
  for(j=0;j<i+5;)
   {SBUF=TX[j++];
    while(!TI)
      _nop_();
   TI=0;}
  TI=0;
  RI=0;
  EA=1;
  _nop_();
  _nop_();
 }
/***********************************/
/*-------接收处理程序--------------*/
/***********************************/
void     COM_Process(void)
 {unsigned  char  i,j;
  EA=0;
  TrCount=0;
  if(ReceivePack[0]==0xaa&&ReceivePack[1]==0x01)
  {i=ReceivePack[2];
   j=ReceivePack[i+3]*0x100+ReceivePack[i+4];
  for(sum=0;i>0;i--)
   { sum+=ReceivePack[2+i];}

   if(sum==j)
   {  switch(ReceivePack[3])
         {case 0x01:
            TX[3]=0x03;
            State();   /*上传门状态*/
            break;
          case 0x02:          /*开门*/
            P2=ReceivePack[4];
            P1=ReceivePack[5];
            TX[3]=0xCC;   /*确认接收*/
            Transmit();
            P2=P1=0xff;
            break;
          case 0xCC:      /*收到确认*/

            break;
          case 0xEE:

            Transmit();   /*重传数据*/
            break;
          default:
            TX[3]=0xEE;   /*接收出错报警*/
            Transmit();   
            break;
          }
       }
    else
      {TX[3]=0xEE;   /*接收出错报警*/
       Transmit();}
   }
    EA=1;
}

/***************************************/
/*      串口中断                       */
/***************************************/
 void COMint() interrupt 4 
  {       if(RI)
         {  RI=0;    
              ReceivePack[TrCount]=SBUF;
             TrCount++;
             if(TrCount>7)
                RXbit=1;
            }  
 
 }

/***********************************/
/* 初始化                          */
/***********************************/
 void Start(void)
  {RXbit=nRXbit0=nRXbit0=timeout=0;
   EN_1=EN_2=1;
   EN_3=0;
   DOPEN1=DOPEN2=0xFF;
   Tds0=Tds1=0;
   IE0=0;
   TMOD=0x20;
   PCON=0x00;                                 
   SCON=0x50;
   TH1=0x0fd;       /* 9.6k */
   TL1=0x0fd;
   TH0=0x0;        /* Delay-2ms */
   TL0=0x0;
   TR0=0;          /* 关闭定时器0 */
   TR1=1;          /* 允许定时器1 */
   ET1=0;
   PX0=1;
   ES=1;
   EA=1;
   }

使用特权

评论回复
16
ra_rabbit| | 2007-12-16 15:10 | 只看该作者

得好好分析串口收到单片机发出的数据,对应你的发送程序

使用特权

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

本版积分规则

9

主题

79

帖子

0

粉丝