c8051f040串口通讯

[复制链接]
2142|9
 楼主| 若是射手 发表于 2013-12-22 19:02 | 显示全部楼层 |阅读模式
  1. #include <C8051F040.h>               
  2. #include <stdio.h>
  3. #include "macroandconst.h"
  4. #define SYSCLK       22118400L
  5. #define BAUDRATE     9600            // 波特率9600
  6. #define ID 0x01 //单片机地址

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

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

  34.           }
  35.         case 2:      //数据发送成功,执行命令
  36.           {
  37.              switch (cmd)    //命令解码
  38.                          {
  39.                                  case 0x01:
  40.                                 {
  41.                                       SendString(Data,5);
  42.                                         cmd=0x00;
  43.                                         break;
  44.                                 }
  45.                                 case 0x02:
  46.                                 {
  47.                                        TxSend(0xed);
  48.                                         cmd=0x00;
  49.                                         break;
  50.                                 }
  51.                                 case 0x03:
  52.                                 {
  53.                                        TxSend(0xed);
  54.                                         cmd=0x00;
  55.                                         break;
  56.                                 }                 
  57.                           }       
  58.             }       
  59.                   
  60.                        retval=0;   //标志清零,防止重复扫描,重复执行。
  61.       }         
  62. }
  63.   /////////////////////////////////////////
  64.   void jiexi()
  65.   {
  66.    switch (state_flag)
  67.      {
  68.         case 0:
  69.           {
  70.              if(rec_data == 0x2A)     // 是否帧头第一个数据
  71.                state_flag = 1;
  72.                           
  73.              else
  74.                state_flag = 0;    // 标志复位
  75.              break;      
  76.           }
  77.         
  78.         case 1:
  79.           {
  80.              if(rec_data == ID)    // 判断目的地址是否正确
  81.                {
  82.                   state_flag = 2;
  83.                   
  84.                }   
  85.              else
  86.                state_flag = 0;   // 标志复位
  87.              break;
  88.           }
  89.         case 2:
  90.           {
  91.              state_flag = 3;
  92.              Data[0]=rec_data;  //指令码存储
  93.              break;
  94.           }        
  95.         case 3:
  96.           {
  97.             
  98.              Data[1]=rec_data;
  99.             
  100.                state_flag=4;
  101.            
  102.              break;
  103.           }
  104.         
  105.         case 4:
  106.           {
  107.               Data[2]=rec_data;  
  108.               
  109.                  state_flag=5;
  110.                                        
  111.                
  112.               break;
  113.           }
  114.         case 5:
  115.           {
  116.              Data[3]=rec_data;
  117.                state_flag=6;
  118.             
  119.              break;
  120.           }
  121.         case 6:
  122.           {                Data[4]=rec_data;
  123.              if (rec_data==0x0D)
  124.                {
  125.                                            retval=2;   //置接收成功标志,数据包传送成功。
  126.                                         state_flag=0;
  127.                            }
  128.              else
  129.                state_flag=0;
  130.              break;
  131.           }

  132.      }
  133.   }
  134. ////////////////////////////////////////////////
  135. void UART0_Interrupt (void) interrupt 4
  136. {        
  137.   //uchar se_data;        //串口接收缓存          
  138.     if (RI0 == 1)
  139.      {
  140.    
  141.               RI0= 0;      //清除接收完成标
  142.                    rec_data=SBUF0;
  143.                   jiexi();
  144.      }

  145.    if (TI0 == 1)                  
  146.    {
  147.       TI0 = 0;                           
  148.           busy = 0;
  149.       }         
  150. }
  151. /////////////////////////////////////////////////////////
  152. void UART0_Init (void)
  153. {
  154.    uchar SFRPAGE_SAVE;

  155.    SFRPAGE_SAVE = SFRPAGE;            
  156.    SFRPAGE = TMR2_PAGE;

  157.    TMR2CN = 0x00;                     
  158.    TMR2CF = 0x08;                     
  159.    RCAP2 = - ((long) SYSCLK/BAUDRATE/16);
  160.    TMR2 = RCAP2;
  161.    TR2= 1;                           

  162.    SFRPAGE = UART0_PAGE;

  163.    SCON0 = 0x50;                                                      
  164.    SSTA0 = 0x15;                       
  165.                            
  166.         ES0 = 1;
  167.    IP |= 0x10;
  168.    SFRPAGE = SFRPAGE_SAVE;            
  169. }
  170. ///////////////////////////////////////////////////////////
  171. void TxSend(uchar d)
  172. {         

  173.     SFRPAGE = UART0_PAGE;
  174.     while (busy);               //等待上个数据发送完成
  175.     busy = 1;
  176.     SBUF0 = d;                //发送数据
  177.   
  178. }
  179. ////////////////////////
  180.    void SendString(uchar *s,uchar as)
  181. {
  182.     while (as)                  //判断字符串结束标志
  183.     {          as--;
  184.         TxSend(*s++);          //发送字符
  185.     }
  186. }
  187. /////////////////////////////
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 | 显示全部楼层
这是串口助手回复

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| 若是射手 发表于 2013-12-22 19:08 | 显示全部楼层
 楼主| 若是射手 发表于 2013-12-22 19:09 | 显示全部楼层
求指点   菜鸟求指点
lirunze 发表于 2013-12-22 19:25 | 显示全部楼层
是收到的不对吗?

评分

参与人数 1威望 +2 收起 理由
若是射手 + 2

查看全部评分

 楼主| 若是射手 发表于 2013-12-22 20:04 | 显示全部楼层
lirunze 发表于 2013-12-22 19:25
是收到的不对吗?

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

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ningling_21 发表于 2013-12-23 14:35 | 显示全部楼层
这个不是可以调试的吗,单步运行不就知道了...

评分

参与人数 1威望 +2 收起 理由
若是射手 + 2

查看全部评分

 楼主| 若是射手 发表于 2013-12-23 14:45 | 显示全部楼层
ningling_21 发表于 2013-12-23 14:35
这个不是可以调试的吗,单步运行不就知道了...

keil  单步调试,这是程序里面其中的一个源文件,单步的时候进不去,调试不熟啊
白马王子1 发表于 2013-12-23 14:46 | 显示全部楼层
代码好长

评分

参与人数 1威望 +2 收起 理由
若是射手 + 2

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

25

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部