单片机与上位机通信协议的制定_第1页
单片机与上位机通信协议的制定_第2页
单片机与上位机通信协议的制定_第3页
单片机与上位机通信协议的制定_第4页
单片机与上位机通信协议的制定_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机与上位机通信协议的制定而通信协议又要分固定长度和不定长度两种本文所介绍的协议属于简单的固定字长的通信协议!下行协议由四个字节构成起始字PRE命令字ORD值VAL终止字END .附注1byte1byte1byte1byteBBHAAH(ORD SATA)01H1EEH模式1:闲暇02HEEH模式2:温度米集03HEEH模式3:温度米集向上位机传送米集值:04H1EEH1模式4: PWM测试BBHDDH(ORD PWM)valueEEHPWM占空比值修改指令BBHFFH(ORD TEM)valueEEH目标温度操纵指令下述函数是C#中封装的串口通信类中的发送函数的封装public void

2、SerSendCommu(byte orderDef, byte data)参数1为命令字,参数二为要发送的数据,需要时可直截了当调用Byte BSendTemp = new ByteSEND_LENTH;BSe ndTemp0 = PRE;BSe ndTemp1 = orderDef;BSe ndTemp2 = data;BSe ndTemp3 = END;this.serialPort1.Write(BSendTemp, 0, SEND_LENTH);下位机中用中断方式接收字符,本文用的是 GCC 语言,下面是串口接 收数据中断ISR(USART_RXC_vect)/ 串口接收中断unsi

3、gned char status,data;status = UCSRA;/* 第一读取 UCSRA 的值,再读取 UDR 值,顺序不能颠倒,否则读取 UDR 后的 UCSRA 的/值即会改变 *data = UDR;if(!Uart_RecvFlag)/ 判定缓存中的数据是否读完,读完则接收指令 if(status&(1FE)|(1PE)|(1DOR)=0) rx_bufferrx_counter=data;rx_counter+;switch(rx_counter)case 1:if(data!=USART_BEGIN_STX) rx_counter=0; break;case 4:rx_

4、counter=0;if(data=USART_END_STX)Uart_RecvFlag=1;break;break;case 0xDD:/PWM 值修改指令OCR2=rx_buffer2;break;case OxFF:/初始温度设定break;Uart_RecvFlag=0;/随后进行执行指令 上行协议的制定! 和下行协议差不多一致!/串口发送缓冲区变量声明volatile unsigned char tx_bufferTX_BUFFER_SIZE;/ 定义串口发送缓冲区 volatile unsigned char tx_wr_index=0,tx_rd_index=0,tx_coun

5、ter=0;/rx_wr_in dex写指针,rx_rdndex读指针,rx_counter缓冲区数据个数/USART 发送函数void USART_Transmit(unsigned char data)/发送数据函数while(tx_counter=TX_BUFFER_SIZE);/ 输出缓冲区满,等待 asm(cli);if(tx_counter|(UCSRA & DATA_REGISTER_EMPTY)=0)tx_buffertx_wr_index=data; if(+tx_wr_index=TX_BUFFER_SIZE) tx_wr_index=0;+tx_counter;elseU

6、DR = data;asm(sei);/发送中断服务程序ISR(USART_TXC_vect)/USART 发送数据中断if(tx_counter)-tx_counter;UDR=tx_buffertx_rd_index; if(+tx_rd_index=TX_BUFFER_SIZE) tx_rd_index=0;在 C# 编写的上位机中,利用串口接收事件响应方法定义 serialPort1.ReceivedBytesThreshold= RECEIVE_LENTH;在时刻响应事件中调用协议分析处理函数serialPortCaculate(来分析协议private void serialPor

7、t1_DataReceived(object sender, SerialDataReceivedEventArgs e)voker(delegate1.BytesToRead;t = inNumSData.ToString();erialPortCaculate(ref dataID);VAL:this.label_dispzedNum.Invoke(new MethodIn/匿名方法int inNumSData=0;tryinNumSData = this.serialPortthis.lab_serial_bufin_diplay.Tex/串行数据处理/图像显示byte dataID = 0x00; double temp = this.sswitch(dataID)case TEMbreak;default:t his.serialPort1.DiscardInBuffer()br eak;catch );/ 接收转换协议 ,接收数据时直截了当调用 private double serialPortCaculate(ref byte dataID) Byte BReceiveTemp = new ByteRECEIVE_LENTH;for (int i = 0; i RECEIVE_LENTH; i+)/ 接 收定长数据字符串

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论