历史上的今天
返回首页

历史上的今天

今天是:2024年12月16日(星期一)

正在发生

2019年12月16日 | 51单片机RS485通讯程序仿真与MODBUS RTU静止时间详解

2019-12-16 来源:51hei

仿真原理图如下

由于MODBUS-RTU 要求每帧信息中的数据间隔时间不得超过1.5字符的静止时间。 

因此: 
(1)、当串口产生接收中断后,立即重装“超时定时器”的初始值。(注:超时定时器的初始值和波特率有关) 

问题如下:  
(a)、由于要求在串口接收中断中重装超时定时器初始值,那么,该超时定时器就只能采用“溢出模式”,而不能采用“CTC模式” 
(b)、超时定时器必须在程序初始化时就一直开启。 
我的理解对吗? 

(2)两帧之间的3.5字符的静止时间该如何实现呢? 
接收到每个字节的时候,初始化定时器就行,最后一个字节后,定时器就溢出了
利用单独的软件定时器,来判断一帧接收报文结束,可以防止若报文接收不完整,该帧通信任务无法结束而影响下一帧的接收。 

由于一帧报文中字节与字节之间的时间间隔和帧与帧之间的时间间隔相比要小得多,因此每当接收一个新字节,就启动软件定时器开始计时,定时器的时间设定为帧与帧的最小时间间隔。波特率不同,该时间间隔也不同。若不到预定的时间内又接收到下一个字节,则说明一帧报文未结束,定时器重新计时;若定时器顺利计数到预定时间,就会触发相应的中断号,在该定时器中断子程序中设定帧结束标志字节,表明一帧报文接收完毕。当主程序内检测到一帧报文接收完毕后,会通过核查从方地址及循环冗余校验字节是否正确来判断该帧的有效性。若确定接收到的是一帧发送给已方的正确报文,则会根据报文内的功能码对该帧命令进行相应的处理,并准备发送帧。

上面就是解决以下两个问题的方法 
(1)、当前帧两个字节之间的1.5字符静止时间 
(2)、两帧之间3.5字符的静止时间 

这里有个SPI串口扩展芯片uCSU122P,内置MODBUS引擎,DIP28,或许对你有用点击此处下载  (原文件名:ucmu2_dat_v122.pdf)

其实这个时间不用这么准确啦,因为是问答式的协议,你可以以某个定时时间查询串口缓冲区字符的长度,如果两次读入的长度一样就认为一帧结束了,这个查询间隔根据波特率微调,就是3.5个字符时间。


7楼的做法不严格,如果第一次定时查询的时候正在收最后一个字节,第二次查显然收完了,第三次查数据不变,那么就导致了7个字符的间隔,如果对方在3.5~7字符之间又来了数据,就麻烦了; 

T1.5和T3.5最严格的方法还是开定时器,但是可以灵活一点;低波特率(<19200)的时候严格定时,和波特率相关;高波特率(>19200)的时候就固定定时(T1.5=750us,T3.5=1750us),这样降低了CPU中断响应的负担。
给你这个程序片段应该可以解决你的问题,我的程序经过严格的测试,高扫描周期、波特率19200下连续运行了一个星期,没出一个错误 


#pragma interrupt_handler Timer1:iv_TIMER1_OVF  
void Timer1(void) 

  unsigned short CRC; 
  TCNT1=65525-51*11;//65535-(11*(ubbr+1)) 波特率9600   
  if(CNT<8) 
  { 
     CNT++;        
     if(CNT==4) 
     { 
    ModBusQueryDataLong=IsrCount; 
    IsrCount=0; 
     } 
     else if(CNT==8) 
     {    
    if(ModBusQueryDataLong>2) 
{  
    
       CRC=CRC16((unsigned char *)&ModbusFunctionUnion,ModBusQueryDataLong-2); 
   if((ModbusFunctionUnion.Data[ModBusQueryDataLong-2]==MSB(CRC))&& 
          (ModbusFunctionUnion.Data[ModBusQueryDataLong-1]==LSB(CRC))) 
{   
              FrameStatu=1; 
    }    
    }    
     } 
  }   

#pragma interrupt_handler UART_isr:iv_USART0_RX 
void UART_isr(void) 
{  
  CNT=0;  
  while(!(UCSR0A&(1<  ModbusFunctionUnion.Data[IsrCount++]=UDR0; 




单片机源程序如下:

/*------------------------------------------------------------------------------

MEASURE.C:  Remote Measurement Recorder using the C51 COMPILER


Copyright 1990-2005 Keil Software, Inc.

------------------------------------------------------------------------------*/

#include "includes.h"


sbit       CS=P1^0;                                  //看门狗端口

sbit       ctrl_485=P1^5;         //RS485控制端口


unsigned char RxBuf[LenRxBuf];           //接收缓冲区

unsigned char *inRxBuf,*outRxBuf; //接收缓冲区指针

/***************判断静止字符**************/

unsigned char  time_3;

unsigned char  time_2;

bit                  rt_rxbuf; 

bit                   rt_ctrl;

/***************接收字符**************/

unsigned char  ComBuf[MaxLenComBuf+1] ;

unsigned char  ch;

unsigned char  k1;

unsigned char  n1;

int          i=-1;

int State=StatInputCom;



/*

*********************************************************************************************************

*                                                                                 串口初始化函数

*********************************************************************************************************

*/

void InitSerial()

{

        TMOD=TMOD&0x0F;

        TMOD=TMOD|0x20;

        TH1=0xF4;//2400 , 11.0592MHz

        TL1=0xF4,

        SCON=0x50;PCON=0x00;

        TR1=1;

}

/*

*********************************************************************************************************

*                                                             缓冲区初始化(只定义接收缓冲区)

*********************************************************************************************************

*/

void InitSerialBuffer(void)                   //串口缓冲区初始化

{

        inRxBuf=RxBuf;outRxBuf=RxBuf;

        ctrl_485=0;                              //接收模式

        ES=1;

        EA=1;

}

/*

*********************************************************************************************************

*                                                                  定时器函数

*********************************************************************************************************

*/

void timefunc(void)

{        unsigned char k;

        unsigned char *tt;


        if(!rt_ctrl)  time_2++;          //判断静止时间,配合下面添加结束符

    time_3++;


        if(time_2>20&&!rt_ctrl)

        {   //ES=0;

                for(k=0;k<4;k++)

                {

                        tt=inRxBuf;tt++;                        //数据暂存        5555

                        if(tt==RxBuf+LenRxBuf) tt=RxBuf;        //                5555

                        if(tt==outRxBuf) {break;}          //如果缓冲期满停止加结束标志  5555

                        else

                        {

                                if(k==0)*inRxBuf=0x4A ;

                                if(k==1)*inRxBuf=0x59 ;

                                if(k==2)*inRxBuf=0x48 ;

                                if(k==3)*inRxBuf=0x59 ;

                                inRxBuf=tt;

                        }        //          5555

                }        

                         rt_ctrl=1;

                                                         //  ES=1;                                                          

        }


//        time_1++;

//        time_4++;//接收数据时间判断


}

/*

*********************************************************************************************************

*                                                                串口接收

*********************************************************************************************************

*/

void serial(void) //串口中断服务子程序

{  

        unsigned char *t;


        if(RI)

        {

                RI=0;

                if(time_3>4)   //判断静止时间

                { time_3=0;

                        //         rt_rxbuf=0;

                        rt_rxbuf=1;        // if(SBUF==0x01)rt_rxbuf=1;

                                        // time_3的作用是为判断静止字符之后必须为i本机地址,否则不接受数据,判断下一个静止字符 

                }

推荐阅读

史海拾趣

Global Connector Technology公司的发展小趣事
电源系统中的电压波动或电磁干扰可能干扰继电器的正常工作。
Advanced Ceramic X Corporation公司的发展小趣事
负载的突然变化可能导致电流波动,影响继电器的判断。
BAND-IT公司的发展小趣事

随着电子行业的全球化发展,BAND-IT公司也开始了其全球布局的步伐。作为IDEX Corporation的子公司,BAND-IT在全球范围内建立了销售和制造设施网络,为全球客户提供服务。其产品线不断丰富和完善,涵盖了从扎带、扎扣到紧带机、打包机等各类紧固解决方案。同时,BAND-IT公司还积极投入研发,不断创新产品和技术,以适应电子行业日新月异的发展需求。在全球化的浪潮中,BAND-IT以其卓越的品质和创新能力,赢得了全球客户的信赖和认可。

以上五个故事分别从初创挑战、深海钻探、太空探索、大型基础设施建设以及全球布局等方面展现了BAND-IT公司在电子行业中的发展历程。这些故事基于事实性的描述,旨在展示BAND-IT在电子行业中的发展和贡献,不涉及主观评价。

FLIR公司的发展小趣事

近年来,随着智能化和便携化趋势的兴起,FLIR积极响应市场需求,推出了一系列智能化、便携化的红外热像仪产品。例如,FLIR的I系列和T系列产品就以其小巧轻便、操作简便的特点受到了广大用户的青睐。这些产品不仅具备高性能的红外成像能力,还集成了多种智能化功能,如自动测温、图像分析、报告生成等,极大地提升了用户的使用体验和工作效率。此外,FLIR还推出了适用于智能手机的红外热像仪配件,进一步拓宽了产品的应用领域和市场空间。

Conditioning Semiconductor Devices Corp公司的发展小趣事

随着半导体行业的竞争加剧,价格战和技术更新速度不断加快。CSDC面临着巨大的市场压力。为了应对这些挑战,公司决定调整战略,专注于高端市场的开发。通过加大研发投入,提升产品质量和性能,CSDC逐渐在高端市场站稳了脚跟,实现了业务的稳步增长。

DCD [Digital Core Design]公司的发展小趣事

在市场竞争日益激烈的情况下,DCD公司意识到单打独斗难以取得更大的发展。因此,公司开始寻求与其他企业建立战略合作关系。通过与上下游企业的紧密合作,DCD公司实现了资源共享和优势互补,进一步提升了自身的竞争力。同时,公司还积极参与行业标准的制定和推广工作,为行业的健康发展贡献了自己的力量。

问答坊 | AI 解惑

检测绝缘栅极双极型晶体管(IGBT)好坏的简易方法

1、判断极性首先将万用表拨在R×1KΩ挡,用万用表测量时,若某一极与其它两极阻值为无穷大,调换表笔后该极与其它两极的阻值仍为无穷大,则判断此极为栅极(G)。其余两极再用万用表测量,若测得阻值为无穷大,调换表笔后测量阻值较小。在测量阻值 ...…

查看全部问答>

很奇怪的问题 wince 串口测试应用程序 writefile(...)函数没有执行完就失败了,然后程序死掉了。

串口测试的writefile(...)函数没有执行完就失败了,没有任何返回结果。writefile的下一个语句做断点,没有执行到。 if(hComm!=INVALID_HANDLE_VALUE&&dwCharToWrite!=0)         {           &nbs ...…

查看全部问答>

终于研发成功

终于研发成功,cpu是s3c2410,64M   SDRAM,网口为cs8900 flash(k9f1208 64m)   实现了只用nand flash 就可以启动引导vxworks. 公司送bsp及全套开发文档 ,另可配公司的开发板 有意着QQ联系641328010 请注明 arm…

查看全部问答>

STC12LE5206AD 程序将引脚置为0 却检测到为高

有谁能够帮忙解决下啊? 本人qq:853887107…

查看全部问答>

RT_THREAD中的异常与中断

  异常是导致处理器脱离正常运行转向执行特殊代码的任何事件,如果系统不及时处理,系统轻则出错,重着导致系统毁灭性的瘫痪。所以正确地处理异常避免错误的发生是提高软件的鲁棒性重要的一方面,对于嵌入式系统更加如此。 异常可以分成两类 ...…

查看全部问答>

DIY导航避障车规整贴

DIY导航避障车小组今日下午展开第一次例会,在本次例会中大家集中讨论了无线的选择,避障的选择等等部分,并对小车进行了前景规划,以谷歌的自动驾驶车为终极目标,大家积极发言例会持续了一个半小时,并表示未来会采用各种新技术。下次再来把细节 ...…

查看全部问答>

11.06【每周讨论】软文——春风化雨、润物无声

您知道“软文”的含义吗?什么,不知道。赶紧百度一下吧,别被OUT了 [ 本帖最后由 longxtianya 于 2011-11-6 20:19 编辑 ]…

查看全部问答>

分享一些收集的msp430方面的书籍

最近接触了一下msp430的单片机从网上搜集了一些书籍希望对大家有帮助。…

查看全部问答>

泰克2012年度春季创新论坛北京站见闻

    4月24日阴雨天气,阿牛哥上午9点去北京朝阳区五洲皇冠大酒店参加泰克2012年度春季创新论坛。热情的工程师们朋友已经在会场里聆听泰克的测试测量行业趋势观点,泰克领先测试测量方案,还有一些工程师朋友在展厅参观泰克最新 ...…

查看全部问答>

全球智能机Q2出货1.5亿部 中兴进前五

本帖最后由 jameswangsynnex 于 2015-3-3 20:01 编辑 …

查看全部问答>