注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

一车,一房,一个温暖家

10万左右的车,80平方的房子,这是我奋斗的暖暖的家

 
 
 

日志

 
 

引用 AVR单片机与上位机通信协议的制定(1)   

2015-03-22 15:14:17|  分类: 默认分类 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

单片机和上位机的串口通信协议分为上行协议和下行协议,要分别制定!

上行协议,即由单片机向上位机发送数据。

下行协议,即由上位机向单片机发送数据。

 

而通信协议又要分固定长度和不定长度两种

本文所介绍的协议属于简单的固定字长的通信协议!

 

下行协议由四个字节构成

 

起始字PRE命令字ORD值VAL结束字END附注
1byte1byte1byte1byte 
BBHAAH(ORD_SATA)  单片机状态转换命令标识
  01HEEH模式1:空闲
  02HEEH模式2:温度采集
  03HEEH模式3:温度采集向上位机传送采集值
  04HEEH模式4:PWM测试
BBHDDH(ORD_PWM)valueEEHPWM占空比值修改指令
BBHFFH(ORD_TEM)valueEEH目标温度控制指令

 

上表是简单的上位机对单片机的控制指令

下述函数是C#中封装的串口通信类中的发送函数的封装

 

 

       public void SerSendCommu(byte orderDef, bytedata)//参数1为命令字,参数二为要发送的数

                                                           //据,需要时可直接调用
       {
           Byte[] BSendTemp = new Byte[SEND_LENTH];
           BSendTemp[0] = PRE;
           BSendTemp[1] = orderDef;
           BSendTemp[2] = data;
           BSendTemp[3] = END;
           this.serialPort1.Write(BSendTemp, 0, SEND_LENTH);
       }

 

下位机中用中断方式接收字符,本文用的是GCC语言,下面是串口接收数据中断

 

 ISR(USART_RXC_vect)//串口接收中断
{
 unsigned char status,data;
 status =UCSRA;    //**首先读取UCSRA的值,再读取UDR值,顺序不能颠倒,否则读取UDR后的UCSRA的

                                                //值即会改变**
    data =UDR;
 if(!Uart_RecvFlag)//判断缓存中的数据是否读完,读完则接收指令
 {
  if((status&((1<<FE)|(1<<PE)|(1<<DOR)))==0)
  {
   rx_buffer[rx_counter]=data;
   rx_counter++;
   switch(rx_counter)
   {
    case1:
       if(data!=USART_BEGIN_STX)
        rx_counter=0;
        break;
    case4:
       rx_counter=0;
       if(data==USART_END_STX)
       Uart_RecvFlag=1;
       break;
   }
  }
 
}

 

在单片机主循环程序的最前部分进行指令译码

 

 if(Uart_RecvFlag)//接收到命令
  {
   switch(rx_buffer[1])
   {
    case0xAA://单片机状态命令控制;
      ucWorkStatue=rx_buffer[2];//指令数据

         break;
    case0xDD://PWM值修改指令

      OCR2=rx_buffer[2];
          break;
    case0xFF://初始温度设定
      break;   
   }
   Uart_RecvFlag=0;
  }

//随后进行执行指令

  switch(ucWorkStatue)
  {
   case1://空闲模式
          break;
   case2://测量模式,但不输出
         break;
   case3://测量模式,由串口输出 
          break;
   case4://PWM输出测试   
     break; 
   default:
     break;
  }

 

 这样就可以利用串口对单片机进行在线命令控制了;

 

 

 

  评论这张
 
阅读(18)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018