搜索
bottom↓
回复: 9

共享一段MODBUS_RTU模式串口接收数报的代码

[复制链接]

出0入0汤圆

发表于 2008-8-18 23:19:50 | 显示全部楼层 |阅读模式
总线静止时间:MODBUS_RTU协议规定发送数据前要求数据总线静止时间即无数据发送时间大于5ms (波特率为9600时)。大约是发送4个字节的时间。
本代码使用一个定时器设定定时时间是5.1ms,当收到第一个数据后清零计时器,之后没收到一个字节就清零一次定时器。如果定时器溢出就认定收到一个完整的数据报。

//************************************************
//     定时器 t2   5.1ms   
//     定时器溢出则标志收到一个完整数据帧
//全局变量   usart1_rx_t_f   串口接收状态标志
//           usart1_f 数据区有效标志
//************************************************
#pragma interrupt_handler timer2_ovf_isr:11
void timer2_ovf_isr(void)
{
  TCNT2 = 0x6b; //重装计数器   
  if(usart1_rx_t_f==0)//不是接收状态 返回   
       return;       
       
   usart1_f=1;     //标志缓冲区数据有效  防止数据错误
   usart1_rx_t_f=0;//清零接收标志  防止再次中断进入t2中断
   SEI();   
   modbus_cl(usart1_rx_sp); //调用处理函数   
   usart1_f=0;//释放缓冲区
}
//******************************************************************
//**********************************************
//      串口1接收
//全局变量 : usart1_rx_buffer  串口接收缓冲区 150字节
//           usart1_rx_sp      接收缓冲区指针
//           usart1_f          是1 接收缓冲区数据未处理
//           usart1_rx_t_f     是 1标志开始接收数据
//           
//**********************************************
#pragma interrupt_handler uart1_rx_isr:31
void uart1_rx_isr(void)
{
unsigned char temp,temp_rx;

     temp=UCSR1A; //读取状态标志
     temp_rx=UDR1;//读取数据
     SEI();       //开中断
         TCNT2 = 0x6b;//重新计时       
   if(temp&((1<<FE1)|(1<<UPE1))) //检验失败 帧错误
        {
             usart1_rx_t_f=0;//字节出错 结束接收状态
             return;
                }
   if(usart1_f==1)//缓冲区数据未处理
       {                 
         return;
           }
   if(usart1_rx_t_f==0)//数据帧开始接收
      {
        usart1_rx_sp=0; //指针清零
                usart1_rx_t_f=1;//标志进入接收状态
        usart1_rx_buffer[0]=temp_rx;//保存第一个数                       
      }
   else
      {
        usart1_rx_buffer[usart1_rx_sp]=temp_rx;        //保存数据
         
       }  
     usart1_rx_sp++; //缓冲区指针自加
  if(usart1_rx_sp>149)//防止缓冲区溢出
     {  
          usart1_rx_sp=0;  //溢出清零指针
          usart1_rx_t_f=0; //结束接收状态          
         }
}
//*********************************

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2008-9-4 11:52:37 | 显示全部楼层
中断服务要尽可能的短,你将MODBUS分析程序放在中断服务程序中,可能不太合适吧!
  它又不是跟时间非常紧密的代码。

出0入0汤圆

发表于 2009-11-30 23:51:08 | 显示全部楼层
正是我要学习的东西,多谢楼主,辛苦了。

出0入0汤圆

发表于 2011-3-26 13:07:16 | 显示全部楼层
非常感谢!正在学习ModBUS

出0入0汤圆

发表于 2011-5-22 11:11:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-9-20 21:48:07 | 显示全部楼层

出0入0汤圆

发表于 2013-1-3 16:41:57 | 显示全部楼层
mark modbus

出0入0汤圆

发表于 2013-2-15 07:04:27 | 显示全部楼层
正在学习modbus

出0入0汤圆

发表于 2013-2-15 09:34:52 | 显示全部楼层
多谢楼主分享 。。。。

出0入0汤圆

发表于 2014-1-17 16:55:21 | 显示全部楼层
最近正在用这个,赞一个!
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表