通信协议单片机(单片机串口通信协议)

      最后更新:2024-03-11 07:21:59 手机定位技术交流文章

      单片机中所说的通信协议是什么?

      单片机通信协议 现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。其中就涉及到通信的过程。在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等。1.自定义数据通信协议这里所说的数据协议是建立在物理层之上的通信数据包格式。所谓通信的物理层就是指我们通常所用到的RS232、RS485、红外、光纤、无线等等通信方式。在这个层面上,底层软件提供两个基本的操作函数:发送一个字节数据、接收一个字节数据。所有的数据协议全部建立在这两个操作方法之上。通信中的数据往往以数据包的形式进行传送的,我们把这样的一个数据包称作为一帧数据。类似于网络通信中的TCPIP协议一般,比较可靠的通信协议往往包含有以下几个组成部分:帧头、地址信息、数据类型、数据长度、数据块、校验码、帧尾。帧头和帧尾用于数据包完整性的判别,通常选择一定长度的固定字节组成,要求是在整个数据链中判别数据包的误码率越低越好。减小固定字节数据的匹配机会,也就是说使帧头和帧尾的特征字节在整个数据链中能够匹配的机会最小。通常有两种做法,一、减小特征字节的匹配几率。二、增加特征字节的长度。通常选取第一种方法的情况是整个数据链路中的数据不具有随即性,数据可预测,可以通过人为选择帧头和帧尾的特征字来避开,从而减小特征字节的匹配几率。使用第二种方法的情况更加通用,适合于数据随即的场合。通过增加特征字节的长度减小匹配几率,虽然不能够完全的避免匹配的情况,但可以使匹配几率大大减小,如果碰到匹配的情况也可以由校验码来进行检测,因此这种情况在绝大多说情况下比较可靠。地址信息主要用于多机通信中,通过地址信息的不同来识别不同的通信终端。在一对多的通信系统中,可以只包含目的地址信息。同时包含源地址和目的地址则适用于多对多的通信系统。数据类型、数据长度和数据块是主要的数据部分。数据类型可以标识后面紧接着的是命令还是数据。数据长度用于指示有效数据的个数。校验码则用来检验数据的完整性和正确性。通常对数据类型、数据长度和数据块三个部分进行相关的运算得到。最简单的做法可是对数据段作累加和,复杂的也可以对数据进行CRC运算等等,可以根据运算速度、容错度等要求来选取。2.上位机和下位机中的数据发送物理通信层中提供了两个基本的操作函数,发送一个字节数据则为数据发送的基础。数据包的发送即把数据包中的左右字节按照顺序一个一个的发送数据而已。当然发送的方法也有不同。在单片机系统中,比较常用的方法是直接调用串口发送单个字节数据的函数。这种方法的缺点是需要处理器在发送过程中全程参与,优点是所要发送的数据能够立即的出现在通信线路上,能够立即被接收端接收到。另外一种方法是采用中断发送的方式,所有需要发送的数据被送入一个缓冲区,利用发送中断将缓冲区中的数据发送出去。这种方法的优点是占用处理器资源小,但是可能出现需要发送的数据不能立即被发送的情况,不过这种时延相当的小。对于51系列单片机,比较倾向于采用直接发送的方式,采用中断发送的方式比较占用RAM资源,而且对比直接发送来说也没有太多的优点。以下是51系列单片机中发送单个字节的函数。void SendByte(unsigned char ch){SBUF = ch;while(TI == 0);TI = 0;}上位机中关于串口通信的方式也有多种,这种方式不是指数据有没有缓冲的问题,而是操作串口的方式不同,因为PC上数据发送基本上都会被缓冲后再发送。对于编程来说操作串口有三种方式,一、使用windows系统中自带的串口通信控件,这种方式使用起来比较简单,需要注意的是接收时的阻塞处理和线程机制。二、使用系统的API直接进行串口数据的读取,在windows和linux系统中,设备被虚拟为文件,只需要利用系统提供的API函数即可进行串口数据的发送和读取。三、使用串口类进行串口操作。在此只介绍windows环境下利用串口类编程的方式。CSerialPort是比较好用的串口类。它提供如下的串口操作方法:void WriteToPort(char* string, int len);串口初始化成功后,调用此函数即可向串口发送数据。为了避免串口缓冲所带来的延时,可以开启串口的冲刷机制。3.下位机中的数据接收和协议解析下位机接收数据也有两种方式,一、等待接收,处理器一直查询串口状态,来判断是否接收到数据。二、中断接收。两种方法的优缺点在此前的一篇关于串口通信的文章中详细讨论过。得出的结论是采用中断接收的方法比较好。数据包的解析过程可以设置到不同的位置。如果协议比较简单,整个系统只是处理一些简单的命令,那么可以直接把数据包的解析过程放入到中断处理函数中,当收到正确的数据包的时候,置位相应的标志,在主程序中再对命令进行处理。如果协议稍微复杂,比较好的方式是将接收的数据存放于缓冲区中,主程序读取数据后进行解析。也有两种方式交叉使用的,比如一对多的系统中,首先在接收中断中解析“连接”命令,连接命令接收到后主程序进入设置状态,采用查询的方式来解析其余的协议。以下给出具体的实例。在这个系统中,串口的命令非常简单。所有的协议全部在串口中断中进行。数据包的格式如下: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;// 状态机复位}else if(state_machine == 1){if(rcvdat == 0xAA) // 接收到帧头第二个数据state_machine = 2;elsestate_machine = 0;// 状态机复位}else if(state_machine == 2){if(rcvdat == 0x7E) // 接收到帧头第三个数据state_machine = 3;elsestate_machine = 0;// 状态机复位}else if(state_machine == 3){sumchkm = rcvdat; // 开始计算累加、异或校验和xorchkm = rcvdat;if(rcvdat == m_SrcAdr)// 判断目的地址是否正确state_machine = 4;elsestate_machine = 0;}else if(state_machine == 4){sumchkm += rcvdat;xorchkm ^= rcvdat;if(rcvdat == m_DstAdr)// 判断源地址是否正确state_machine = 5;elsestate_machine = 0;}else if(state_machine == 5){lencnt = 0;// 接收数据计数器rcvcount = rcvdat;// 接收数据长度sumchkm += rcvdat;xorchkm ^= rcvdat;state_machine = 6;}else if(state _machine == 6 || state _machine == 7){m_ucData[lencnt++] = rcvdat; // 数据保存sumchkm += rcvdat;xorchkm ^= rcvdat;if(lencnt == rcvcount)// 判断数据是否接收完毕state_machine = 8;elsestate_machine = 7;}else if(state_machine == 8){if(sumchkm == rcvdat)// 判断累加和是否相等state_machine = 9;elsestate_machine = 0;}else if(state_machine == 9){if(xorchkm == rcvdat)// 判断异或校验和是否相等state_machine = 10;elsestate_machine = 0;}else if(state_machine == 10){if(0x0D == rcvdat) // 判断是否接收到帧尾结束符{retval = 0xaa;// 置标志,表示一个数据包接收到}state_machine = 0; // 复位状态机}此过程中,使用了一个变量state_machine作为协议状态机的转换状态,用于确定当前字节处于一帧数据中的那个部位,同时在接收过程中自动对接收数据进行校验和处理,在数据包接收完的同时也进行了校验的比较。因此当帧尾结束符接收到的时候,则表示一帧数据已经接收完毕,并且通过了校验,关键数据也保存到了缓冲去中。主程序即可通过retval的标志位来进行协议的解析处理。接收过程中,只要哪一步收到的数据不是预期值,则直接将状态机复位,用于下一帧数据的判断,因此系统出现状态死锁的情况非常少,系统比较稳定,如果出现丢失数据包的情况也可由上位机进行命令的补发,不过这种情况笔者还没有碰到。对于主程序中进行协议处理的过程与此类似,主程序循环中不断的读取串口缓冲区的数据,此数据即参与到主循环中的协议处理过程中,代码与上面所述完全一样。4.上位机中的数据接收和命令处理上位机中数据接收的过程与下位机可以做到完全一致,不过针对不同的串口操作方法有所不同。对于阻赛式的串口读函数,例如直接进行API操作或者调用windows的串口通信控件,最好能够开启一个线程专门用于监视串口的数据接收,每接收到一个数据可以向系统发送一个消息。笔者常用的CSerialPort类中就是这样的处理过程。CSerialPort打开串口后开启线程监视串口的数据接收,将接收的数据保存到缓冲区,并向父进程发送接收数据的消息,数据将随消息一起发送到父进程。父进程中开启此消息的处理函数,从中获取串口数据后就可以把以上的代码拷贝过来使用。CSerialPort向父类发送的消息号如下:#define WM_COMM_RXCHAR WM_USER+7 // A character was received and placed in the input buffer.因此需要手动添加此消息的响应函数:afx_msg LONG OnCommunication(WPARAM ch, LPARAM port);ON_MESSAGE(WM_COMM_RXCHAR, OnCommunication)响应函数的具体代码如下:LONG CWellInfoView::OnCommunication(WPARAM ch, LPARAM port){int retval = 0;rcvdat = (BYTE)ch;if(state_machine == 0) // 协议解析状态机{if(rcvdat == 0x55) // 接收到帧头第一个数据state_machine = 1;elsestate_machine = 0;// 状态机复位}else if(state_machine == 1){if(rcvdat == 0xAA) // 接收到帧头第二个数据state_machine = 2;elsestate_machine = 0;// 状态机复位......5.总结 以上给出的是通信系统运作的基本雏形,虽然简单,但是可行。实际的通信系统中协议比这个要复杂,而且涉及到数据包响应、命令错误、延时等等一系列的问题,在这样的一个基础上可以克服这些困难并且实现出较为稳定可靠的系统
      单片机与别的单片机或者设备及电脑之间传输数据,就需要一个通讯协议,有I2C,SPI,AUSART等协议,具体可协议内容可网上查找。
      你是要串口通信协议嘛?还有IIC,SPI,等呢
      用我个人理解说一下吧,这个协议一般都是自己订的吧,比如我发一个字符串,总长度为13字节,然后开头和结尾都用‘~’表示,占用了两个字节,剩下的11个字节可以表示要发的内容,而上位机和下位机进行通信,或两单片机进行通信时,内部程序在接收模块处将收到的信息进行程序判断,如果判断出开头是~然后才开始接收,当再次收到~,时停止接收,再进行程序校验,这些大部分要体现在程序里,按自己的要求来定,不然那不轻易被人破解了,那还有个什么意思呀,呵呵,仅个人理解 ,欢迎交流。
      单片机中所说的通信协议是什么?

      51单片机串口通信,和I2C串口通信协议有什么区别和相同

      串口通信准确的说叫RS232通信,串口通信和I2C都是串行通信,但串口通信是RS232协议,I2C通信是遵循I2C协议,举个简单例子,从A到B有条路,一个人走路过去,一个人坐车过去。串行通信就是相当于路,RS232和I2C协议相当于走路和坐车两种不同的方式 赞同
      方式1时,SM2一般设置为 0SM2=1,则只有收到有效的停止位时才激活RI。我知道的就这些了,你可以参考一下以上内容来自“飘仙建站论坛”追问 这个我也知道,不过还是谢谢
      51单片机串口通信,和I2C串口通信协议有什么区别和相同

      网络通信协议和单片机通信协议有什么区别

      可以说:没有不同;也可以说:完全不同!网络通信协议和单片机通信协议都是协议,也就是在通讯过程中,都需要这个标准,需要按照这样的格式传输数据。 记住,所谓协议,就是要求你传输数据用的格式,有一些格式是你自己定义的,有的为了兼容,就是通用,就用一些标准协议,比如TCP/IP协议。定义某个协议,就是要满足你的通讯要求,没有太复杂的概念。
      EIA-232、EIA-422和EIA-485标准简介 最被人们熟悉的串行通信技术标准是EIA-232、EIA-422和EIA-485,也就是以前所称的RS-232、RS-422和RS-485。由于EIA提出的建议标准都是以“RS”作为前缀,所以在工业通信领域,仍然习惯将上述标准以RS作前缀称谓。 EIA-232、EIA-422和EIA-485都是串行数据接口标准,最初都是由电子工业协会(EIA)制订并发布的,EIA-232在1962年发布,后来陆续有不少改进版本,其中最常用的是EIA-232-C版。EIA-232目前EIA-232是PC机与通信工业中应用最广泛的一种串行接口。EIA-232被定义为一种在低速率串行通信中增加通信距离的单端标准。EIA-232采取不平衡传输方式,即所谓单端通信。标准规定,EIA-232的传送距离要求可达50英尺(约15米),最高速率为20kbps。EIA-422由于EIA-232存在传输距离有限等不足,于是EIA-422诞生了。EIA-422标准全称是“平衡电压数字接口电路的电气特性”,它定义了一种平衡通信接口,将传输速率提高到10Mbps,传输距离延长到4000英尺(约1219米),并允许在一条平衡总线上连接最多10个接收器。当然,EIA-422也有缺陷: 因为其平衡双绞线的长度与传输速率成反比,所以在100kbps速率以内,传输距离才可能达到最大值,也就是说,只有在很短的距离下才能获得最高传输速率。一般在100米长的双绞线上所能获得的最大传输速率仅为1Mbps。另外有一点必须指出,在EIA-422通信中,只有一个主设备(Master),其余为从设备(Salve),从设备之间不能进行通信,所以EIA-422支持的是点对多点的双向通信。EIA-485 为扩展应用范围,EIA于1983年在EIA-422基础上制定了EIA-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-485-A标准。 由于EIA-485是从EIA-422基础上发展而来的,所以EIA-485许多电气规定与EIA-422相仿,如都采用平衡传输方式、都需要在传输线上接终接电阻、最大传输距离约为1219米、最大传输速率为10Mbps等。但是,EIA-485可以采用二线与四线方式,采用二线制时可实现真正的多点双向通信,而采用四线连接时,与EIA-422一样只能实现点对多点通信,但它比EIA-422有改进, 无论四线还是二线连接方式总线上可接多达32个设备。
      网络协议比较复杂,是很多人共同努力的结果,我们只要会用就可以了;单片机协议比较简单,一般需要我们自己根据要求去实现,最简单的是串口通信协议,什么时候读,什么时候发,一般都是靠时序来完成的
      通信协议(communications protocol)是指双方实体完成通信或服务所必须遵循的规则和约定。协议定义了数据单元使用的格式,信息单元应该包含的信息与含义,连接方式,信息发送和接收的时序,从而确保网络中数据顺利地传送到确定的地方。协议主要由以下三个要素组成: 语法:“如何讲”,数据的格式、编码和信号等级(电平的高低)。语义:“讲什么”,数据内容、含义以及控制信息。定时:速率匹配和排序。 “网络通信协议”指的是连接不同操作系统和不同硬件体系结构的互联网络引提供通信支持,是一种网络通用语言。它是分层实现的。没有特定的“单片机通信协议”,由于单片机的硬件和软件资源都有限,只能实现“网络通信协议”中的物理层的协议,如:RS232/485等。而网络通信协议几乎每层都有相关的协议。一定要说区别的话,最大的区别就是网络通信协议包含单片机通信协议,单片机实现的通信协议只是网络通信协议物理层的一部分。
      网络通信协议和单片机通信协议有什么区别

      单片机串口通信是否必须要建立通信协议?单片机之间通信是否也必须建立通信协议?

      单片机进行串口通信,需要设置波特率和一些电气参数(一般定义1BIT起始位,8BIT数据位,1BIT停止位,无奇偶校验位)这些就属于通信协议的范畴。再则,单片机接收的数据,需要进行处理,所以你必须要知道接收的数据代表的意义,这也是通信协议,只是不太严格的通信协议。而比较严格的通信协议则一般会定义起始字节,数据字节,校验字节,结束字节等等,这点对单片机来说到不是必须的,你只要知道接收到相应的数据,能够进行处理就好了。
      51单片机的话可以通过外接一个max232与电脑通信通信的协议都是硬件弄好了的,用户只需要用就行了;如果是51单片机之间的通讯可以直接把两块单片机的RXD和TXD交叉连接就可以 但是这样的传输距离比较近而且容易受到干扰,想要远距离传输还是需要用到232或者是422、485传输协议。说明:232的软件协议是单片机内部固化好的,硬件协议需要用到232芯片。
      不要协议收到的是一系列的数据流。但你对数据流的处理,必须有最简单的定义,如数据流的起始字节,数据流的长度,数据流的CRC检验。这就是协议。 如果两个单片机之间的通信内容能用一个字节来表达清楚,则不需要任何协议;就相当于两个单片机之间定义了255种状态而忆。 谢谢!
      双方必须约定:波特率、位数、奇偶校验的方式。 这些是最基本的串口通信协议。
      那是必须的,没有协议怎么知道收到的数是什么意思?
      单片机串口通信是否必须要建立通信协议?单片机之间通信是否也必须建立通信协议?

      单片机协议是什么

      就是把数据分成一帧一帧地传送,一帧数据由发送起始位、数据位、校验码位、结束位组成,接收方按照这种数据结构解析出数据。这就是单片机通信协议。
      单片机协议是什么

      本文由 在线网速测试 整理编辑,转载请注明出处,原文链接:https://www.wangsu123.cn/news/299336.html

          热门文章

          文章分类