单片机通信协议处理
- 格式:doc
- 大小:39.50 KB
- 文档页数:5
单片机与外部设备的通信协议解读与应用实践单片机是指在一个芯片上集成了中央处理器、存储器、输入输出设备和通信设备等功能的微型计算机系统。
它广泛应用于各种电子设备和嵌入式系统中,实现对外部设备的控制和数据传输。
为了实现单片机与外部设备之间的通信,需要采用一种通信协议,以确保数据的可靠传输和正确解析。
本文将对常见的单片机通信协议进行解读,并结合实例进行应用实践。
一、串行通信协议串行通信协议是一种将数据位逐位地传输的通信方式,常见的串行通信协议包括UART、SPI和I2C等。
1. UART(通用异步收发传输)UART是一种通用的异步串行通信协议,用于单片机与外部设备之间的数据传输。
UART使用起始位、数据位、校验位和停止位来组成一个完整的数据帧。
通过波特率的设置,可以实现不同的数据传输速率。
UART通信协议简单易用,广泛应用于各类串行设备间的通信。
2. SPI(串行外设接口)SPI是一种同步串行通信协议,用于连接单片机与外部设备,例如存储器、传感器等。
SPI协议使用一个主设备和一个或多个从设备之间的全双工通信方式。
通信过程中,主设备通过时钟信号控制数据的传输,从设备通过选择信号确定通信目标。
SPI通信速度较快,适用于对速度要求较高的应用场景。
3. I2C(串行外设接口)I2C是一种双线制串行通信协议,用于各种设备间的通信,例如传感器、显示器等。
I2C通信协议使用两根总线线路:串行数据线(SDA)和串行时钟线(SCL)。
通过主设备发出的时钟信号控制数据的传输。
I2C协议具有多设备共享同一条总线的特点,适用于多个设备之间交互数据的场景。
二、并行通信协议并行通信协议是一种同时传输多个数据位的通信方式,常见的并行通信协议有8位并行、16位并行和32位并行等。
并行通信协议在数据传输速度上具有明显优势,但在布线和硬件接口上相对复杂,因此一般适用于短距离和高速数据传输的场景。
三、无线通信协议随着无线通信技术的发展,越来越多的单片机应用采用无线通信协议与外部设备进行数据传输。
单片机的通信接口及通信协议概述随着科技的快速发展,单片机已经成为许多电子产品的核心部分。
而单片机的通信接口及通信协议则扮演着连接与控制外围设备的重要纽带。
本文将对单片机的通信接口及通信协议进行概述,帮助读者了解单片机通信的基本原理与应用。
一、串行通信接口串行通信接口是单片机与外部设备进行数据传输的一种常用方式。
它通过将数据一位一位地顺序传送,使得通信过程更加可靠。
常见的串行通信接口有UART、SPI和I2C。
1. UART(Universal Asynchronous Receiver Transmitter,通用异步收发器):UART是一种最基本的串行通信接口,实现简单,广泛应用于单片机的串口通信。
UART通过将数据以异步的方式进行传输,即发送端和接收端的时钟不同步,可以实现双向通信。
2. SPI(Serial Peripheral Interface,串行外围接口):SPI是一种同步的串行通信接口,适用于单片机与外部设备之间的高速数据传输。
SPI通信主要通过四根线进行,分别是时钟线、数据输入线、数据输出线和片选线。
SPI可以支持单主单从、单主多从和多主多从的通信方式。
3. I2C(Inter-Integrated Circuit,集成电路互连):I2C是一种双线制的串行通信接口,适用于单片机与多个外部设备之间进行数据传输。
I2C接口通常有两根线,即串行数据线(SDA)和串行时钟线(SCL)。
I2C采用主从模式,其中主机由单片机担任,从机可以是各种外围设备。
二、并行通信接口并行通信接口是一种同时传输多个位的通信方式,可以实现更高的数据传输速率。
常见的并行通信接口有GPIO(General PurposeInput/Output,通用输入输出)、外部总线接口等。
1. GPIO:GPIO是单片机通用的输入输出引脚,可以用来与外部设备进行并行通信。
通过对GPIO引脚的电平控制,单片机可以进行数据的输入和输出。
单片机串口通信协议1. 引言单片机串口通信是一种常见的数据通信方式,它允许单片机与其他外部设备进行通信。
串口通信协议定义了数据传输的格式、波特率等参数,确保通信的稳定和可靠性。
本文将介绍单片机串口通信协议的基本原理和常用协议。
2. 串口通信基础串口通信是通过串行数据传输来实现的。
其中,UART(通用异步收发传输器)是实现串口通信的重要组件。
UART将并行数据转换为串行数据,并通过串口进行传输。
在单片机中,常用的串口通信引脚是TX(发送)和RX(接收)。
3. 串口通信协议串口通信协议定义了数据传输时各个数据包的格式和规则。
常见的串口通信协议有以下几种:3.1. RS-232RS-232是最早出现的串口通信协议之一。
它定义了数据传输的电气特性和信号级别。
RS-232使用9个引脚进行数据传输,包括发送和接收数据线、数据控制线等。
该协议具有较长的最大传输距离和可靠性,但通信速率相对较慢。
3.2. RS-485RS-485是一种多点通信的串口协议。
相比于RS-232,RS-485支持多个设备之间的通信。
它使用不同的信号级别和电气特性,可实现更远的传输距离和更高的通信速率。
RS-485通信中设备分为主设备和从设备,主设备负责控制通信流程。
3.3. SPISPI(Serial Peripheral Interface)是一种同步串口通信协议,常用于单片机与外部设备之间的通信。
SPI使用四条引脚进行通信,包括时钟线、数据线、主设备输出从设备输入线和主设备输入从设备输出线。
SPI通信速率较快,适用于高速数据传输。
3.4. I2CI2C(Inter-Integrated Circuit)是一种多主从通信的串口协议。
I2C使用两条引脚进行通信,包括时钟线和数据线。
在I2C总线上,可以连接多个设备,实现多个设备之间的通信和数据交换。
I2C通信速率较慢,但具有较简单的硬件设计和较低的功耗。
4. 协议选择和配置选择合适的串口通信协议需要考虑通信距离、通信速率、设备数量等因素。
单片机中的IC通信协议详解单片机(Microcontroller)是一种集成了微处理器、存储器和输入输出端口等功能于一体的微型计算机,广泛应用于各种电子设备中。
在单片机系统中,IC通信协议起着至关重要的作用,它能够实现单片机与其他外部设备之间的数据交换和通信。
本文将对单片机中常见的IC 通信协议进行详细解析,包括I2C、SPI和UART。
一、I2C通信协议I2C(Inter-Integrated Circuit)通信协议是由飞利浦公司开发的一种串行通信协议,主要用于芯片之间的通信。
I2C通信协议采用双线制,包括两根信号线:时钟线(SCL)和数据线(SDA)。
其中,时钟线由主设备负责产生,用于同步数据的传输;数据线用于传输数据。
I2C通信协议的基本工作流程如下:1. 主设备产生起始信号,并发出一个从设备地址和读写控制位;2. 主设备发出要传输的数据或者接收数据的请求;3. 从设备根据控制位的不同,进行相应的数据传输或接收;4. 数据传输完成后,主设备产生停止信号,结束本次通信。
I2C通信协议具有以下特点:1. 双线制结构,有效节省了引脚资源;2. 可以连接多个从设备,通过地址位进行选择;3. 传输速率较慢,适合短距离、低速率的数据传输。
二、SPI通信协议SPI(Serial Peripheral Interface)通信协议是一种全双工、同步、串行的通信协议,用于在微控制器和外围设备之间进行通信。
SPI通信协议包括四根信号线:时钟线(SCK)、主设备输出从设备输入线(MOSI)、主设备输入从设备输出线(MISO)和片选线(SS)。
SPI通信协议的基本工作流程如下:1. 主设备选择从设备,并产生起始信号;2. 主设备通过时钟线发送数据,从设备通过MISO线接收数据;3. 主设备和从设备在时钟的上升或下降沿,进行数据的传输;4. 数据传输完成后,主设备产生停止信号,结束本次通信。
SPI通信协议具有以下特点:1. 支持高速数据传输,适合数据量较大的场景;2. 可以连接多个从设备,通过片选线进行选择;3. 通信时序灵活可调,支持不同频率和模式的设定。
32单片机通信协议32单片机通信协议本协议由以下双方共同制定并遵守:甲方:地址:法定代表人:联系电话:电子邮件:乙方:地址:法定代表人:联系电话:电子邮件:一、基本信息1. 本协议的目的是规定甲乙双方在32单片机通信中的权利和义务,以确保通信的有效性和安全性。
2. 本协议具有法律效力,双方应遵守中国相关法律法规。
二、各方身份、权利、义务、履行方式、期限、违约责任1.甲方身份:甲方是32单片机通信的使用者。
2.甲方权利:在使用32单片机通信的过程中,甲方有权要求乙方保证通信的顺利进行,并提供必要的技术支持和帮助。
3.甲方义务:甲方应按照32单片机通信的要求进行使用,并承担由于自身原因引起的通信故障和其他后果的责任。
4.乙方身份:乙方是32单片机通信的提供者。
5.乙方权利:乙方有权要求甲方按照本协议规定进行使用,并有权采取措施保障通信的安全、稳定和有效。
6.乙方义务:乙方应提供可靠、准确的技术支持和服务,保障32单片机通信的正常运行,并承担由于自身原因引起的通信故障和其他后果的责任。
7.履行方式:甲乙双方应通过书面或电子邮件等方式确认通信细节和相关事项。
8.期限:本协议自甲乙双方签署之日起生效,有效期为协议期限。
9.违约责任:如甲乙双方任何一方违反本协议的规定,未能履行相关义务,给对方造成损失的,应承担相应的法律责任。
三、冲突解决在履行本协议过程中,如发生任何争议,应通过友好协商解决。
如不能协商解决的,应向当地法院提起诉讼。
四、附则1.本协议可以由双方共同协商修改,修改内容应经过双方书面确认生效。
2.本协议与中国相关法律法规不一致的,依照中国法律法规的规定执行。
3.本协议未尽事宜,由双方协商处理。
单片机自定义协议通信
首先,自定义协议通信的设计需要考虑数据帧的格式。
数据帧通常包括起始标志、地址信息、数据内容、校验位和结束标志等字段。
起始标志和结束标志用于标识数据帧的开始和结束,地址信息用于指示数据的发送方和接收方,数据内容是实际传输的信息,校验位用于检测数据的完整性和准确性。
其次,通信规则也是自定义协议通信设计的重要部分。
通信规则包括数据的发送和接收流程、数据帧的处理方式、重发机制、错误处理等。
在设计通信规则时,需要考虑通信的稳定性、实时性和可靠性。
另外,校验机制也是自定义协议通信设计中至关重要的部分。
常见的校验机制包括奇偶校验、CRC校验、校验和等,用于检测数据在传输过程中是否发生错误,以保证数据的准确性。
此外,单片机自定义协议通信还需要考虑通信的功耗、通信速率、通信距离等实际应用场景中的因素。
在实际应用中,需要根据具体的通信需求和环境来选择合适的通信协议设计方案。
总的来说,单片机自定义协议通信涉及到数据帧格式、通信规则、校验机制等多个方面的设计,需要综合考虑通信的稳定性、实时性、可靠性以及实际应用场景中的因素。
设计合理的自定义通信协议能够提高单片机系统的通信效率和可靠性。
单片机原理及接口技术中的通信协议与总线结构引言单片机(Microcontroller)是一种集成了处理器核心、存储器、输入输出设备和各种功能模块的完整的计算机系统。
它在嵌入式系统中起到控制和处理各种外设的作用。
通信协议和总线结构是单片机与外部设备之间进行数据传输和通信的重要组成部分。
本文将详细介绍单片机原理及接口技术中的通信协议与总线结构。
一、通信协议通信协议是指在通信过程中,通信双方约定的信息传输格式、数据传输速率、错误校验等规则的集合。
在单片机应用中,常见的通信协议有UART、SPI和I2C 等。
1. UART(Universal Asynchronous Receiver Transmitter)UART是一种串行通信协议,它采用异步通信方式进行数据传输。
异步通信是指通信双方没有事先约定好同步时钟信号,而是通过起始位、数据位、停止位和校验位等来进行同步。
UART常用于单片机与外部设备(如计算机、传感器等)之间的数据传输。
在UART通信中,发送端将数据与起始位、停止位和校验位按照一定的规则组合成数据帧并传送给接收端。
接收端根据起始位、停止位和校验位来识别并接收数据。
UART通信简单、成本低廉,但数据传输速率相对较慢,一般用于中等速率的数据传输。
2. SPI(Serial Peripheral Interface)SPI是一种串行通信协议,它采用同步通信方式进行数据传输。
SPI通信中,主设备和从设备之间通过共享的时钟信号进行同步,主设备负责提供时钟信号和控制信号,从设备负责传输数据。
SPI通信采用全双工方式传输数据,可以同时进行数据的发送和接收。
SPI通信速率快,适用于高速数据传输。
SPI可以实现点对点通信,也可以通过片选信号实现多个从设备与一个主设备之间的通信。
3. I2C(Inter-Integrated Circuit)I2C是一种串行通信协议,它采用同步通信方式进行数据传输。
I2C通信协议由两根线组成,一根是时钟线(SCL),另一根是数据线(SDA)。
单片机与外设之间的通信协议及接口配置在嵌入式系统中,单片机(Microcontroller Unit, MCU)与外设(Peripheral Devices)之间的通信是非常重要的。
为了实现稳定和可靠的数据传送,单片机和外设之间需要遵循一定的通信协议,并进行正确的接口配置。
本文将介绍几种常用的单片机与外设之间的通信协议以及相应的接口配置方法。
1. SPI协议SPI(Serial Peripheral Interface)是一种全双工同步串行通信协议,常用于单片机与外设之间的高速数据传输。
SPI协议需要四根线进行连接:时钟(SCK)、主设备输出从设备输入(MOSI)、主设备输入从设备输出(MISO)和片选(SS)。
接口配置方法:1) 确定单片机的SPI主模式或从模式。
2) 配置时钟极性和相位,定义数据采样的时机和数据发送的时机。
3) 配置SPI通信的速率,根据外设的要求,确定适当的时钟频率。
4) 配置主从模式的选择,根据具体应用要求进行设置。
2. I2C协议I2C(Inter-Integrated Circuit)是一种双线制串行通信协议。
它由两根线组成:串行数据线(SDA)和串行时钟线(SCL)。
I2C协议支持多主设备和从设备之间的通信。
接口配置方法:1) 确定I2C总线上的主设备和从设备地址。
2) 配置I2C总线的速率,根据具体应用要求进行设置。
3) 配置主设备的读写操作,发送正确的读写命令与地址。
4) 接收从设备返回的数据,进行数据处理。
3. UART协议UART(Universal Asynchronous Receiver/Transmitter)是一种异步串行通信协议。
它使用两根线进行通信:一根线用于数据传输(TXD),另一根线用于接收(RXD)。
接口配置方法:1) 配置波特率,根据外设要求以及通信稳定性选择合适的波特率。
2) 配置数据帧格式,包括数据位数、校验位和停止位数等。
3) 配置工作模式,如全双工或半双工模式。
单片机指令的通信协议与网络连接在现代科技的发展中,单片机作为一种微处理器,广泛应用于各个领域。
它能够通过指令来实现各种任务,而通信协议和网络连接是单片机实现这些功能的重要组成部分。
本文将探讨单片机指令的通信协议以及与网络连接的关系。
一、单片机指令的通信协议单片机指令的通信协议是指通过特定的规则和步骤实现单片机与其他设备之间进行数据传输和信息交流的方式。
常见的通信协议有SPI (串行外设接口)、I2C(串行总线)、UART(通用异步接收器/发送器)等。
1. SPI通信协议SPI通信协议是一种串行通信协议,它使用一条数据线和一条时钟线来实现数据的同步传输。
通常情况下,SPI通信协议由一个主设备和一个或多个从设备组成。
主设备通过控制时钟线的电平变化来同步数据的传输,从设备通过数据线与主设备进行双向数据传输。
SPI通信协议的特点是通信速度快、传输距离短,适用于大部分外设与单片机之间的通信。
在实际应用中,我们可以根据需要连接多个外设,通过片选信号来选择不同的从设备进行数据交互。
2. I2C通信协议I2C通信协议是一种串行总线协议,它使用两条线(数据线SDA和时钟线SCL)来实现多个设备之间的数据传输。
I2C通信协议中的每个设备都有一个唯一的地址,通过地址来选择具体要进行通信的设备。
I2C通信协议的特点是可以连接多个设备,传输距离较短,适用于通信速度较低的应用场景。
在许多外设中,如温度传感器、加速度计等,都会采用I2C通信协议与单片机进行数据交互。
3. UART通信协议UART通信协议是一种简单的串行通信协议,它使用一条数据线和一条时钟线来实现数据的传输。
UART通信协议在单片机与外设之间传输数据时,没有地址的概念,只是简单地将数据通过数据线传输。
UART通信协议的特点是传输距离较长,适用于需要长距离通信的场景。
在实际应用中,我们经常使用UART通信协议与计算机、蓝牙模块等设备进行数据交互。
二、单片机的网络连接除了通过通信协议与外部设备进行数据交互外,单片机还可以通过网络连接实现与远程设备的数据交互。
单片机的通信协议一、概述单片机的通信协议是指单片机之间进行数据传输时所遵循的规则和标准。
通信协议的设计和实现是保证单片机之间可靠通信的关键。
二、常见通信协议1.串口通信协议串口通信协议是单片机之间最常见的通信方式。
串口通信协议包括硬件部分和软件部分两个方面。
硬件部分主要指串口接口电路,而软件部分主要指数据传输格式和控制流程。
2.I2C总线协议I2C总线协议是一种基于同步串行传输方式的短距离数据传输标准。
I2C总线协议可以实现多个器件在同一个总线上进行数据交换,具有简单、灵活、可扩展等优点。
3.SPI总线协议SPI总线协议是一种基于同步串行传输方式的短距离数据传输标准。
SPI总线协议可以实现多个器件在同一个总线上进行数据交换,具有高速、简单等优点。
三、设计通信协议的原则1.可靠性原则设计通信协议时必须考虑到数据传输过程中可能出现的各种异常情况,如数据丢失、数据错误等,要通过各种手段保证通信的可靠性。
2.实用性原则设计通信协议时必须考虑到实际应用场景,尽可能地简化通信协议的设计和实现,提高通信效率和可靠性。
3.兼容性原则设计通信协议时必须考虑到不同厂家、不同型号之间的兼容性问题,尽可能地遵循标准化的通信协议。
四、单片机通信协议的实现1.串口通信协议的实现串口通信协议的实现需要涉及到硬件和软件两个方面。
硬件方面需要设计串口接口电路,而软件方面需要编写相应的程序来控制串口接口电路进行数据传输。
2.I2C总线协议的实现I2C总线协议的实现需要涉及到硬件和软件两个方面。
硬件方面需要设计I2C接口电路,而软件方面需要编写相应的程序来控制I2C接口电路进行数据传输。
3.SPI总线协议的实现SPI总线协议的实现需要涉及到硬件和软件两个方面。
硬件方面需要设计SPI接口电路,而软件方面需要编写相应的程序来控制SPI接口电路进行数据传输。
五、总结单片机的通信协议是单片机之间进行数据传输的关键。
设计和实现通信协议需要考虑到可靠性、实用性和兼容性等多个方面,同时需要涉及到硬件和软件两个方面。
单片机通信协议处理现在大部分的仪器设备都要求能过通过上位机软件来操作,这样方便调试,利于操作。
其中就涉及到通信的过程。
在实际制作的几个设备中,笔者总结出了通信程序的通用写法,包括上位机端和下位机端等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环境下利用串口类编程的方式。
CSerial port是比较好用的串口类。
它提供如下的串口操作方法: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.总结以上给出的是通信系统运作的基本雏形,虽然简单,但是可行。