本帖最后由 wangyy@dianzi 于 2013-7-26 17:04 编辑
看到论坛有许多关于modbus的通信的程序,但是好多程序没有对3.5个字符贞的检测,这样做是不标准的。只有做好这个检测,才能一每贞的数据包形式接受,这样处理程序才会高校,而且减少误包率。仅此参考,欢迎交流!
状态机在通信中有很重要的作用,所谓状态机就是SWITCH case 语句的熟练应用
先说文件结构:board.h 是同文件,所有的宏定义和一些配置在里面。 modbus16.h 是modbus通信的命令解析和命令动作文件,是通信的核心 rs232.c 是串口驱动程序
board.h
#include "STC12C5A60S2.h" //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include <intrins.h>
/******************************/
#ifndef _board__h_
#define _board__h_
/********************************************/
#define UART0FRAMETESTMS 8 //侦测试时间
/********************************************/
/******声明被外部调用的变量*****************/
extern unsigned char SLAVEADDRESS; //从机地址
extern unsigned char xdata Modbus16_DataBuff[8];
extern unsigned char xdata uchTX_Buffer[];//串口发送数据缓冲区
extern unsigned char xdata uchTX_Buffer1[];//串口发送数据缓冲区
extern unsigned char xdata uchRX_Buffer[17];////串口接收数据缓冲区
extern unsigned char RXData_Counter1;//数据接收计数器
extern bit FlagRdyOK;//是否可以接收数据包标志位:0:可以接收 1:不可接收
/******声明被外部调用的函数*****************/
/*modbus16.c*/
extern void askComm0Modbus(void);//检查uart0数据
/*rs232.c*/
extern void TX_NByte(unsigned char *dat,unsigned char TXLen);//发送N字节数据
//extern void Delayms(unsigned int T);
extern void UART_INIT(void);//串口初始化
extern unsigned char Check_MasterCMD1(void);//MasterCMD1判断
#endif
#define UART0FRAMETESTMS 8 //侦测试时间 这个很重要,就是那个侦间隔的测试时间,毫秒级的。他必须根据你的硬件配置和实际测试进行调整,调到最小有效值。
按9600的波特率计算,3.5个字符的间隔是2.916ms,这个是理论计算值,但是这个值作为你的定时器设定值是不行的,因为加上硬件以及软件的通信延时会比这个值大,所以你要在这个值得基础上微调,调到他的最小有效率值。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
数据位不用关心,直接读取判断字符就行了
一周热门 更多>