设计单片机通讯协议论文(非常经典)_第1页
设计单片机通讯协议论文(非常经典)_第2页
设计单片机通讯协议论文(非常经典)_第3页
设计单片机通讯协议论文(非常经典)_第4页
设计单片机通讯协议论文(非常经典)_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

如何设计单片机常用通信协议论文

目录1.自定义数据通信协议 32.上位机和下位机中的数据发送 33.下位机中的数据接收和协议解析 44.上位机中的数据接收和命令处理 85.总结 9

方式交叉使用的,比如一对多的系统中,首先在接收中断中解析“连接”命令,连接命令接收到后主程序进入设置状态,采用查询的方式来解析其余的协议。以下给出具体的实例。在这个系统中,串口的命令非常简单。所有的协议全部在串口中断中进行。数据包的格式如下:0x55,0xAA,0x7E,0x12,0xF0,0x02,0x23,0x45,SUM,XOR,0x0D其中0x55, 0xAA,0x7E为数据帧的帧头,0x0D为帧尾,0x12为设备的目的地址,0xF0为源地址,0x02为数据长度,后面接着两个数据0x23,0x45,从目的地址开始结算累加、异或校验和,到数据的最后一位结束。协议解析的目的,首先判断数据包的完整性,正确性,然后提取数据类型,数据等数据,存放起来用于主程序处理。代码如下:if(state_machine==0) //协议解析状态机{if(rcvdat==0x55) //接收到帧头第一个数据state_machine=1;elsestate_machine=0; //状态机复位}elseif(state_machine==1){if(rcvdat==0xAA) //接收到帧头第二个数据state_machine=2;elsestate_machine=0; //状态机复位}elseif(state_machine==2){if(rcvdat==0x7E) //接收到帧头第三个数据state_machine=3;elsestate_machine=0; //状态机复位}elseif(state_machine==3){sumchkm=rcvdat; //开始计算累加、异或校验和xorchkm=rcvdat;if(rcvdat==m_SrcAdr) //判断目的地址是否正确state_machine=4;elsestate_machine=0;}elseif(state_machine==4){sumchkm+=rcvdat;xorchkm^=rcvdat;if(rcvdat==m_DstAdr) //判断源地址是否正确state_machine=5;elsestate_machine=0;}elseif(state_machine==5){lencnt=0; //接收数据计数器rcvcount=rcvdat; //接收数据长度sumchkm+=rcvdat;xorchkm^=rcvdat;state_machine=6;}elseif(state_machine==6||state_machine==7){m_ucData[lencnt++]=rcvdat; //数据保存sumchkm+=rcvdat;xorchkm^=rcvdat;if(lencnt==rcvcount) //判断数据是否接收完毕state_machine=8;elsestate_machine=7;}elseif(state_machine==8){if(sumchkm==rcvdat) //判断累加和是否相等state_machine=9;elsestate_machine=0;}elseif(state_machine==9){if(xorchkm==rcvdat) //判断异或校验和是否相等state_machine=10;elsestate_machine=0;}elseif(state_machine==10){if(0x0D==rcvdat) //判断是否接收到帧尾结束符{retval=0xaa; //置标志,表示一个数据包接收到}state_machine=0; //复位状态机}此过程中,使用了一个变量state_machine作为协议状态机的转换状态,用于确定当前字节处于一帧数据中的那个部位,同时在接收过程中自动对接收数据进行校验和处理,在数据包接收完的同时也进行了校验的比较。因此当帧尾结束符接收到的时候,则表示一帧数据已经接收完毕,并且通过了校验,关键数据也保存到了缓冲去中。主程序即可通过retval的标志位来进行协议的解析处理。接收过程中,只要哪一步收到的数据不是预期值,则直接将状态机复位,用于下一帧数据的判断,因此系统出现状态死锁的情况非常少,系统比较稳定,如果出现丢失数据包的情况也可由上位机进行命令的补发,不过这种情况笔者还没有碰到。对于主程序中进行协议处理的过程与此类似,主程序循环中不断的读取串口缓冲区的数据,此数据即参与到主循环中的协议处理过程中,代码与上面所述完全一样。4.上位机中的数据接收和命令处理上位机中数据接收的过程与下位机可以做到完全一致,不过针对不同的串口操作方法有所不同。对于阻赛式的串口读函数,例如直接进行API操作或者调用windows的串口通信控件,最好能够开启一个线程专门用于监视串口的数据接收,每接收到一个数据可以向系统发送一个消息。笔者常用的CSerialPort类中就是这样的处理过程。CSerialPort打开串口后开启线程监视串口的数据接收,将接收的数据保存到缓冲区,并向父进程发送接收数据的消息,数据将随消息一起发送到父进程。父进程中开启此消息的处理函数,从中获取串口数据后就可以把以上的代码拷贝过来使用。CSerialPort向父类发送的消息号如下:#defineWM_COMM_RXCHARWM_USER+7//Acharacterwasreceivedandplacedintheinputbuffer.因此需要手动添加此消息的响应函数:afx_msgLONGOnCommunication(WPARAMch,LPARAMport);ON_MESSAGE(WM_COMM_RXCHAR,OnCommunication)响应函数的具体代码如下:LONGCWellInfoView::OnCommunication(WPARAMch,LPARAMport){intretval=0;rcvdat=(BYTE)ch;if(state_machine==0) //协议解析状态机{if(rcvdat==0x55) //接收到帧头第一个数据state_machine=1;elsestate_machine=0; //状态机复位}elseif(state_machine==1){if(rcvdat==0xAA) //

温馨提示

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

评论

0/150

提交评论