标题:
单片机MODBUS通讯程序
[打印本页]
作者:
liuhanbao
时间:
2018-10-17 12:01
标题:
单片机MODBUS通讯程序
单片机MODBUS通讯程序
单片机源程序如下:
/*********************************************************************************/
//File name: modbusMain.c
//Function : modbus rtu 通信测试程序
//Programed by liangwenjun 2012.8.18
/*********************************************************************************/
#include <INTRINS.H>
#include <STCHeader.h>
#include <reg52.h>
/*********************************************************************************/
//宏定义
/*********************************************************************************/
#define MIN_TIME_INT 2 //最小超时间隔
#define MAX_TIME_INT 4 //最大超时间隔
#define MAX_REC_COUNT 60 //最大接收数量
UCHAR g_RecCounter = 0; //串口接收计数器,每接收一个字符加1
UCHAR g_RecDisable = 0; //串口接收禁止和使能标志
char g_TimeInterval=0; //串口接收时间间隔计数器
extern char idata ReceiveData[]; //串口接收缓冲区
extern void InitTimer0(void); //定时器0初始化,用作串口接收计时
extern void ModbusFunProcess(void); //modbus各功能处理
extern VOID SendStringToCom(UCHAR *pStrToSend,UINT sendLength); //串口发送一串字符串
extern VOID InitSerial(VOID);
//extern char idata AO[8]; //串口初始化
extern unsigned int Cal_CRC16(unsigned char *puchMsg, unsigned char usDataLen);
/*********************************************************************************/
//Function name: main
//Function: 处理主循环事务
//Function argument: none
/*********************************************************************************/
main()
{
InitSerial(); //串口初始化,波特率9600
InitTimer0(); //定时器0初始化
GlobalIntEnable(); //EA=1,使能全局中断
SerialIntEnable(); //ES=1,使能串口中断
g_RecDisable = 0;
while(1)
{
if (g_RecDisable)
{
//串口通信外需要处理的事务
ModbusFunProcess();
g_RecDisable=0;
g_RecCounter=0;
}
}
}
/*********************************************************************************/
//Function name: 串口接收中断
//Function argument: none
/*********************************************************************************/
VOID RecIntProcess() interrupt 4 using 3
{
GlobalIntDisable(); //禁止全局中断
if(RI)
{
if((g_TimeInterval>MIN_TIME_INT)&&(g_TimeInterval<=MAX_TIME_INT))
{
g_RecCounter=0; //接收字符串出现不连续的情况,则置串口接收计数器为0
}
if(g_RecCounter>MAX_REC_COUNT)
{
g_RecCounter=0; //串口单次接收的数据量大于最大值,则置计数器为0
}
ReceiveData[g_RecCounter++]=SBUF; //将串口接收到的数据保存至缓冲区
g_TimeInterval=0; //若串口接收到数据,就将时间间隔计数器清0
RI=0; //清串口接收中断标志
}
GlobalIntEnable(); //使能全局中断
ET0=1; //开启定时器0中断
}
/*--------------------------------------------------------------------------*/
VOID Timer0IntProcess() interrupt 1 using 2
{
ET0=0;
TL0 = 0x18 ; //0xFC40=65536-((11059200/12)/9600)*10
TH0 = 0xFC;
//禁止定时器0中断
g_TimeInterval++;
if((g_TimeInterval>MAX_TIME_INT) && (g_RecCounter>0)) //若串口接收间隔大于指定值,则认为
{ //一次modbus通信命令接收完成
g_RecDisable=1;
//ReceiveData
// ReceiveData[g_RecCounter-2]=Cal_CRC16(ReceiveData,g_RecCounter-2)>>8;
// ReceiveData[g_RecCounter-1]=Cal_CRC16(ReceiveData,g_RecCounter-2);
// SendStringToCom(ReceiveData,g_RecCounter);
// ModbusFunProcess(); //modbus通信处理
// g_RecDisable=0;
// g_RecCounter=0;
}
else
{
ET0=1; //使能定时器0中断
}
}
/*-------------------------------------------------------------------*/
复制代码
所有资料51hei提供下载:
单片机MODBUS通讯程序.rar
(69.73 KB, 下载次数: 149)
2018-10-17 12:01 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1