51单片机在工程中自己做的MODBUS通信程序

2020-01-17 19:06发布

本帖最后由 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,这个是理论计算值,但是这个值作为你的定时器设定值是不行的,因为加上硬件以及软件的通信延时会比这个值大,所以你要在这个值得基础上微调,调到他的最小有效率值。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
40条回答
feiji323
1楼-- · 2020-01-21 06:29
很不错,试着改成主机
aaronhuang
2楼-- · 2020-01-21 07:35
先标记下,之后看看
MINI2440
3楼-- · 2020-01-21 13:06
谢谢楼主分享。。。。。。。。。
bihan163
4楼-- · 2020-01-21 15:53
过来学习下
chengz
5楼-- · 2020-01-21 18:44
 精彩回答 2  元偷偷看……
Taoj
6楼-- · 2020-01-21 20:21
xiexie         

一周热门 更多>