📄 commrs485.c
字号:
#include"include.h"
/*********************************************************************************************************
** 函数名称: void Initiate_RS232(void)
** 功能描述: 串口初始化函数
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Initiate_RS485(void)
{
ES = 0;
PCON |= 0x80; //SMOD=1
SCON = 0x50; //0101,0001 8位数据位,无奇偶校验
TMOD &= 0x0F;
TMOD |= 0x20; //设置T1为波特率发生器
TH1 = 0xFA; //11.0592MHz 晶振,波特率=9600
TL1 = 0xFA;
// AUXR |=0x10;
ES = 1; //允许串口中断
EA = 1; //开总中断
TR1 = 1; //开定时器1
}
/*********************************************************************************************************
** 函数名称: void Suart_Send_Byte(uint8 Send_Byte)
** 功能描述: 串口发送函数
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Suart_Send_Byte(uint8 Send_Byte)
{
ES = 0; //关串口中断
TI = 0; //清零串口发送完成中断请求标志
SBUF = Send_Byte;
//WDT_CONTR = 0x3c; /**********************喂狗**********************/
while(TI == 0); //等待发送完成
TI = 0; //清零串口发送完成中断请求标志
ES = 1; //允许串口中断
}
/*********************************************************************************************************
** 函数名称: void CommSendByteWithChk(uint8 Commdata)
** 功能描述:
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void CommSendByteWithChk(uint8 Commdata)
{
uint8 i,j;
i = Commdata >> 4;
j = Commdata & 0x0F;
if(i<10)
i += 0x30;
else
i += 0x37;
if(j<10)
j += 0x30;
else
j += 0x37;
ComCalculChkSum += i;
ComCalculChkSum += j;
Suart_Send_Byte(i);
Suart_Send_Byte(j);
}
/*********************************************************************************************************
** 函数名称: void CommSendByteWithoutChk(uint8 Commdata)
** 功能描述:
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月10日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void CommSendByteWithoutChk(uint8 Commdata)
{
uint8 i,j;
i = Commdata >> 4;
j = Commdata & 0x0F;
if(i<10)
i += 0x30;
else
i += 0x37;
Suart_Send_Byte(i);
if(j<10)
j += 0x30;
else
j += 0x37;
Suart_Send_Byte(j);
}
/*********************************************************************************************************
** 函数名称: void CommSendWordWithChk(uint16 Commword)
** 功能描述:
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月10日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void CommSendWordWithChk(uint16 Commword)
{
CommSendByteWithChk((uint8)(Commword>>8));
CommSendByteWithChk((uint8)(Commword));
}
/*********************************************************************************************************
** 函数名称: void Comm(void) interrupt 4
** 功能描述: 串口中断函数
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月10日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Comm(void) interrupt 4
{
uint8 ea_time;
ea_time = EA;
EA = 0;
if(RI == 1)
{
CommTemp0 = SBUF;
if(CommTemp0 == 0x7e)
{
CommState = 0;
CommAscii = 0;
CommBytehilow = 0;
ComCalculChkSum = 0;
}
if(CommState != 0 && CommState != 5 && CommState != 6)
{
ComCalculChkSum += CommTemp0;
}
if(CommState != 0 && CommState != 6)
{
if(CommAscii == 0)
{
CommAscii = 1;
CommTemp1 = CommTemp0;
if(CommTemp1 < 0x3a)
CommTemp1 -= 0x30;
else
CommTemp1 -= 0x37;
}
else
{
CommAscii = 0;
if(CommTemp0 < 0x3a)
CommTemp0 -= 0x30;
else
CommTemp0 -= 0x37;
CommTemp1 <<= 4;
CommTemp1 |= CommTemp0;
}
}
if(CommAscii == 0)
{
switch(CommState)
{
case 0: /*SOI*/
{
if(CommTemp0 == 0x7e)
{
CommState++;
}
}break;
case 1: /*ADD*/
{
if(CommTemp1 == (uint8)(ModeSysConfig[8])) //BoardAddress
{
CommState++;
}
else
{
CommState = 0;
}
}break;
case 2: /*CID*/
{
CommCid = CommTemp1;
CommState++;
if(CommCid > 0x10) CommState = 0;
}break;
case 3: /*LENGTH*/
{
if(CommBytehilow == 0 )
{
CommLengthH = CommTemp1;
CommBytehilow = 1;
}
else
{
CommState++;
CommLengthL = CommTemp1;
CommBytehilow = 0;
if(CommLengthL > 100)CommState = 0;
CommRxPointer = 0; //RxBufPointer
if(CommLengthL == 0)CommState++;
}
}break;
case 4: /*INFO*/
{
if(CommLengthL != 0)
{
CommRxBuf[CommRxPointer] = CommTemp1;
CommRxPointer++;
CommLengthL--;
CommLengthL--;
if(CommLengthL == 0)CommState++;
}
else
CommState++;
}break;
case 5: /*chksum*/
{
if(CommBytehilow == 0)
{
CommChksumH = CommTemp1;
CommBytehilow = 1;
}
else
{
CommBytehilow = 0;
CommChksumL = CommTemp1;
ReComCalculChkSum = CommChksumH;
ReComCalculChkSum = ReComCalculChkSum << 8;
ReComCalculChkSum |= CommChksumL;
ComCalculChkSum= (~ComCalculChkSum)+1;
//COMEN = CommTxden;
//Suart_Send_Byte(ComCalculChkSum >> 8);
//Suart_Send_Byte(ComCalculChkSum);
//COMEN = CommRxden;
if(ReComCalculChkSum == ComCalculChkSum)CommState++;
else
{
goto comrxend;
}
}
}break;
case 6: /*EOI */
{
if(CommTemp0 == 0x0D)
{
Massageflag = 1;
}
CommState = 0;
}break;
}
comrxend:
;
}
}
RI = 0;
EA = ea_time;
}
/********************************************************************************************************
** 函数名称: void CommRight(void)
** 功能描述:
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void CommRight(void)
{
Suart_Send_Byte(0x7E); //报文头
ComCalculChkSum = 0;
CommSendByteWithChk((uint8)(ModeSysConfig[8])); //BoardAddress地址范围0~16
CommSendByteWithChk(CommCid); //CID 07
CommSendWordWithChk(0xA006); //LENTH
CommSendByteWithChk(0x01); //
CommSendWordWithChk(0x0001); //写系数正确
ComCalculChkSum = (~ComCalculChkSum)+1;
CommSendByteWithoutChk((uint8)(ComCalculChkSum>>8));
CommSendByteWithoutChk((uint8)(ComCalculChkSum));
Suart_Send_Byte(0x0D);
}
/********************************************************************************************************
** 函数名称: void CommWrong(void)
** 功能描述:
** 输 入: 无
** 输 出: 无
** 全局变量:
** 调用模块:
**
** 作 者: 李伟
** 日 期: 2008年12月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日 期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void CommWrong(void)
{
Suart_Send_Byte(0x7E); //报文头
ComCalculChkSum = 0;
CommSendByteWithChk((uint8)(ModeSysConfig[8])); //BoardAddress地址范围0~16
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -