打印

c8051f040串口通讯

[复制链接]
1771|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
 #include <C8051F040.h>                
#include <stdio.h>
#include "macroandconst.h"
#define SYSCLK       22118400L
#define BAUDRATE     9600            // 波特率9600
#define ID 0x01 //单片机地址

        sfr16 RCAP2 = 0xCA;                    // 定时器2
        sfr16 TMR2 = 0xCC;   

uint8 state_flag=0;  //通信协议解析状态标志,初始化为0
uint8 retval;  //通信协议解析函数返回值,初始化为0
uint8 cmd;  //指令码
uint8 Data[5];  //数据码
uint8 data_count;  //数据长度码
uint8 rec_data;
bit busy;                                  //串口发送完成标志位
  void SendString(uchar *s,uchar as);          //串口字符串发送
  void UART0_Init (void);                  //串口0 初始化
  void TxSend(uchar d);                  //串口字符发送
  void jiexi();
  void s_miao();
  //////////////////////////////////
  void s_miao()
{                 
        uchar sendcmd;   //下位机向PC发送的命令码
           switch (retval)
    {
        case 1:      //数据发送错误,请求PC重发
          {
             sendcmd=2;  //向PC发送的重发数据命令,PC识**向下位机重发数据包。
                         TxSend(0xce);
                         TxSend(0x00);
                         retval=0;   //标志清零,防止重复扫描,重复执行。  2013/9/24
                         break;

          }
        case 2:      //数据发送成功,执行命令
          {
             switch (cmd)    //命令解码
                         {
                                 case 0x01:
                                {
                                      SendString(Data,5);
                                        cmd=0x00;
                                        break;
                                }
                                case 0x02:
                                {
                                       TxSend(0xed);
                                        cmd=0x00;
                                        break;
                                }
                                case 0x03:
                                {
                                       TxSend(0xed);
                                        cmd=0x00;
                                        break;
                                }                 
                          }       
            }       
                  
                       retval=0;   //标志清零,防止重复扫描,重复执行。
      }         
}
  /////////////////////////////////////////
  void jiexi()
  {
   switch (state_flag)
     {
        case 0:
          {
             if(rec_data == 0x2A)     // 是否帧头第一个数据
               state_flag = 1;
                          
             else
               state_flag = 0;    // 标志复位
             break;      
          }
        
        case 1:
          {
             if(rec_data == ID)    // 判断目的地址是否正确
               {
                  state_flag = 2;
                  
               }   
             else
               state_flag = 0;   // 标志复位
             break;
          }
        case 2:
          {
             state_flag = 3;
             Data[0]=rec_data;  //指令码存储
             break;
          }        
        case 3:
          {
            
             Data[1]=rec_data;
            
               state_flag=4;
           
             break;
          }
        
        case 4:
          {
              Data[2]=rec_data;  
              
                 state_flag=5;
                                       
               
              break;
          }
        case 5:
          {
             Data[3]=rec_data;
               state_flag=6;
            
             break;
          }
        case 6:
          {                Data[4]=rec_data;
             if (rec_data==0x0D)
               {
                                           retval=2;   //置接收成功标志,数据包传送成功。
                                        state_flag=0;
                           }
             else
               state_flag=0;
             break;
          }

     }
  }
////////////////////////////////////////////////
void UART0_Interrupt (void) interrupt 4
{        
  //uchar se_data;        //串口接收缓存          
    if (RI0 == 1)
     {
   
              RI0= 0;      //清除接收完成标
                   rec_data=SBUF0;
                  jiexi();
     }

   if (TI0 == 1)                  
   {
      TI0 = 0;                           
          busy = 0;
      }         
}
/////////////////////////////////////////////////////////
void UART0_Init (void)
{
   uchar SFRPAGE_SAVE;

   SFRPAGE_SAVE = SFRPAGE;            
   SFRPAGE = TMR2_PAGE;

   TMR2CN = 0x00;                     
   TMR2CF = 0x08;                     
   RCAP2 = - ((long) SYSCLK/BAUDRATE/16);
   TMR2 = RCAP2;
   TR2= 1;                           

   SFRPAGE = UART0_PAGE;

   SCON0 = 0x50;                                                      
   SSTA0 = 0x15;                       
                           
        ES0 = 1;
   IP |= 0x10;
   SFRPAGE = SFRPAGE_SAVE;            
}
///////////////////////////////////////////////////////////
void TxSend(uchar d)
{         

    SFRPAGE = UART0_PAGE;
    while (busy);               //等待上个数据发送完成
    busy = 1;
    SBUF0 = d;                //发送数据
  
}
////////////////////////
   void SendString(uchar *s,uchar as)
{
    while (as)                  //判断字符串结束标志
    {          as--;
        TxSend(*s++);          //发送字符
    }
}
/////////////////////////////
C:\Users\Administrator\Desktop
为啥  串口助手发送2A 01 01 01 00 2A 0D 总是会回复相同的呢 ?  这才是我想要的回复的数据 01 01 00 2A 0D

相关帖子

沙发
若是射手|  楼主 | 2013-12-22 19:04 | 只看该作者
C:\Users\Administrator\Desktop OXB_T~]B34OL8(~JGIS_EZ5.jpg

使用特权

评论回复
板凳
若是射手|  楼主 | 2013-12-22 19:07 | 只看该作者
这是串口助手回复

OXB_T~]B34OL8(~JGIS_EZ5.jpg (38.17 KB )

OXB_T~]B34OL8(~JGIS_EZ5.jpg

使用特权

评论回复
地板
若是射手|  楼主 | 2013-12-22 19:08 | 只看该作者

使用特权

评论回复
5
若是射手|  楼主 | 2013-12-22 19:09 | 只看该作者
求指点   菜鸟求指点

使用特权

评论回复
6
lirunze| | 2013-12-22 19:25 | 只看该作者
是收到的不对吗?

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
若是射手 + 2
7
若是射手|  楼主 | 2013-12-22 20:04 | 只看该作者
lirunze 发表于 2013-12-22 19:25
是收到的不对吗?

不是接收错误   而是我发送的数据   会回复回来

使用特权

评论回复
8
ningling_21| | 2013-12-23 14:35 | 只看该作者
这个不是可以调试的吗,单步运行不就知道了...

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
若是射手 + 2
9
若是射手|  楼主 | 2013-12-23 14:45 | 只看该作者
ningling_21 发表于 2013-12-23 14:35
这个不是可以调试的吗,单步运行不就知道了...

keil  单步调试,这是程序里面其中的一个源文件,单步的时候进不去,调试不熟啊

使用特权

评论回复
10
白马王子1| | 2013-12-23 14:46 | 只看该作者
代码好长

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
若是射手 + 2
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

25

帖子

0

粉丝