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

一车,一房,一个温暖家

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

 
 
 

日志

 
 

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

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

  下载LOFTER 我的照片书  |

上行协议的制定!

和下行协议基本一致!

在AVR单片机程序中定义了串口通信输出缓冲区,缓冲区的字长正好为协议的长度;

 //串口发送缓冲区变量声明
volatile unsigned char tx_buffer[TX_BUFFER_SIZE];//定义串口发送缓冲区
volatile unsigned chartx_wr_index=0,tx_rd_index=0,tx_counter=0;//rx_wr_index写指针,rx_rd_index读指针,rx_counter缓冲区数据个数

//USART发送函数
 void USART_Transmit(unsigned chardata)//发送数据函数
 {
  while(tx_counter==TX_BUFFER_SIZE);//输出缓冲区满,等待
  asm("cli");
  if(tx_counter||((UCSRA& DATA_REGISTER_EMPTY)==0)) 
  {
   tx_buffer[tx_wr_index]=data;
   if(++tx_wr_index==TX_BUFFER_SIZE)
    tx_wr_index=0;
   ++tx_counter;
  }
  else
   UDR =data;
  asm("sei"); 
 }

//发送中断服务程序

ISR(USART_TXC_vect)//USART发送数据中断
{
 if(tx_counter)
 {
  --tx_counter;
  UDR=tx_buffer[tx_rd_index];
  if(++tx_rd_index==TX_BUFFER_SIZE)
  {
   tx_rd_index=0;
  }
 }
  

 

在C#编写的上位机中,利用串口接收事件响应方法定义

serialPort1.ReceivedBytesThreshold = RECEIVE_LENTH;

在时间响应事件中调用协议分析处理函数serialPortCaculate()来分析协议

 

        private void serialPort1_DataReceived(object sender,SerialDataReceivedEventArgs e)
       {

           this.label_dispzedNum.Invoke(new MethodInvoker(delegate
                                                                                            //匿名方法
               int inNumSData=0;
               try
               {
                   inNumSData = this.serialPort1.BytesToRead;

                   this.lab_serial_bufin_diplay.Text = inNumSData.ToString();
                       //串行数据处理
                       //图像显示
                       byte dataID = 0x00;
                       double temp = this.serialPortCaculate(ref dataID);
                       switch(dataID)
                       {
                           caseTEMVAL:                                                               
                                   break;
                           default:
                                this.serialPort1.DiscardInBuffer
()                                  
                               break;
                       }

                   }
               catch
               { }


           }));
       }

       ///////接收转换协议,接收数据时直接调用
       private double serialPortCaculate(ref byte dataID)
       {
           Byte[] BReceiveTemp = new Byte[RECEIVE_LENTH];
           for (int i = 0; i < RECEIVE_LENTH;i++)//接收定长数据字符串
           {
               BReceiveTemp[i] =Convert.ToByte(this.serialPort1.ReadByte());
           }
           dataID=BReceiveTemp[1];
           switch (BReceiveTemp[1])
           {
               case TEMVAL:
               default :
           }
       }

 


 

 

 

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

历史上的今天

在LOFTER的更多文章

评论

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

页脚

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