4854|10

73

帖子

0

TA的资源

一粒金砂(初级)

楼主
 
最近下了点程序学习如下,有些看不明白,咨询一下  
程序  
#include  "main.h"  
/******************************  
微控电子  www.mcuc.cn  
modbus  RTU  的C51程序   
单片机89S52  
通信波特率  9600  8位数据  1位停止位  偶校验  485通位接口  
单片机控制板地址  localAddr(变量)  
通信可设置数据的地址:  
字地址  0  -  255  (只取16位的低8位)  
位地址  0  -  255  (只取16位的低8位)  
*******************************/  
uint32  dwTickCount,dwIntTick;  //时钟  
uint8  idata  sendBuf[16],receBuf[16];  //发送接收缓冲区  
uint8  idata  checkoutError;  //  ==2  偶校验错      
uint8  idata  receTimeOut;    //接收超时  
uint8  idata  c10ms;      //10ms  计时  
bit    b1ms,bt1ms,b10ms,bt10ms,b100ms,bt100ms;  //定时标志位  
//  串行中断程序  
void  commIntProc()  interrupt  4  
{  
if(TI)  
{  
   TI  =  0;   
   if(sendPosi  <  sendCount)  //发送位置<发送字节个数  
   {  
     sendPosi++;  
     ACC  =  sendBuf[sendPosi];  
     TB8  =  P;  //加上校验位  
     SBUF  =  sendBuf[sendPosi];  
   
         while(TI==0);      
   TI=0;  
   }  
   else  
   {  
     b485Send  =  0;        //发送完后将485置于接收状态  b485Send=P1^3;  //75LBC184  发送接收控制  
     receCount  =  0;      //接收到的字节个数  清接收地址偏移寄存器  
     checkoutError  =  0;//==2  偶校验错      
   }  
}  
else  if(RI)  
{  
   RI  =  0;  
   receTimeOut  =  10;        //通讯超时值  
   receBuf[receCount]  =  SBUF;//接收到的字节个数  
   ACC  =  receBuf[receCount];  
   if(P  !=  RB8)  
   checkoutError  =  2;  //偶校验出错  
   receCount++;                    //接收地址偏移寄存器加1  
   receCount  &=  0x0f;        //最多一次只能接收16个字节  
}  
}      //  void  CommIntProc()  
//定时器0  1ms  中断  
void  timer0IntProc()  interrupt  1  
{  
TL0  =  TIMER_LOW;   
TH0  =  TIMER_HIGHT;  
dwIntTick++;  
bt1ms  =  1;  
c10ms++;  
       if(c10ms  >=  10)   
       {  
               c10ms  =  0;            //10ms计时器清零  
               bt10ms  =  1;  
       }  
}      //  void  Timer0IntProc()  


//定时处理  
void  timeProc(void)  
{  
static  uint8  c200ms;  
     bWatchDog  =  ~  bWatchDog;        //看门狗取反  
b1ms  =  0;  
b10ms  =  0;  
b100ms  =  0;  
   
ET0  =  0;//定时器0禁止  
dwTickCount  =  dwIntTick;  
ET0  =  1;//定时器1禁止  
if(bt1ms)  
{  
   bt1ms  =  0;  
   b1ms  =  1;  
               if(receTimeOut>0)  
               {  
                       receTimeOut--;  
                       if(receTimeOut==0  &&  receCount>0)      //判断通讯接收是否超时//接收到的字节个数  
                       {  
                               b485Send  =  0;              //将485置为接收状态  
                               receCount  =  0;            //将接收地址偏移寄存器清零  
       checkoutError  =  0;  
                       }  
               }  
}  
if(bt100ms)  
{  
   bt100ms  =  0;    b100ms  =  1;  
}  
if(bt10ms)            //判断中断10ms标志位是否1  
       {  
               bt10ms  =  0;          //清中断10ms标志位  
           b10ms  =  1;  
               c200ms++;                                      //200ms计时器加1  
               if(c200ms  >=  20)                        //判断是否计时到200ms  
               {  
                       c200ms  =  0;                          //清200ms计时器  
                       bRunLED  =  ~bRunLED;          //取反运行指示灯                     
               }  
       }  
}      //  void  TimerProc(void)  
//初始化串口  
void  initUart(void)  
{  
}//void  initUart(void)  
//初始化中断  
void  initInt(void)  
{          initUart();  
         EA  =  1;  //总中断允许   
}      //  void  initInt(void)  
//初始化  
void  initProg(void)  
{   
initInt();  
b485Send  =  0;//75LBC184  发送接收控制  
}  
void  main(void)  
{  
initProg();  
while(1)  
{  
   timeProc();//定时处理   
               checkComm0Modbus();//检查uart0数据  
     }  
}  
就是如何定rtu桢之间>3.5个字符      这里的超时判断看不大明白  
谁指点下      qq83310093

最新回复

main() { while(1) { watchdog(); modbus();   } } /////////////////////////////////////// void  modbus (void) {      uint8  crc;      if(receCount>7)       {     if(receBuf[0]== P0&0x3f&&receBuf[1]==0x03)         {          crc=crc16(receBuf,6);            if(crc == receBuf[7]+(receBuf[6]  详情 回复 发表于 2007-4-4 17:33
点赞 关注

回复
举报

62

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
定rtu桢之间>3.5个字符

发四个就完了,对于你说的超时判断,上面的代码我是看懂了,但是,没看到用的,所以
偶也没法猜,所以...
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
。。没话说
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

4
 
我有关于这方面的资料。qq:328997835
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

5
 
看懂了  加我qq啊   给我讲讲

有资料给我一份啊

好把分数发出去

83310093
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

6
 
定时来判断是否超时
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

7
 
2个问题不明白
1具体是个怎么样的顺序呢

是一帧的内部各数组中断一次调用定时判断一次    还是帧帧间调用定时判断

2比如   发过来   abcabcabc    假如abc为一帧  a b c为这帧的数组
具体弄不明白的程序是如何区分a b和 abc  abc的呢
就是帧内部是bc   帧帧间是ca
这都差不多
程序咋区分的呢

我写的程序少
还请详细指点一下
谢谢
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

8
 
1具体是个怎么样的顺序呢

是一帧的内部各数组中断一次调用定时判断一次    还是帧帧间调用定时判断

从接收到第一个被认为有效的信号开始调用定时,如果无效或是超时或是正确接收,都重新清掉"定时器"
 
 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

9
 
2比如   发过来   abcabcabc    假如abc为一帧  a b c为这帧的数组
具体弄不明白的程序是如何区分a b和 abc  abc的呢
就是帧内部是bc   帧帧间是ca
这都差不多
程序咋区分的呢


这个就得按要求实现相应的状态机来确定:
RTU模式下,开始+数据量+数据+校验+结束
如果能走完这个状态,表示成功接收,如果有异常,则错误
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

10
 
有时间加我腾讯号吧

举个例子好理解点  

还是有点不怎么理解

谢谢您的热心
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

11
 
main()
{
while(1)
{
watchdog();
modbus();
  }
}
///////////////////////////////////////
void  modbus (void)
{
     uint8  crc;
     if(receCount>7)
      {
    if(receBuf[0]== P0&0x3f&&receBuf[1]==0x03)
        {
         crc=crc16(receBuf,6);
           if(crc == receBuf[7]+(receBuf[6]<<8))
           {
/*1111111111111111111111111111111111*/
}
}
}
}
你说的状态机是指void  modbus (void)函数吗????????


 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

开源项目 更多>>
    随便看看
    查找数据手册?

    EEWorld Datasheet 技术支持

    相关文章 更多>>
    关闭
    站长推荐上一条 1/10 下一条

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表