⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 commrs485.c

📁 STC12C5410AD模拟串口再现多串口通讯
💻 C
📖 第 1 页 / 共 2 页
字号:
 #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 + -