Modbus-rtu通信波特率自动匹配的制作方法
【专利摘要】本发明公开了MODBUS-RTU通信波特率自动匹配,它的实现过程如下:①从站上电时设置串口的波特率为默认的波特率,等待接收总线上的串口报文,如果连续5次接收到的报文为错误报文就重新设置串口波特率为主从站越好的下一个波特率,直到正确接收到串口报文时,就以这波特率与主站通信;②在正常通信的情况下,主站更改了波特率,从站会实时检测接收到的总线上的报文是否正确,如果连续5次接收到错误报文,重复波特率匹配过程,直到接收正确报文,从站接收到的报文是否正确判断依据MODBUS通信协议的数据格式进行校验,主要校验CRC校验码,整个报文长度。本发明提供一种不需要更改总线通信与设置总线上的每台设备的,实现主从站波特率的自动匹配。
【专利说明】MODBUS-RTU通信波特率自动匹配
【技术领域】
[0001] 本发明涉及工业自动控制领域,特别是M0DBUS-RTU通信波特率自动匹配。
【背景技术】
[0002] M0DBUS-RTU协议是一个公开的、被广泛应用的串行通信协议,最初由Modicon公 司为其可编程控制器和工业自动化系统而制定,广泛用于控制设备间传输数字和模拟的 I/O及寄存器数据时使用,此协议定义了一个控制器能认识使用的消息结构,而不管它们 是经过何种网络进行通信的。它描述了一个控制器请求访问其它设备的过程,如何回应来 自其它设备的请求,以及怎样侦测错误并记录。它制定了消息域格局和内容的公共格式,在 RS-485总线上,大部分采用主从通信方式,一台主机,连接多从站。主机与从站通信主要依 靠从站ID号来标识,使主站与相应的从站进行数据交换。而主站与从站通信的前提是,主 站与从站通信的波特率要一致,现有的技术主要采用拨码开关来设置每台从站的波特率或 通过软件来设置从站的波特率,在使用时只要主站的波特发生更改,就要通过拨码开关或 软件对通信总线上设备就要每台设置波特率,使用起来很不方便,特别在整个系统运行起 来以后通信不稳定,需要改变总线的波特率时,所需要的时间较长严重的影响系统的使用。
[0003] RS-485总线通信,连接在同一总线上的设备通信波特率必须一致,现有RS-485通 信的设波特率设置都是通过拨码开发、软件或其他方式单台进行设置,需要更改总线通信 的波特率必须对总线上的每台设备进行设置,在一条总线上可能有几十台设备,每台设备 相距几十米到几百米,有可能上千米,整个系统运行起来以后如果通信不稳定,需要降低通 信波特率来增强通信的稳定性的时候,就需要将停止整个总线设备运行,通过拨码开发、软 件或其他方式人工单台进行设置,设置完以后重新运行整个总线上的设备,这个过程需要 几十分钟到几个小时,1、增加整个系统的维护人工成本;2、停止整个总线设备运行几十分 钟到几个小时会给整个系统带来严重后果。
【发明内容】
[0004] 本发明的目的是为了克服现有技术的缺点和不足,提供一种不需要更改总线通信 与设置总线上的每台设备的,实现主从站波特率的自动匹配的M0DBUS-RTU通信波特率自 动匹配。
[0005] 本发明是通过以下技术方案予以实现的: M0DBUS-RTU通信波特率自动匹配的实现过程如下: 1、 从站上电时设置串口的波特率为默认的波特率,等待接收总线上的串口报文,如果 连续5次接收到的报文为错误报文就重新设置串口波特率为主从站越好的下一个波特率, 直到正确接收到串口报文时,就以这波特率与主站通信; 2、 在正常通信的情况下,主站更改了波特率,从站会实时检测接收到的总线上的报文 是否正确,如果连续5次接收到错误报文,重复波特率匹配过程,直到接收正确报文。从站 接收到的报文是否正确判断依据MODBUS通信协议的数据格式进行校验,主要校验CRC校验 码,整个报文长度。
[0006] 本发明的有益效果是,主从站约定了几种波特率(9600、19000、38400、57600、 93750、1115200、187500、250000、300000、500000、1000000、2000000、250000013行/8),可根 据需要而改变,主站可根据约定而改变整个总线上的通信波特率,主站更改波特率时,从站 自动与主站波特率进行匹配,从而实现主从正确通信。
【专利附图】
【附图说明】
[0007] 图1为从站与主站波特率自动匹配流程示意图。
【具体实施方式】
[0008] 下面结合附图和具体实施例,对本发明作进一步的描述。
[0009] 如图1所示的从站与主站波特率自动匹配,如下代码基于STM32F103芯片,调用了 STM32F103的库,具体描述如下: /* 从站通信波特率组合定义 */ #define UART_RXBUF_DMA_LEN 300 const unsigned int ASC_Baudrate_Const [15] = { 9600, 19000, 38400, 57600, 93750, 1115200, 187500, 250000, 300000, 500000, 1000000, 2000000, 2500000 }; Unsigned char ASCRevBuf[300]; Unsigned char BaudrateInde=0; Unsggned char ASCRevErroNum=0; uint32_t AscDMA_Ptr=0; /* 串口接收处理(使用串口通信DMA方式) */ void 0nASC2_Event(void) { uintl6_t i = 0; uint32_t TempCount, CurrentPos; Unsigned char ASCRevErroSign=0; if (USART_GetITStatus(USART2, USART_IT_IDLE) != RESET) { TempCount = USART2->SR; TempCount = USART2->DR; //清除串口接收中断标志 /* 计算接收报文的长度 */ CurrentPos=UART_RXBUF_DMA_LEN - DMA_GetCurrDataCounter(DMAl_Channel6); if (CurrentPos>AscDMA_Ptr) { TempCount=CurrentPos-AscDMA_Ptr; } else { TempCount=CurrentPos+(UART_RXBUF_DMA_LEN-AscDMA_Ptr); } /* 把接收的串口报文COPY到接收缓冲区 */ If (TempCount<300) { for (i=0;i<TempCount;i++) { ASCRevBuf [i]=Uartl_RxBuf_DMA[AscDMA_Ptr]; AscDMA_Ptr++; i f(AscDMA_Ptr>=UART_RXBUF_DMA_LEN) { AscDMA_Ptr=0; } } } Else { ASCRevErroSign=l; } /*判断接收的串口报文是否正确(CRC校验按照MODBUS标准实现) if(ModbusCRCVerify(ASCRevBuf, TempCount)!=0|| ASCRevErroSign) { ASCRevErroNum++; //接收错误报文数加1 /* 接收连续6个错误的的报文重新设置串口的波特率 */ if(ASCRevErroNum>5) { Baudratelnde++; Baudratelnde%=12; ASC_Baudrate(ASC_Baudrate_Const【Baudratelnde】; } return; } /* 进行正常的MODBUS处理流程 */ if (pAsc->pRxSem) { OSMboxPost (pAsc->pRxSem, MsclRxMsg); } ASCRevErroNum=0 ; return; } } void ASC_Baudrate_ (-word32 TheBaudrate,) { USART_InitTypeDef USART_InitStructure; USART_InitStructure. USART_WordLength = USART_WordLength_8b ;//8 位数据位 USART_InitStructure. USART_StopBits = USART_StopBits_l; //1 位停止位 USART_InitStructure. USART_Parity =USART_Parity_No; // 无奇偶校验 SART_InitStructure· USART_HardwareF1owContrο 1 = USART_ HardwareFlowControl_None; //无数据流控制 USART_InitStructure. USART_Mode = USART_Mode_Rx | USART_Mode_Tx; // 使能 发送与接收 USART_InitStructure. USART_BaudRate = TheBaudrate;设置波特率 USART_Init(USART2,&USART_InitStructure);初始化串口 使能相应的串口中断 USART_ITConfig(USART2, USART_IT_TC, DISABLE); USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); USART_ITConfig(USART2, USART_IT_TXE , DISABLE); USART_ITConfig(USART2, USART_IT_IDLE, ENABLE); USART_Cmd(USART2, ENABLE);使能串口 }〇
【权利要求】
1. MODBUS-RTU通信波特率自动匹配,其特征在于,它的实现过程如下:①从站上电时 设置串口的波特率为默认的波特率,等待接收总线上的串口报文,如果连续5次接收到的 报文为错误报文就重新设置串口波特率为主从站越好的下一个波特率,直到正确接收到串 口报文时,就以这波特率与主站通信;②在正常通信的情况下,主站更改了波特率,从站会 实时检测接收到的总线上的报文是否正确,如果连续5次接收到错误报文,重复波特率匹 配过程,直到接收正确报文,从站接收到的报文是否正确判断依据MODBUS通信协议的数据 格式进行校验,主要校验CRC校验码,整个报文长度。
【文档编号】H04L12/40GK104052579SQ201410289938
【公开日】2014年9月17日 申请日期:2014年6月26日 优先权日:2014年6月26日
【发明者】周晓峰, 邓君 申请人:湖南先步信息股份有限公司