基于STM32单片机的HJ/T212通信协议的实现
基于单片机的标准韦根网络通讯协议的实现
技术应用64摘 要 :介绍射频卡中标准的韦根( Wiegand )26接口协议,重点介绍在单片机中对这种通讯协议的实现的软硬件设计方法。
关键词:单片机 Wiegand HID PID 射频卡Wiegand传输协议,是国际标准的射频卡数据传输协议,Motorola,HID,EM等国际知名电子厂商都遵从该协议,在国内又称”韦根” “维庚” “维根” 协议。
W i e g a n d 协议有很多格式,在常见的射频卡中,标准的26-bit 是被广泛采用的一个工业标准,门禁控制系统中基本上都采用这种格式。
Wiegand 基本格式标准韦根输出是由26位二进制数组成,每一位的含义如图1所示:其中:BIT1: 第2—13位的偶校验位BIT2-9: 对应与电子卡HID码的低8位BIT10-25: 应电子卡的PID号码BIT26: 第14-25位的奇校验位以图1为例,H I D 的16进制数为0x 1A ,对应于十进制数为26。
HID的16进制数为0x8484,对应于十进制数为33924。
即这个卡的编码通常写为:26.33924。
传输协议中提到的HID号码即Hidden ID code 隐含码,PID号码即Public ID code 公开码。
PID很容易在读出器的输出结果中找到,但HID在读出器的输出结果中部分或者全部隐掉。
HID是一个非常重要的号码,它不仅存在于卡中,也存在于读卡器中。
如果卡中的HID与读卡器中的HID不同的话,那么这张卡就无法在这个读卡器上正常工作。
因此,在上述标准26位韦根格式中,只包含了电子卡HID 码的低8位,即对应于韦根输出的第1位到第8位,实际上电子卡的HID码为16位。
在上述标准26位韦根格式中,最高位和最低位为奇/偶校验。
奇/偶校验(E C C )是数据传送时采用的一种校正数据错误的一种方式,分为奇校验和偶校验两种,其原理如下:如果是采用奇校验,在传送每一个字节的时候另外附加一位作为校验位,当实际数据中“1”的个数为偶数的时候,这个校验位就是“1”,否则,这个校验位就是“0”,这样就可以保证传送的数据满足奇校验的要求。
PC与多TMS320F2812DSP串行通信协议的设计(图文)(精)
PC与多TMS320F2812 DSP串行通信协议的设计(图文)论文导读:F2812内部有两路专用的串行通信模块SCIA、SCIB,应实际工程需要,仅使用一路SCIB与PC进行串行通信。
PC的串行通信接口一般采用RS-232协议,该协议传输速率低,传输距离近,抗干扰能力弱,很难保障实际工程现场作业数据的精准性和较远距离传输的要求。
因此工程中采用了平衡差分接收的RS-485协议,使得抗干扰能力和传输距离等性能得到了很大的提升,满足了实际需要。
在今后的工程应用中将进一步完成PC与多DSP的串行传输,利用DSP进行数据采集和简单的数据处理,利用PC的高速完成数据的复杂处理,并将通信程序写成类库,提高程序的通用性。
关键词:PC,多DSP,串行通信,协议1. TMS320F2812 DSP处理器概述随着经济的进一步发展和科学技术的日新月异,高速信息处理和自动控制在各个生产领域的应用越来越显示出其举足轻重的地位。
而DSP处理器的诞生、发展以及优越的性能正是满足了市场的这种需求,同时它又进一步的促进了经济的发展和科技的进步。
DSP处理器是对数字信号进行高速实时处理的专用处理器,处理速度比普通的CPU快的多。
其中32位TMS320F2812 DSP的工作频率150MHz,堪比Intel 586处理器运算能力。
用户不仅可以应用汇编语言、高级语言编写系统程序,也能够采用C/C++语言开发高效的数学算法。
因此该类芯片在数字信号处理领域得到了相当广泛应用。
在工程应用中,其多下位机的串行数据交互愈显重要,备受关注。
2. F2812 SCI接口特点 F2812提供两个SCI接口,均采用双线制通信的异步通信串行接口。
为了减小串口通信时的开销,F2812的串口支持16级接收和发送FIFO,单独的发送器、接收器中断以及各自的单独启动位,可以进行半双工或者全双工操作,支持两种唤醒多处理器方式:空闲线唤醒和地址位唤醒。
3. F2812 SCI与PC的连接 F2812内部有两路专用的串行通信模块SCIA、SCIB,应实际工程需要,仅使用一路SCIB与PC进行串行通信。
单片机通讯协议
单片机通讯协议单片机通讯协议是指单片机与其他设备之间进行数据交互所需要遵循的规则和约定。
通讯协议的定义可以使不同的设备之间能够进行正确的数据传输,确保数据的准确性和完整性。
单片机通讯协议可以有很多种,例如I2C、SPI、UART等。
这些通讯协议在不同的应用场景中有着不同的特点和优势。
以I2C通讯协议为例,I2C是一种串行通信协议,可以在一根数据线(SDA)和一根时钟线(SCL)上进行双向通信。
在I2C通讯中,一般会有一个主设备(例如单片机)和多个从设备(例如传感器、LCD等)。
I2C通讯协议规定了数据的传输格式和命令的定义,以及通信的时序。
在I2C通讯中,主设备可以向从设备发送读或写命令,从设备根据命令执行相应的操作,并返回数据给主设备。
SPI通讯协议是一种基于主从结构的串行通信协议,可以实现高速数据传输。
在SPI通讯中,通常会有一个主设备和多个从设备。
主设备通过片选信号(CS)选择与之通信的从设备,并通过时钟信号(CLK)进行数据传输。
UART通讯协议是一种标准的串行通信协议,可以在一根数据线(TX)和一根接收线(RX)上进行双向通信。
在UART通讯中,数据的传输是通过字符的形式进行的,每个字符由起始位、数据位、校验位和停止位组成。
单片机通讯协议的选择需要根据具体的应用场景和需求来确定。
例如,I2C通讯协议适用于需要连接多个从设备的场景,SPI通讯协议适用于需要高速数据传输的场景,UART通讯协议适用于需要简单、可靠的数据传输的场景。
在实际应用中,单片机通讯协议的实现一般需要编写对应的驱动程序或库函数。
这些驱动程序或库函数可以提供给开发者使用,简化了通讯协议的实现过程。
总之,单片机通讯协议是实现单片机与其他设备之间数据交互的重要规则和约定。
在选择通讯协议时,需要考虑到具体的应用场景和需求,以及通讯速度、可靠性和复杂度等因素。
通过合理选择和实现通讯协议,可以提升单片机与其他设备之间的数据传输效率和可靠性。
单片机自定义协议通信
单片机自定义协议通信
首先,自定义协议通信的设计需要考虑数据帧的格式。
数据帧通常包括起始标志、地址信息、数据内容、校验位和结束标志等字段。
起始标志和结束标志用于标识数据帧的开始和结束,地址信息用于指示数据的发送方和接收方,数据内容是实际传输的信息,校验位用于检测数据的完整性和准确性。
其次,通信规则也是自定义协议通信设计的重要部分。
通信规则包括数据的发送和接收流程、数据帧的处理方式、重发机制、错误处理等。
在设计通信规则时,需要考虑通信的稳定性、实时性和可靠性。
另外,校验机制也是自定义协议通信设计中至关重要的部分。
常见的校验机制包括奇偶校验、CRC校验、校验和等,用于检测数据在传输过程中是否发生错误,以保证数据的准确性。
此外,单片机自定义协议通信还需要考虑通信的功耗、通信速率、通信距离等实际应用场景中的因素。
在实际应用中,需要根据具体的通信需求和环境来选择合适的通信协议设计方案。
总的来说,单片机自定义协议通信涉及到数据帧格式、通信规则、校验机制等多个方面的设计,需要综合考虑通信的稳定性、实时性、可靠性以及实际应用场景中的因素。
设计合理的自定义通信协议能够提高单片机系统的通信效率和可靠性。
STM32 HT1200M AD421之Hart从机方案代码(测试OK)
/***************************************************************************** Copyright(c), 2001-2060, ihealthlabs 版权所有***************************************************************************** 文件名称 : hart_task.h* 版本 : 0.0.1* 作者 : lvchunhao* 创建日期 :2017年8月5日* 描述 : Uart1-Hart通讯1. 中断接收/查询发送2.****************************************************************************/#ifndef _HART_TASK_H#define _HART_TASK_H#ifdef __cplusplusextern "C" {#endif#include "stdint.h"/****************************************************************1. 主机长度最长为25字节,从机最长为27字节(只有从机有响应码2byte*2. u8Start&0x8000 == 0为主从短帧结构 * 从主短帧结构u8Addr只用1个字节u8Addr[0] * 同左不需要使用u8Status[2] * 需要使用u8Status[2]*3. u8Start&0x8000 == 1为主从长帧结构:* 从主长帧结构u8Addr需要全部使用5个字节u8Addr[5] * 同左不需要使用u8Status[2] * 需要使用u8Status[2]***************************************************************/typedef struct _tagStHartDataFrame{#if 0uint8_t u8Preamble[20]; //前导符: 作为通信同步的需要,5-20字节的0xFF,通常采用5个字节#endifuint8_t u8Start; //定界符:主->从(短帧0x02长帧0x82)从->主(短0x06长0x86)突发(0x01/0x81)uint8_t u8Addr[5]; //地址:短帧结构中1个字节,长帧结构中5个字节uint8_t u8Command; //命令:范围为253个,用Hex表示,31 127 254 255为预留值uint8_t u8Bcnt; //长度:从该字节下一字节-->到最后的字节数(不包括校验字节) uint8_t u8Status[2]; //响应码:只存在于从机响应主机消息的时候uint8_t u8Data[25]; //数据:最多25字节uint8_t u8Parity; //校验:奇偶纵向校验,从起始字节-->奇偶校验前一字节为止}StHartDataFrame;typedef enum _tagEmHartFrameType{TYPE_MAIN_SLAVE_SHORT_FRAME = 0x02, //主机到从机短帧结构TYPE_MAIN_SLAVE_LONG_FRAME = 0x82, //主机到从机长帧结构TYPE_SLAVE_MAIN_SHORT_FRAME = 0x06, //从机到主机短帧结构TYPE_SLAVE_MAIN_LONG_FRAME = 0x86, //从机到主机长帧结构TYPE_BURST_MODE_SHORT_FRAME = 0x01, //突发模式短帧结构TYPE_BURST_MODE_LONG_FRAME = 0x81, //突发模式长帧结构}EmHartFrameType;void Uart1RecvData(uint8_t u8Data);void vTaskHartCommunicate(void *pArgs);#ifdef __cplusplus}#endif#endif /* _HART_TASK_H *//**************************************************************************** * Copyright(c), 2001-2060, ihealthlabs 版权所有**************************************************************************** * 文件名称 : hart_task.c* 版本 : 0.0.1* 作者 : lvchunhao* 创建日期 :2017年8月5日* 描述 : Uart1-Hart通讯1. 中断接收/查询发送2. 一包数据最大可能不超过60Bytes3. 波特率1200bps,每s传送150字节****************************************************************************/ #include "common.h"//Uart1 parametersstatic uint32_t u32Uart1WriteIndex = 0;uint8_t u8Uart1RxBuffer[RECVBUFF_SIZE]; // 串口Uart1接收缓冲区uint8_t u8Uart1TxBuffer[SENDBUFF_SIZE]; // 串口Uart1发送缓冲区//other parametersuint8_t u8HartCMD_0[]={0XFF,0XFF,0XFF,0XFF,0XFF,0X02,0X80,0X00,0X00,0X82}; //短帧通用命令0:读标识码//Hart protolStHartDataFrame stHartFrameRecv; //Hart接收处理结构体StHartDataFrame stHartFrameSend; //Hart发送处理结构体/*1. 例如0x413FA000转换之后为11.9765622. float b=*(float*)&a; 物理转换,把a所在的内存空间值当做float解释3. float b= (float)a; 逻辑转换,只是简单的去掉小数部分而已4. Ubuntu上eclipse测试ok,需注意大小端问题*///十六进制转十进制浮点型float IEEE754Int2Float(int x)return *(float*)&x;}//十进制浮点型转十六进制int IEEE754Float2Int(float x){return *(int*)&x;}/*** 函数功能: 将接收到的1字节数据存入接收缓冲区中* 输入参数: u8Data[in]: 数据* 返回值: 无* 说明:自定义串口接收中断使用*/void Uart1RecvData(uint8_t u8Data){if(u32Uart1WriteIndex == RECVBUFF_SIZE){u32Uart1WriteIndex = 0;}u8Uart1RxBuffer[u32Uart1WriteIndex++] = u8Data;}/*** 函数功能: AD421发送函数(SPI-Master)[4-20ma正常电流编码]* 输入参数: u8Data[in]: 数据* 返回值: 无* 说明:1. 正常电流 4-20ma 1lsb = 244nA 16bit (20-4)/65536ma* 2. 警报电流 <3.5ma & >24ma1 lsb = 244nA 17bit (32-0)/131072ma */int32_t SPI2TransmitAD421(int32_t s32pData){int32_t i, s32Ret = 0;int32_t s32TmpData = 0x8000;/* AD421-SPI这三管脚初始化都为0 */HAL_GPIO_WritePin(GPIOB, Hart_CLOCK_Pin, GPIO_PIN_SET);HAL_GPIO_WritePin(GPIOB, Hart_DATA_Pin, GPIO_PIN_RESET);/* 两个Latch上升沿之间16个周期clock为正常电流 */HAL_GPIO_WritePin(GPIOB, Hart_LATCH_Pin, GPIO_PIN_RESET); vTaskDelay(5);HAL_GPIO_WritePin(GPIOB, Hart_LATCH_Pin, GPIO_PIN_SET);/* 发送数据MSB先发,Clock上升沿有效 */for(i = 0; i < 16; i++)HAL_GPIO_WritePin(GPIOB, Hart_CLOCK_Pin, GPIO_PIN_RESET);if((s32TmpData&s32pData)==0x0){HAL_GPIO_WritePin(GPIOB, Hart_DATA_Pin, GPIO_PIN_RESET);}else{HAL_GPIO_WritePin(GPIOB, Hart_DATA_Pin, GPIO_PIN_SET);}HAL_GPIO_WritePin(GPIOB, Hart_CLOCK_Pin, GPIO_PIN_SET);s32TmpData = s32TmpData>>1;}/* AD421的LATCH管脚上升沿将数据锁存到DAC锁存器中 */HAL_GPIO_WritePin(GPIOB, Hart_LATCH_Pin, GPIO_PIN_RESET);vTaskDelay(5);HAL_GPIO_WritePin(GPIOB, Hart_LATCH_Pin, GPIO_PIN_SET);return s32Ret;}/*** 函数功能: Hart信号发送函数* 输入参数: pData[in]: 需要发送的数据* 输入参数:Size[in]: 发送数据长度* 返回值: HAL_OK / or other* 说明:无*/int32_t HartDataSend(uint8_t *pData, uint16_t Size){int32_t s32Err = 0;//发送数据时INRTS=0,发送完成后INRTS=1等待接收HAL_GPIO_WritePin(Hart_INRTS_GPIO_Port, Hart_INRTS_Pin, GPIO_PIN_RESET); s32Err = HAL_UART_Send(&huart1, pData, Size);// 需要延时关闭,具体延时时间需要测试暂定为50msvTaskDelay(50);//HAL_GPIO_WritePin(Hart_INRTS_GPIO_Port, Hart_INRTS_Pin, GPIO_PIN_SET);return s32Err;}/*** 函数功能: HartDataCHK* 输入参数: u8Data[in]: 需要校验的数据* 输入参数:Size[in]: 校验数据长度* 返回值: 奇偶校验值* 说明:无*/uint8_t HartDataCHK(uint8_t *u8Data, uint16_t Size){uint8_t u8CKHData, i;u8CKHData = u8Data[0];for(i = 1; i < Size; i ++){u8CKHData ^= u8Data[i];}return u8CKHData;}/*** 函数功能: RecvDataStructDeal* 输入参数: u8Data[in]: 需要校验的数据* 输入参数:Size[in]: 校验数据长度* 输入参数:stHart[in]: 存储Hart帧数据* 返回值: 0 数据存储OK -1 Failure* 说明:lvchunhao 2017-8-22*/int32_t RecvDataStructDeal(uint8_t *u8Data, uint16_t Size, StHartDataFrame *stHart) {int32_t s32Ret = 0;uint16_t i, u16Size;uint8_t u8Start = 0;uint8_t u8SynFlag = 0;uint8_t *u8TmpData = NULL;if((u8Data == NULL) || (stHart == NULL)){return -1;}//处理5-20个同步头0xFFfor(i = 0; i < Size; i ++){if(u8Data[i] == 0xFF){u8SynFlag = 1;}if((u8SynFlag == 1) && (u8Data[i] != 0xFF)){break;}}/* 除去同步0xFF后的字节数 */u16Size = Size - i;u8TmpData = u8Data + i;u8Start = u8TmpData[0];/* 奇偶校验 */if(HartDataCHK(u8TmpData, u16Size - 1) == u8TmpData[u16Size - 1]){return -1;}switch(u8Start){case TYPE_MAIN_SLAVE_SHORT_FRAME://主机到从机短帧结构(角色:从机)stHart->u8Start = u8TmpData[0]; //定界符 1bytesstHart->u8Addr[0] = u8TmpData[1]; //地址 1bytesstHart->u8Command = u8TmpData[2]; //命令 1bytesstHart->u8Bcnt = u8TmpData[3]; //长度 1bytesmemcpy(stHart->u8Data, u8TmpData + 4, stHart->u8Bcnt); //数据 stHart->u8Parity = u8TmpData[4 + stHart->u8Bcnt]; //奇偶校验 break;case TYPE_MAIN_SLAVE_LONG_FRAME://主机到从机长帧结构(角色:从机)stHart->u8Start = u8TmpData[0]; //定界符 1bytesmemcpy(stHart->u8Addr, u8TmpData + 1, 5); //地址 5bytesstHart->u8Command = u8TmpData[6]; //命令 1bytesstHart->u8Bcnt = u8TmpData[7]; //长度 1bytesmemcpy(stHart->u8Data, u8TmpData + 8, stHart->u8Bcnt); //数据 stHart->u8Parity = u8TmpData[8 + stHart->u8Bcnt]; //奇偶校验 break;case TYPE_SLAVE_MAIN_SHORT_FRAME://从机到主机短帧结构(角色:主机)stHart->u8Start = u8TmpData[0]; //定界符 1bytesstHart->u8Addr[0] = u8TmpData[1]; //地址 1bytesstHart->u8Command = u8TmpData[2]; //命令 1bytesstHart->u8Bcnt = u8TmpData[3]; //长度 1bytesmemcpy(stHart->u8Status, u8TmpData + 4, 2); //响应码 2bytesmemcpy(stHart->u8Data, u8TmpData + 6, stHart->u8Bcnt - 2); //数据stHart->u8Parity = u8TmpData[4 + stHart->u8Bcnt]; //奇偶校验break;case TYPE_SLAVE_MAIN_LONG_FRAME://从机到主机长帧结构(角色:主机)stHart->u8Start = u8TmpData[0]; //定界符 1bytesmemcpy(stHart->u8Addr, u8TmpData + 1, 5); //地址 5bytesstHart->u8Command = u8TmpData[6]; //命令 1bytesstHart->u8Bcnt = u8TmpData[7]; //长度 1bytesmemcpy(stHart->u8Status, u8TmpData + 8, 2); //响应码 2bytesmemcpy(stHart->u8Data, u8TmpData + 10, stHart->u8Bcnt - 2); //数据stHart->u8Parity = u8TmpData[8 + stHart->u8Bcnt]; //奇偶校验break;case TYPE_BURST_MODE_SHORT_FRAME://突发模式短帧结构(暂时预留,同从主短帧结构)[角色:主机,接收从机突发数据]break;case TYPE_BURST_MODE_LONG_FRAME://突发模式长帧结构(暂时预留,同从主短帧结构)[角色:主机,接收从机突发数据] break;default :s32Ret = -1;break;}return s32Ret;}/*** 函数功能: SendDataStructDeal* 输入参数: u8Data[out]: 拼包成功后需要发送的数据* 输入参数:stHart[in]: 入口Hart参数(以下几个元素必须赋值)* 输入参数: .u8Start .u8Bcnt* 输入参数: .u8Addr .u8Data* 输入参数: .u8Command .Status[从机必须,主机不需要]* 返回值: >0数据长度 -1 Failure* 说明:lvchunhao 2017-8-23*/int32_t SendDataStructDeal(uint8_t *u8Data, StHartDataFrame stHart){int32_t s32Size = -1;if(u8Data == NULL){return -1;}/* 注意角色应该和接收预处理时相反 */switch(stHartFrameRecv.u8Start){case TYPE_MAIN_SLAVE_SHORT_FRAME://主机到从机短帧结构(角色:主机)memset(u8Data, 0xFF, 5); //同步头:5-20个0xFF,通常采用5个字节u8Data[5] = stHart.u8Start; //定界符0x02u8Data[6] = stHart.u8Addr[0]; //地址:短帧1个字节u8Data[7] = stHart.u8Command; //命令u8Data[8] = stHart.u8Bcnt; //数据长度:最大25字节memcpy(u8Data + 9, stHart.u8Data, stHart.u8Bcnt); //数据u8Data[9 + stHart.u8Bcnt] = HartDataCHK(u8Data + 5, 4 + stHart.u8Bcnt); //CHK校验s32Size = 9 + stHart.u8Bcnt + 1; //整包数据长度break;case TYPE_MAIN_SLAVE_LONG_FRAME://主机到从机长帧结构(角色:主机)memset(u8Data, 0xFF, 5); //同步头:5-20个0xFF,通常采用5个字节u8Data[5] = stHart.u8Start; //定界符0x82memcpy(u8Data + 6, stHart.u8Addr, 5); //地址:短帧5个字节u8Data[11] = stHart.u8Command; //命令u8Data[12] = stHart.u8Bcnt; //数据长度:最大25字节memcpy(u8Data + 13, stHart.u8Data, stHart.u8Bcnt); //数据u8Data[13 + stHart.u8Bcnt] = HartDataCHK(u8Data + 5, 8 + stHart.u8Bcnt); //CHK 校验s32Size = 13 + stHart.u8Bcnt + 1;break;case TYPE_SLAVE_MAIN_SHORT_FRAME://从机到主机短帧结构(角色:从机)memset(u8Data, 0xFF, 5); //同步头:5-20个0xFF,通常采用5个字节u8Data[5] = stHart.u8Start; //定界符0x02u8Data[6] = stHart.u8Addr[0]; //地址:短帧1个字节u8Data[7] = stHart.u8Command; //命令u8Data[8] = stHart.u8Bcnt; //数据长度:最大27字节memcpy(u8Data + 9, stHart.u8Status, 2); //响应码memcpy(u8Data + 11, stHart.u8Data, stHart.u8Bcnt - 2); //数据u8Data[11 + stHart.u8Bcnt - 2] = HartDataCHK(u8Data + 5, 4 + stHart.u8Bcnt); //CHK校验s32Size = 9 + stHart.u8Bcnt + 1;break;case TYPE_SLAVE_MAIN_LONG_FRAME://从机到主机长帧结构(角色:从机)memset(u8Data, 0xFF, 5); //同步头:5-20个0xFF,通常采用5个字节 u8Data[5] = stHart.u8Start; //定界符0x02memcpy(u8Data + 6, stHart.u8Addr, 5); //地址:短帧5个字节u8Data[11] = stHart.u8Command; //命令u8Data[12] = stHart.u8Bcnt; //数据长度:最大27字节memcpy(u8Data + 13, stHart.u8Status, 2); //响应码memcpy(u8Data + 15, stHart.u8Data, stHart.u8Bcnt - 2); //数据u8Data[15 + stHart.u8Bcnt - 2] = HartDataCHK(u8Data + 5, 8 + stHart.u8Bcnt); //CHK校验s32Size = 13 + stHart.u8Bcnt + 1;break;case TYPE_BURST_MODE_SHORT_FRAME://突发模式短帧结构 (角色:从机) [只有从机可以处于突发模式]break;case TYPE_BURST_MODE_LONG_FRAME://突发模式长帧结构 (角色:从机) [只有从机可以处于突发模式]break;default :s32Size = -1;break;}return s32Size;}/** 函数名 : vTaskHartCommunicate* 功能 : Hart-Uart1接收处理* 参数 : pArgs [in] : 线程参数* 返回 : 无* 作者 : lvchunhao 2017-8-5*/void vTaskHartCommunicate(void *pArgs){int32_t s32Err;int32_t s32RecvLen;int32_t s32ADCValue;uint8_t u8RecvCompleteFlag = 0;uint32_t u32Uart1WriteIndexLast = 0;//uint8_t u8TmpData[64] = {0x55, 0xFF};/* 备份接收写指针 */u32Uart1WriteIndexLast = u32Uart1WriteIndex;/* 复位HT1200M所有数字电路 */HAL_GPIO_WritePin(Hart_INRESET_GPIO_Port, Hart_INRESET_Pin, GPIO_PIN_RESET); vTaskDelay(100);HAL_GPIO_WritePin(Hart_INRESET_GPIO_Port, Hart_INRESET_Pin, GPIO_PIN_SET);/* 接收数据时候拉高INRTS,等待接收Hart信号 */HAL_GPIO_WritePin(Hart_INRTS_GPIO_Port, Hart_INRTS_Pin, GPIO_PIN_SET);/* 使能Uart1接收中断 */HAL_UART_RxIntEnabe(&huart1, 1);#if 1/* 控制AD421使回路电流为0xC000=16ma 0x8000=12ma 0x4000=8ma*/s32ADCValue = 0x4000;SPI2TransmitAD421(s32ADCValue);vTaskDelay(100);#endif#if 0/* Hart数字信号发送测试: 作为主机发送短帧(相当于发送u8HartCMD_0)*/memset(&stHartFrameSend, 0, sizeof(StHartDataFrame));stHartFrameSend.u8Start = TYPE_MAIN_SLAVE_SHORT_FRAME;/* 地址: bit7=1 为第一主机 bit6=0非突发模式 bit6-5预留 bit4-0 从机地址 */stHartFrameSend.u8Addr[0] = 0x80;stHartFrameSend.u8Command = 0x00;stHartFrameSend.u8Bcnt = 0x00;s32Err = SendDataStructDeal(u8TmpData, stHartFrameSend);if(s32Err != -1){HartDataSend(u8TmpData, s32Err);}#endif/* USER CODE BEGIN WHILE */while(1){#if 0//向Loop中发送Hart信号,用于测试(可以示波器查看波形)u8TmpData[0] = 0x50;HartDataSend(u8TmpData, 1);continue;#endif#if 0/* 检测到接收缓冲区中有数据 */if(u32Uart1WriteIndex > 0){/* Hart接收到数据重定向到串口2 */PostUartWriteMsg(u8Uart1TxBuffer, s32RecvLen, TYPE_NUM_UART2);vTaskDelay(5);}else{vTaskDelay(5);}continue;#endif/* 检测到OCD为低电平说明有数据需要通过Hart进入RxD,需要接收 */if(HAL_GPIO_ReadPin(Hart_OCD_GPIO_Port, Hart_OCD_Pin) == GPIO_PIN_RESET) {/*尚且需要验证的地方:1. 是否需要在OCD为低时才打开串口接收2. 是否需将INRTS=0一直打开发送,只有此时才将INRTS=1接收数据*/}/* 检测到接收缓冲区中有数据 */if(u32Uart1WriteIndex > 0){if(u32Uart1WriteIndexLast != u32Uart1WriteIndex){u32Uart1WriteIndexLast = u32Uart1WriteIndex;vTaskDelay(5);}else{/* 5ms没有收到新数据或者填满25字节则认为一帧OK */u8RecvCompleteFlag = 1;}}else{vTaskDelay(5);}/* USER CODE BEGIN IF 0*/if(u8RecvCompleteFlag == 1){/* 获取接收缓冲区数据长度 */s32RecvLen = u32Uart1WriteIndex;u32Uart1WriteIndex = 0;memcpy(u8Uart1TxBuffer, u8Uart1RxBuffer, s32RecvLen);/* 备份接收写指针 */u8RecvCompleteFlag = 0;u32Uart1WriteIndexLast = u32Uart1WriteIndex;/* Hart接收到数据重定向到串口2 */PostUartWriteMsg(u8Uart1TxBuffer, s32RecvLen, TYPE_NUM_UART2);/* Hart协议数据处理 */memset(&stHartFrameRecv, 0, sizeof(StHartDataFrame));s32Err = RecvDataStructDeal(u8Uart1TxBuffer, s32RecvLen, &stHartFrameRecv); if(s32Err == 0){/* USER CODE BEGIN SWITCH */switch(stHartFrameRecv.u8Start){case TYPE_MAIN_SLAVE_SHORT_FRAME://主机到从机短帧结构(角色:从机)break;case TYPE_MAIN_SLAVE_LONG_FRAME://主机到从机长帧结构(角色:从机)break;case TYPE_SLAVE_MAIN_SHORT_FRAME://从机到主机短帧结构(角色:主机)break;case TYPE_SLAVE_MAIN_LONG_FRAME://从机到主机长帧结构(角色:主机)break;case TYPE_BURST_MODE_SHORT_FRAME://突发模式短帧结构 (角色:主机)[只有从机可以处于突发模式] break;case TYPE_BURST_MODE_LONG_FRAME://突发模式长帧结构 (角色:主机)[只有从机可以处于突发模式]break;default :break;}/* USER CODE END SWITCH */}/* USER CODE END IF 1*/}/* USER CODE END IF 0*/}/* USER CODE END WHILE */}。
单片机的通信协议
单片机的通信协议一、概述通信协议是指在通信过程中,设备间遵循的规则和约定。
单片机作为一种微型计算机,常常用于嵌入式系统中。
在嵌入式系统中,单片机之间的通信协议起着至关重要的作用。
本文将针对单片机的通信协议进行全面、详细、完整和深入地探讨。
二、常见的通信协议在单片机中,常见的通信协议有以下几种:1. 串口通信协议(UART)串口通信协议是一种简单且广泛使用的通信协议,它是通过串行通信口进行数据传输的。
串口通信协议常用于单片机与电脑、传感器等外部设备之间的通信。
串口通信协议灵活、易于实现,但传输速度较慢。
2. I2C通信协议I2C通信协议是一种双线制的串行通信协议,它适用于多个设备之间的通信。
I2C 通信协议具有高效、可靠的特点,常用于单片机与外围设备之间的短距离通信。
3. SPI通信协议SPI通信协议是一种高速的全双工通信协议,它适用于单片机与外围设备之间的通信。
SPI通信协议传输速度快、稳定性好,常用于对实时性要求较高的通信场景。
4. CAN通信协议CAN通信协议是一种广泛应用于工业控制领域的通信协议,它适用于多设备之间的分布式通信。
CAN通信协议具有高可靠性、高抗干扰能力的特点,常用于单片机与控制设备之间的通信。
三、通信协议的优势和劣势不同的通信协议具有各自的优势和劣势,下面分别进行介绍:1. 串口通信协议(UART)•优势:–简单易实现,成本低廉。
–支持多种数据格式,灵活性高。
•劣势:–传输速度相对较慢。
–通信距离有限。
2. I2C通信协议•优势:–双线制结构,可同时支持多个设备。
–传输速度较快,适用于短距离通信。
•劣势:–距离限制较为严格。
–存在主从设备冲突问题。
3. SPI通信协议•优势:–高速的全双工通信。
–稳定性好,实时性强。
•劣势:–连接设备数目较少。
–通信距离有限。
4. CAN通信协议•优势:–高可靠性,抗干扰能力强。
–支持分布式通信,适用于复杂系统。
•劣势:–成本较高。
–传输速度相对较慢。
基于TMS320F21812的Can收发程序分析及例程
基于TMS320F21812的Can收发程序分析及例程1、CAN 协议具有以下特点。
(1) 多主控制在总线空闲时,所有的单元都可开始发送消息(多主控制)。
最先访问总线的单元可获得发送权(CSMA/CA 方式*1)。
多个单元同时开始发送时,发送高优先级ID 消息的单元可获得发送权。
(2) 消息的发送在CAN 协议中,所有的消息都以固定的格式发送。
总线空闲时,所有与总线相连的单元都可以开始发送新消息。
两个以上的单元同时开始发送消息时,根据标识符(Identifier 以下称为ID)决定优先级。
ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级。
两个以上的单元同时开始发送消息时,对各消息ID 的每个位进行逐个仲裁比较。
仲裁获胜(被判定为优先级最高)的单元可继续发送消息,仲裁失利的单元则立刻停止发送而进行接收工作。
(3) 系统的柔软性与总线相连的单元没有类似于“地址”的信息。
因此在总线上增加单元时,连接在总线上的其它单元的软硬件及应用层都不需要改变。
(4) 通信速度根据整个网络的规模,可设定适合的通信速度。
在同一网络中,所有单元必须设定成统一的通信速度。
即使有一个单元的通信速度与其它的不一样,此单元也会输出错误信号,妨碍整个网络的通信。
不同网络间则可以有不同的通信速度。
(5) 远程数据请求可通过发送“遥控帧” 请求其他单元发送数据。
(6) 错误检测功能·错误通知功能·错误恢复功能所有的单元都可以检测错误(错误检测功能)。
检测出错误的单元会立即同时通知其他所有单元(错误通知功能)。
正在发送消息的单元一旦检测出错误,会强制结束当前的发送。
强制结束发送的单元会不断反复地重新发送此消息直到成功发送为止(错误恢复功能)。
(7) 故障封闭CAN 可以判断出错误的类型是总线上暂时的数据错误(如外部噪声等)还是持续的数据错误(如单元内部故障、驱动器故障、断线等)。
由此功能,当总线上发生持续数据错误时,可将引起此故障的单元从总线上隔离出去。
单片机通讯协议
单片机通讯协议单片机通讯协议是指单片机与外部设备进行通讯时所遵循的一套规则和约定。
在实际的应用中,单片机通讯协议扮演着非常重要的角色,它直接影响着单片机与外部设备之间的数据交换和通讯稳定性。
因此,了解和掌握各种通讯协议对于单片机的开发和应用至关重要。
常见的单片机通讯协议包括I2C、SPI、UART等。
这些通讯协议各有特点,可以根据实际的应用需求来选择合适的通讯协议。
接下来,我们将分别介绍这几种常见的单片机通讯协议。
首先是I2C通讯协议,它是一种串行通讯协议,适用于多个设备之间的通讯。
I2C通讯协议采用两根线进行数据传输,即时钟线(SCL)和数据线(SDA)。
它具有多主机、多从机的特点,能够实现设备之间的快速通讯。
在实际应用中,I2C通讯协议常用于连接传感器、存储器、显示器等外部设备。
其次是SPI通讯协议,它也是一种串行通讯协议,适用于高速数据传输。
SPI通讯协议采用四根线进行数据传输,包括时钟线(SCLK)、数据输入线(MOSI)、数据输出线(MISO)和片选线(SS)。
SPI通讯协议具有简单、高速的特点,适合于对速度要求较高的应用场景。
在实际应用中,SPI通讯协议常用于连接存储器、显示器、通讯接口芯片等外部设备。
最后是UART通讯协议,它是一种异步串行通讯协议,适用于单片机与外部设备之间的数据传输。
UART通讯协议采用两根线进行数据传输,包括发送线(TX)和接收线(RX)。
UART通讯协议具有简单、稳定的特点,适合于对稳定性要求较高的应用场景。
在实际应用中,UART通讯协议常用于连接传感器、通讯接口芯片、无线模块等外部设备。
除了上述介绍的几种通讯协议外,还有许多其他类型的通讯协议,如CAN、USB、Ethernet等。
这些通讯协议各有特点,可以根据实际的应用需求来选择合适的通讯协议。
在实际的单片机开发中,选择合适的通讯协议对于系统的稳定性和性能至关重要。
开发人员需要根据实际的应用场景和需求来选择合适的通讯协议,并合理设计通讯协议的数据格式、传输速率、错误检测和纠正等机制,以确保通讯的稳定性和可靠性。
基于STM32单片机的HJ/T212通信协议的实现
基于STM32单片机的HJ/T212通信协议的实现【摘要】HJ/T212通信协议是污染源在线自动监控(监测)系统数据传输标准,是由国家环保行业的标准协议之一,用于规范数据采集、传输、存储和管理,保证各种环境监测仪器、监控设备、传输网络和环保部门应用软件系统之间的连通。
本文主要讨论HJ/T212通信协议在高性能、低成本、低功耗的STM32系列单片机上的实现。
【关键词】STM32;单片机;嵌入式;数据通信;HJ/T2121.引言近年来,随着环保意识的增强,各种各样的环保采集、传输、监控等设备被广泛使用,为了指导各个城市污染源在线自动监控(监测)系统的建设,规范数据采集、传输、存储和管理,保证各种环境监测仪器、监控设备、传输网络和环保部门应用软件系统之间的连通,国家环保行业制定了数据传输标准协议HJ/T212。
STM32系列单片机基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的,采用STM32F103系列ARM Cortex-M3内核。
时钟频率72MHz时,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。
该系类单片机集成功能丰富、以8位机的价格提供32位的性能,现已广泛应用于多种领域,比如嵌入控制、消费电子产品、家用电器以至及工业设备等。
STM32系列单片机这些特点适合在环保数据的采集和传输环节作为主控MCU使用,本文介绍了HJ/T212在以STM32F103C8T6单片机为主控MCU的环保数据传输设备中的实现方法。
2.HJ/T212协议包组成3.HJ/T212协议在STM32F103C8T6中的实现STM32F103C8T6处理器内的通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。
USART利用分数波特率发生器提供宽范围的波特率。
支持查询、中断和DMA三种方式,当选择使用DMA方式,可以实现高速数据通信。
单片机通信协议
单片机通信协议单片机通信协议是指单片机之间进行数据传输和协同工作的一种规则或标准。
通信协议定义了通信双方之间数据格式、传输方式、时序控制等具体细节,以确保数据能够准确、可靠地传输。
在单片机通信协议中,最常用的是串行通信协议,包括UART、SPI和I2C协议。
UART(Universal Asynchronous Receiver/Transmitter,通用异步收发器)使用一对引脚(TX和RX)实现全双工的串行通信。
在UART通信中,每个字节的数据以连续的数据位(bit)、起始位(Start bit)和停止位(Stop bit)的形式传输。
通过波特率(Baud Rate)来定义数据传输速度,常用的波特率有9600、115200等。
SPI(Serial Peripheral Interface,串行外设接口)是一种同步的串行通信协议,使用四根信号线(SCK、MISO、MOSI和SS)实现通信。
SPI通信采用主从架构,主设备通过SCK时钟信号驱动数据传输,数据从主设备的MOSI线输入,从设备的MISO线输出。
通过控制SS线,主设备可以选择与哪个从设备进行通信。
I2C(Inter-Integrated Circuit,串行二进制接口)是一种双线制的串行通信协议,使用两根信号线(SDA和SCL)进行通信。
I2C通信中的一个节点扮演主设备的角色,负责向其他节点发送读写请求。
在I2C通信中,每个节点都具有唯一的地址,主设备通过地址来选择与哪个节点进行通信。
I2C通信中还包含了起始条件和停止条件,用于确定数据传输的开始和结束。
这些串行通信协议在单片机中被广泛应用。
在实际应用中,单片机可以通过这些通信协议与其他外部设备进行数据交换,比如与传感器进行数据采集、与显示器进行数据显示、与存储器进行数据存储等。
除了串行通信协议,单片机通信还可以采用并行通信协议。
并行通信协议使用多根信号线同时传输多位数据,通信速率较快。
STM32学习笔记:IIC通信协议详解(附带软件模拟源码)
STM32学习笔记:IIC通信协议详解(附带软件模拟源码)介绍IIC 即Inter-Integrated Circuit(集成电路总线),这种总线类型是由飞利浦半导体公司设计出来的⼀种简单、双向、⼆线制、同步串⾏总线。
它是⼀种多向控制总线,也就是说多个芯⽚可以连接到同⼀总线结构下,同时每个芯⽚都可以作为实时数据传输的控制源。
这种⽅式简化了信号传输总线接⼝。
那么也就是说,只要收发双⽅同时接⼊SDA(双向数据线)、SCL(同步时钟线)便可以进⾏通信。
I2C总线的⼯作速度分为 3 种模式(实际上,IIC的通信速率由SCL决定):S(标准模式),测量与控制场合,100kbit/s;F(快速模式),速率为 400kb/s;(默认,⽬前普遍⽀持的最⼤速率)Hs(⾼速模式),速率为 3.4Mb/s(⽀持这种标准的器件很少)。
IIC接线框图⼀般情况下,SCL与SDA默认由上拉电阻拉⾼。
这也是为了⽅便通信协议。
多机连接时,为了区分不同的从机,我们会使⽤⾃定义的地址码进⾏区分。
IIC的通信状态IIC的通信要注意以下6个知识点:1.空闲状态2.开始信号3.停⽌信号4.应答信号5.数据的有效性6.数据传输空闲状态在IIC中规定,当SDA、SCL同时为⾼电平时,视为空闲状态。
注意,这个规定是通信设备通信前的判断条件。
开始信号 & 停⽌信号在IIC中规定,当SCL为⾼电平,且SDA从⾼到低的跳变时,视为数据开始传输;在IIC中规定,当SCL为⾼电平,且SDA从低到⾼的跳变时,视为数据停⽌传输;数据有效性 & 数据传送 & 应答信号(ACK)数据有效性:在传输数据时,应保证数据在SCL的上升沿到来之前准备好,并在下降沿到来之前必须稳定。
(由于在电路中,电平的跳变往往伴随着⽑刺。
)数据传送:在I2C总线上传送的每⼀位数据都有⼀个时钟脉冲相对应(或同步控制),即在SCL串⾏时钟的配合下,在SDA上逐位地串⾏传送每⼀位数据。
STM32 网络通信I2C与CGI应用解析
STM32 网络通信I2C与CGI应用解析简介
本文将分析STM32单片机的网络通信方案中的I2C通信和CGI应用,并对其进行解析和说明。
I2C通信
I2C(Inter-Integrated Circuit)是一种串行通信协议,常用于连接微控制器和外围设备。
在STM32单片机中,通过I2C总线可以实现与其他设备的数据交互。
I2C通信的原理
I2C通信由两根线组成:串行数据线(SDA)和串行时钟线(SCL)。
数据的传输通过SDA线进行,而时钟同步通过SCL线来控制。
通过拉高和拉低这两根线的电平,可以实现数据的双向传输和同步。
STM32中的I2C模块
STM32单片机内部集成了多个I2C模块,可以通过配置寄存器来实现I2C通信。
I2C通信的应用
I2C通信在STM32的网络通信中广泛应用,例如连接温度传感器、湿度传感器、EEPROM存储器等外设,实现数据的读取和写入。
CGI应用
CGI应用的原理
STM32中的CGI应用
STM32单片机可以通过支持TCP/IP协议的网络模块实现CGI 应用。
通过编写CGI程序,可以实现与Web服务器的交互和数据处理。
CGI应用的实现
总结
本文介绍了STM32单片机网络通信方案中的I2C通信和CGI 应用。
通过I2C通信可以实现与外设的数据交互,而CGI应用则可以实现与Web服务器的数据交互和动态网页的生成。
掌握这些技术可以为STM32网络通信的开发和应用提供参考和指导。
以上是对STM32 网络通信I2C与CGI应用的解析,希望对您有所帮助。
单片机的通信协议
单片机的通信协议在现代科技领域,单片机已成为许多电子设备中不可或缺的核心组成部分。
而要实现多个单片机之间的通信,就需要使用特定的通信协议。
本文将介绍一些常见的单片机通信协议,包括SPI、I2C和UART。
一、SPI通信协议SPI(Serial Peripheral Interface)是一种同步的全双工通信协议,用于在主从设备之间传输数据。
SPI通信需要四个线路:时钟线(SCLK)、主从选择线(SS/CS)、主设备输出线(MOSI/SIMO)和主设备输入线(MISO/SOMI)。
SPI通信中,主设备控制通信时序,并通过时钟线将时钟信号传输给从设备。
在每个时钟周期中,主设备通过主设备输出线向从设备发送数据,并通过主设备输入线接收从设备返回的数据。
主从设备通过主从选择线进行选择和区分。
二、I2C通信协议I2C(Inter-Integrated Circuit)是一种双线制的串行通信协议,用于实现多个设备之间的通信。
I2C通信需要两个线路:时钟线(SCL)和数据线(SDA)。
I2C通信中,所有设备都通过这两条线路进行通信。
时钟线由主设备控制,并在每个时钟周期中产生时钟信号。
数据线用于传输数据,包括地址和实际数据。
每个设备都有一个唯一的地址,以便主设备能够选择和与之通信。
三、UART通信协议UART(Universal Asynchronous Receiver Transmitter)是一种异步的串行通信协议,广泛应用于串口通信。
UART通信使用两根线路:数据线(TX/RX)和地线(GND)。
UART通信中,数据线用于发送和接收数据。
发送数据时,数据线上的逻辑电平会根据发送数据的位值变化。
接收数据时,从设备通过数据线接收主设备发送的数据。
地线则用于连接设备之间的公共地。
以上是一些常见的单片机通信协议,每种协议都有其特定的优势和适用场景。
选择合适的通信协议取决于具体的应用需求和硬件限制。
在设计单片机通信系统时,需要考虑到通信速率、设备数量、数据传输可靠性以及硬件成本等方面的因素。
单片机通信协议
单片机通信协议单片机通信协议是指在单片机系统中,两个或多个设备之间进行通信时所遵循的规则和约定。
通信协议的设计和选择对于单片机系统的稳定性和可靠性至关重要,因此在实际应用中,我们需要对单片机通信协议有所了解,并选择合适的通信协议来满足系统的需求。
在单片机系统中,常见的通信协议包括串口通信协议、SPI通信协议、I2C通信协议等。
这些通信协议各自具有特定的特点和适用范围,我们需要根据具体的应用场景来选择合适的通信协议。
首先,串口通信协议是单片机系统中应用最为广泛的通信协议之一。
串口通信协议包括UART和USART两种类型,通过串口通信协议,单片机可以与计算机、传感器、显示器等外部设备进行数据交换。
串口通信协议具有简单、成本低、传输距离远等优点,因此在很多应用场景下得到了广泛应用。
其次,SPI通信协议是一种高速的串行通信协议,适用于单片机与外部设备之间的高速数据传输。
SPI通信协议通过主从式的通信方式,可以实现多个外部设备同时与单片机进行通信,因此在一些对通信速度要求较高的场景下得到了广泛应用。
另外,I2C通信协议是一种双线串行通信协议,适用于单片机与外部设备之间的短距离通信。
I2C通信协议具有简单、灵活、可靠的特点,可以实现多个外部设备与单片机的连接,因此在一些对通信线路要求较为严格的场景下得到了广泛应用。
在选择通信协议时,我们需要考虑通信速度、通信距离、通信线路、外部设备的兼容性等因素。
同时,我们还需要考虑单片机系统的资源情况,选择合适的通信协议来满足系统的需求。
总的来说,单片机通信协议在单片机系统中起着至关重要的作用。
通过合理选择和设计通信协议,可以实现单片机与外部设备之间的稳定、高效的数据交换,从而保障单片机系统的正常运行。
因此,我们在实际应用中需要对单片机通信协议有所了解,并选择合适的通信协议来满足系统的需求。
32单片机通信协议
32单片机通信协议32单片机通信协议本协议由以下双方共同制定并遵守:甲方:地址:法定代表人:联系电话:电子邮件:乙方:地址:法定代表人:联系电话:电子邮件:一、基本信息1. 本协议的目的是规定甲乙双方在32单片机通信中的权利和义务,以确保通信的有效性和安全性。
2. 本协议具有法律效力,双方应遵守中国相关法律法规。
二、各方身份、权利、义务、履行方式、期限、违约责任1.甲方身份:甲方是32单片机通信的使用者。
2.甲方权利:在使用32单片机通信的过程中,甲方有权要求乙方保证通信的顺利进行,并提供必要的技术支持和帮助。
3.甲方义务:甲方应按照32单片机通信的要求进行使用,并承担由于自身原因引起的通信故障和其他后果的责任。
4.乙方身份:乙方是32单片机通信的提供者。
5.乙方权利:乙方有权要求甲方按照本协议规定进行使用,并有权采取措施保障通信的安全、稳定和有效。
6.乙方义务:乙方应提供可靠、准确的技术支持和服务,保障32单片机通信的正常运行,并承担由于自身原因引起的通信故障和其他后果的责任。
7.履行方式:甲乙双方应通过书面或电子邮件等方式确认通信细节和相关事项。
8.期限:本协议自甲乙双方签署之日起生效,有效期为协议期限。
9.违约责任:如甲乙双方任何一方违反本协议的规定,未能履行相关义务,给对方造成损失的,应承担相应的法律责任。
三、冲突解决在履行本协议过程中,如发生任何争议,应通过友好协商解决。
如不能协商解决的,应向当地法院提起诉讼。
四、附则1.本协议可以由双方共同协商修改,修改内容应经过双方书面确认生效。
2.本协议与中国相关法律法规不一致的,依照中国法律法规的规定执行。
3.本协议未尽事宜,由双方协商处理。
单片机通信协议处理
单片机通信协议处理单片机通信协议处理是指单片机通过与外设设备或其他单片机之间建立起通信连接,并遵循特定的协议进行数据交换和控制的过程。
在单片机应用中,常见的通信协议包括UART、SPI、I2C等。
下面将以UART通信协议为例,详细介绍单片机通信协议处理的相关内容。
UART(通用异步收发传输)是一种常见的串行通信协议,它通过一根数据线和一根时钟线进行数据传输,无需外部时钟源。
在UART通信中,数据按照一定的帧结构进行传输,包括起始位、数据位、校验位和停止位。
单片机处理UART通信协议时可以采用状态机的方式。
状态机是一种模型,通过描述系统在不同状态下的行为和状态转移条件,来实现对系统的控制。
在UART通信中,可以定义以下几个状态:1.空闲状态:单片机处于空闲状态,等待接收或发送数据。
2.接收状态:单片机正在接收数据。
3.发送状态:单片机正在发送数据。
下面是一个简单的UART通信协议处理的状态机示例:```cppenum UART_StateIDLE_STATE,RECEIVE_STATE,SEND_STATE};UART_State state = IDLE_STATE; // 初始状态为空闲状态void UART_Interrupt_Handleswitch (state)case IDLE_STATE://检测到开始位,进入接收状态state = RECEIVE_STATE;break;case RECEIVE_STATE://接收数据if (接收到完整的一帧数据)//数据处理//判断是否需要发送应答if (需要发送应答)//进入发送状态state = SEND_STATE;} else//进入空闲状态state = IDLE_STATE;}}break;case SEND_STATE://发送数据//判断是否发送完成if (发送完成)//进入空闲状态state = IDLE_STATE;}break;}```在状态机中,单片机通过中断处理函数来响应UART中断事件。
212国标串口协议需求V1.7
编号:国标协议需求说明日期仪器厂家型号编写人审核人密级2013/04/11 青岛崂山设备王志青内部公开北京万维盈创科技发展有限公司1版本号日期开发人员开发原因(修正BUG、增加、修改等)依赖程序配置文件注意:依赖程序是指主程序、数据库、屏程序等;配置文件是指串口协议自身相关文件。
2版本编号或者更改记录编号*变化状态简要说明(变更内容和变更范围)日期变更人V1.1 M 1.可解析cp区有空格的报文2.只对报文的CP区进行判断吴王芳V1.2 M 现场青岛崂山设备输出的国标报文中的PW后面有00字符,导致程序断包无法解析数据。
屏蔽PW后面的0字符即可。
20130411 王志青V1.3 M 增加对022、023、027、029的解析20121220吴王芳V1.4M若数采仪收到的数据包中个别因子有乱码,那此因子的值保持上一次的正常值20140113吴王芳V1.5 M 判断CN=2011,当前端仪器发送2051、2073等报文时,不影响2011的解析入库20140414 吴王芳V1.6 M 折算值和实测值在一个分号内数采仪正常解析,而且无论折算值在前面还是实测值在前面,数采仪均解析数据20140529 王振V1.7 M 修改V1.6版本的一个bug,当数据包有乱码的时候,数据解析错误,目前修改为当有乱码的时候,正常的因子可以解析,有乱码的因子不解析,保持上一次数据。
20140820 王晓亮*变化状态:A——增加,M——修改,D——删除3212国标串口协议需求说明1、添加关闭打开串口功能2、支持折算数采仪计算和从前端仪器读取:/root/configure文件中Keepselect=212 1 数采仪计算折算;Keepselect=212 0 数采仪解析前端仪器回复的折算3、定时器注册与信号处理函数对调4、支持57600波特率5、解析如下特殊报文:##0203ST=32;CN=2011;MN=01C ( 5;PW=Y B;CP=&&DataTime=20120816150342;011-Rtd=0 085.7;001-Rtd=00.00;B01-Rtd=0000.0&&@23 23 30 32 30 33 53 54 3D 33 32 3B 43 4E 3D 32 30 31 31 3B 4D 4E 3D 30 31 00 43 02 E0 28 1C E5 F7 A4 F8 01 35 3B 50 57 3D 59 03 A8 42 E2 D8 3B 43 50 3D 26 26 44 61 74 61 54 69 6D 65 3D 32 30 31 32 30 38 31 36 31 35 30 34 31 35 3B 30 31 31 2D 52 74 64 3D 30 30 38 35 2E 37 3B 30 30 31 2D 52 74 64 3D 30 30 2E 30 30 3B 42 30 31 2D 52 74 64 3D 30 30 30 30 2E 30 26 26 00 40 00 01 0D 0A6、实测值和折算值在一个分号内或是不在一个分号内都可以解析47、可解析如下报文:(报文中有空格)##0346ST=31;CN=2011;PW=123456;MN=888888000001;CP=&&DataTime=20121114162900 ;B02-Rtd=63.075;S07-Rtd=12;S03-Rtd=34.55,S03-Flag=N;S08-Rtd=-106.36,S08-Flag=N ;S02-Rtd=6.17,S02-Flag=N;S05-Rtd=4,S05-Flag=N;S01-Rtd=19.04,S01-Flag=N;01-Rtd=1033.12, 01-ZsRtd=7913.8, 01-Flag=N; 02-Rtd=222.26, 02-ZsRtd=1702.51, 02-Flag=N; 03-Rtd=9.47, 03-ZsRtd=72.56, 03-Flag=N&&EF418、解析如下16进制报文:ASCII码:##0203ST=32;CN=2011;MN=01C ( 5;PW=KB;CP=&&DataTime=20130410150547;011-Rtd=00 07.5;001-Rtd=00.00;B01-Rtd=0000.0&&@16进制:23 23 30 32 30 33 53 54 3D 33 32 3B 43 4E 3D 32 30 31 31 3B 4D 4E 3D 30 31 00 43 02 E0 28 1C E5 F7 A4 F8 01 35 3B 50 57 3D 4B 00 A8 42 E2 D8 3B 43 50 3D 26 26 44 61 74 61 54 69 6D 65 3D 32 30 31 33 30 34 31 30 31 35 30 36 32 36 3B 30 31 31 2D 52 74 64 3D 30 30 30 37 2E 35 3B 30 30 31 2D 52 74 64 3D 30 30 2E 30 30 3B 42 30 31 2D 52 74 64 3D 30 30 30 30 2E 30 26 26 00 40 00 01 0D 0A9. 可解析如下报文:##0347ST=31;CN=2011;PW=123456;MN=888888000001;CP=&&DataTime=20121114162800;B02 -Rtd=01C ( 5;S07-Rtd= ;S03-Rtd=35.01,S03-Flag=N;S08-Rtd=-106.7,S08-Flag=N;S0 2-Rtd=6.12,S02-Flag=N;S05-Rtd=4,S05-Flag=N;S01-Rtd=@ ,S01-Flag=N;01-Rtd=1033.13, 01-ZsRtd=6797.62, 01-Flag=N; 02-R%=250.28, 02-ZsRtd=1646.74, 02-Flag=N; 03-Rtd=10.49, 03-ZsRtd=69.02, 03-Flag=N&&D70110. 可解析山西区域报文:131411336709##0168ST=32;CN=2011;PW=123456;MN=100108171B1201;CP=&&DataTime=2014 0113164058;001-Rtd=0.00,001-Flag=D;011-Rtd=0.00,011-Flag=D;060-Rtd=0.00,060-Fl ag=D;B01-Rtd=0.00,B01-Flag=D&&36001. 运行环境类别具体说明备注数采仪硬件型号801、802移植原始升级包版本现场情况描述2. 串口参数硬件接口三线制RS232、两线制RS485波持率2400bps--115200bps数据位8/753. 参数因子对照表(污染物可设)4. 协议分析校验码 N(无校验)、O (奇校验)、E (偶校验)0、1 停止位1、1.5、2参数因子名称上报代码 前端输入单位插入数据库单位上报平台单位 屏幕显示单位数据来源是否DO 联动在线仪器主动上报式,数采仪被动接收数据类型 ASCII 码其他协议文本分析采集指令在线仪器主动上报频率在线仪器主动上报指令具体字段解析 具体见HJ/T212--2005协议文本现场实例分析采集指令在线仪器主动上报频率在线仪器可设,建议30秒7 附录:HJ/T212--2005协议文本在线仪器主动上报指令##0264ST=32;CN=2011;PW=123456;MN=88888800000001;CP=&&Data Time=20111226070103;S01-Rtd=1.00,S01-Flag=N;S02-Rtd=2.00,S02-Flag =N;S03-Rtd=3.00,S03-Flag=N;S04-Rtd=4.00,S04-Flag=N;S05-Rtd=5.00,S 05-Flag=N;S06-Rtd=6.00,S06-Flag=N;S07-Rtd=7.00,S07-Flag=N;S08-Rtd =8.00,S08-Flag=N&&5780(回车换行)具体字段解析特殊要求1 Flag 标志位2 污染物可设 可设3 分包处理4 ID 可设 支持configure 文件、file 文件/兼容多串口国标协议,不读polld5 单位转换6 大数处理方式7 数据保持8 屏显示小数位9 上报小数位 10 数据超过量程或报警上下限处理机制11 其他。
基于STM32的CANopen通讯协议的实现
基于STM32的CANopen通讯协议的实现
王海燕;龙辛
【期刊名称】《工业设计》
【年(卷),期】2012(0)A02
【摘要】CANopen作为CAN网络的一种开放的应用层协议,在工厂自动化系统中得到广泛应用。
其应用可以提高系统的可靠性、通讯效率及灵活性。
本文采用CANopen通讯协议实现了基于STM32单片机的I/O从站与上位机CAN卡之间的通讯,并通过测试实验,验证了系统信息传递的可靠性、准确性和实时性,具有一定的应用价值。
【总页数】3页(P131-133)
【关键词】STM32;CANopen;CAN网络
【作者】王海燕;龙辛
【作者单位】湘潭大学信息工程学院电气工程系;湘潭湘电风能有限公司
【正文语种】中文
【中图分类】TP273
【相关文献】
1.基于STM32的CANopen协议的实现 [J], 徐征辉;刘凤秋;张梦博;李美鹏;李欣
2.基于DSP的CANopen通讯协议的实现 [J], 马艳歌;贾凯;徐方
3.基于DSP的CANopen通讯协议的实现 [J], 马艳歌;贾凯;徐方
4.基于CANOPEN协议的从站代码在STM32上的实现 [J], 李钢; 王飞
5.基于CAN总线的CANopen协议讲座(12) 如何快速实现CANopen网络的组建与配置——基于CANopen协议的通信网络 [J],
因版权原因,仅展示原文概要,查看原文内容请购买。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于STM32单片机的HJ/T212通信协议的实现
【摘要】HJ/T212通信协议是污染源在线自动监控(监测)系统数据传输标准,是由国家环保行业的标准协议之一,用于规范数据采集、传输、存储和管理,保证各种环境监测仪器、监控设备、传输网络和环保部门应用软件系统之间的连通。
本文主要讨论HJ/T212通信协议在高性能、低成本、低功耗的STM32系列单片机上的实现。
【关键词】STM32;单片机;嵌入式;数据通信;HJ/T212
1.引言
近年来,随着环保意识的增强,各种各样的环保采集、传输、监控等设备被广泛使用,为了指导各个城市污染源在线自动监控(监测)系统的建设,规范数据采集、传输、存储和管理,保证各种环境监测仪器、监控设备、传输网络和环保部门应用软件系统之间的连通,国家环保行业制定了数据传输标准协议HJ/T212。
STM32系列单片机基于专为要求高性能、低成本、低功耗的嵌入式应用专门设计的,采用STM32F103系列ARM Cortex-M3内核。
时钟频率72MHz时,STM32功耗36mA,是32位市场上功耗最低的产品,相当于0.5mA/MHz。
该系类单片机集成功能丰富、以8位机的价格提供32位的性能,现已广泛应用于多种领域,比如嵌入控制、消费电子产品、家用电器以至及工业设备等。
STM32系列单片机这些特点适合在环保数据的采集和传输环节作为主控MCU使用,本文介绍了HJ/T212在以STM32F103C8T6单片机为主控MCU的环保数据传输设备中的实现方法。
2.HJ/T212协议包组成
3.HJ/T212协议在STM32F103C8T6中的实现
STM32F103C8T6处理器内的通用同步异步收发器(USART)提供了一种灵活的方法来与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。
USART利用分数波特率发生器提供宽范围的波特率。
支持查询、中断和DMA三种方式,当选择使用DMA方式,可以实现高速数据通信。
从协议可以看出,当接收到两个字符时可以判断一个完整的协议包接收完成。
进而对该协议数据帧进行解析协议解析部分可以用C语言实现,下面的程序流程图1为STM32F103C8T6响应HJ/T212协议数据帧函数,主要功能是判断协议包包头是否有效,校验码是否正确,如果校验码正确的则把数据包的内容按照项目内容进行分割处理协议包的内容。
由于从上位机发送的协议包通常都是一包发送完成,所以协议单片机段的协议解析可以忽略总包号和包号,如果系统设置访问密码,则解析协议时需要判断密码是否正确,只有密码有效才能认为是有效数据包,这个密码的使用可以对数据的传输是一种安全措施。
设备唯一标识MN也是一个必要参数,上位机通过网络可能同时与多台终端相连,此时上位机下发的指令需要根据设备标识符MN判断上位机要操作的终端设备。
STM32F103C8T6单片机接收并解析数据包后,需要根据协议的应答要求分步骤进行应答。
通常收到一包完整数据包后,现场机立刻进行请求应答,然后返回操作执行结果。
4.CRC算法及其实现
CRC即循环冗余校验码(Cyclic Redun-dancy Check):是数据通信领域中最
常用的一种差错校验码,该校验算法的特点是信息字段和校验字段的长度可以任意选定。
CRC校验码的两个字节,包含一16位的二进制值。
它由传输设备计算后加入到数据包中。
接收设备重新计算收到消息的CRC,并与接收到的CRC域中的值比较,如果两值不同,则有误。
①装一个16位寄存器,所有数位均为1。
②取被校验串的一个字节与16位寄存器的高位字节进行“异或”运算。
运算结果放入这个16位寄存器。
③把这个16寄存器向右移一位。
④若向右(标记位)移出的数位是1,则生成多项式1010000000000001和这个寄存器进行“异或”运算;若向右移出的数位是0,则返回③。
⑤重复③和④,直至移出8位。
⑥取被校验串的下一个字节
⑦重复③~⑥,直至被校验串的所有字节均与16位寄存器进行“异或”运算,并移位8次。
⑧这个16位寄存器的内容即2字节CRC错误校验码。
5.结束语
STM32F103C8T6为开发人员提供了高性能的数字解决方案,通过在该MCU 上实现HJ/T212协议使得系统具有很好的开放性和通用性,同时在别的嵌入式系统的串口通信的实现上也有很好的借鉴意义。
参考文献
[1]曹圆圆.基于STM32的温度测量系统[J].仪器仪表与分析监测,2010,1:16-18.
[2]ST.datasheet:STM32F103x8/B DS5319.pdf,2006.
[3]国家环境保护总局.数据手册:HJT212-2005污染源在线自动监控(监测)系统.pdf,2006.。