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

📄 commrs232.c

📁 STC12C5410AD模拟串口再现多串口通讯
💻 C
📖 第 1 页 / 共 3 页
字号:
** 函数名称: void Rs232CommSendWordWithChk(uint16 Commword)
** 功能描述: 
** 输   入: 无
** 输   出: 无
** 全局变量: 
** 调用模块: 
**
** 作   者: 李伟
** 日   期: 2008年12月10日
**-------------------------------------------------------------------------------------------------------
** 修 改 人:
** 日   期:
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Rs232CommSendWordWithChk(uint16 Commword)
{
    Rs232CommSendByteWithChk((uint8)(Commword>>8));
    Rs232CommSendByteWithChk((uint8)(Commword));
}
/********************************************************************************************************
** 函数名称: void soft_rs232_interrupt( void )  
** 功能描述: 
** 输   入: 无
** 输   出: 无
** 全局变量: 
** 调用模块: 
**
** 作   者: 
** 日   期: 
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 李伟
** 日   期: 2008年12月09日
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void soft_rs232_interrupt( void )
{
    /************************ 接收 ****************************/
    if (rs_f_RI_enable == 1)
    {
        if (rs_shift_count == 0)        //移位计数器==0, 表示检测到起始位的起点   
        {
            if ( rs_RXD == 1 )
            {
                soft_receive_enable (); //起始位错, 从新开始   
            }
            else
            {
                //下次中断在数据位或停止位中的某时刻发生 
				rs_timerL += rs_FULL_BIT_L;// + 0x10;
                rs_timerH  = rs_FULL_BIT_H;
                rs_shift_count++;              
                rs_BUF = 0;             //清移位缓冲变量   
            }
        }
        else
        {
            rs_timerL += rs_FULL_BIT_L; //下次中断在数据位或停止位中发生    
            rs_timerH = rs_FULL_BIT_H;
                                       
            rs_shift_count++;           //2--9:数据位 10:停止位 
                                       
            if ( rs_shift_count == 9)
            {
                rs_BUF = rs_BUF >> 1;   //接收第8位   
                rs_BUF_bit7 = rs_RXD;

				Rs232CommTemp0 = rs_BUF;
				if(Rs232CommTemp0 == 0x7E)
		        {
		            Rs232CommState     = 0;
		            Rs232CommAscii     = 0;
		            Rs232CommBytehilow = 0;
		        }
			    if(Rs232CommState != 0 && Rs232CommState != 5 && Rs232CommState != 6)
		        {
		            Rs232ComCalculChkSum += Rs232CommTemp0;
		        }
		        if(Rs232CommState != 0 && Rs232CommState != 6)
		        {
		            if(Rs232CommAscii == 0)
		            {
		                Rs232CommAscii = 1;
		                Rs232CommTemp1 = Rs232CommTemp0;
		                if(Rs232CommTemp1 < 0x3a)
		                    Rs232CommTemp1 -= 0x30;
		                else
		                    Rs232CommTemp1 -= 0x37;
		            }
		            else
		            {
		                Rs232CommAscii = 0;
		                if(Rs232CommTemp0 < 0x3a)
		                    Rs232CommTemp0  -= 0x30;
		                else
		                    Rs232CommTemp0  -= 0x37;
			                Rs232CommTemp1 <<= 4;
			                Rs232CommTemp1 |= Rs232CommTemp0;
		            }
		        }
				if(Rs232CommAscii == 0)
		        {
		            switch(Rs232CommState)
		            {
		                case 0:                    /*SOI*/
		                {
		                    if(Rs232CommTemp0 == 0x7e)
		                    {
		                        Rs232CommState++;
		                        Rs232ComCalculChkSum = 0;
		                    }
		                }break;
		                case 1:                    /*ADD*/
		                {
		                    if(Rs232CommTemp1 == (uint8)(ModeSysConfig[8]))	//BoardAddress
		                    {
								Rs232CommState++; 
							}
							else 
							{
								Rs232CommState = 0;
							}
		                }break;
		                case 2:                    /*CID*/
		                { 
		                    Rs232CommCid = Rs232CommTemp1;
		                    Rs232CommState++;
		                    if(CommCid > 0x10) Rs232CommState = 0;
		
		                }break;
		                case 3:                    /*LENGTH*/
		                {
		                    if(Rs232CommBytehilow == 0 )
		                    {
		                        Rs232CommLengthH   = Rs232CommTemp1;
		                        Rs232CommBytehilow = 1;
		                    }
		                    else
		                    {
		                        Rs232CommState++;
		                        Rs232CommLengthL   = Rs232CommTemp1;
		                        Rs232CommBytehilow = 0;
		                        if(Rs232CommLengthL > 40) Rs232CommState = 0;
		                        ReceivePoint = 0;           //RxBufPointer
		                        if(Rs232CommLengthL == 0) Rs232CommState++;
		                    }
		                }break;
		                case 4:                     /*INFO*/
		                {
		                    if(Rs232CommLengthL != 0)
		                    {
		                        rs232buffer[ReceivePoint] = Rs232CommTemp1;
		                        ReceivePoint++;
		                        Rs232CommLengthL--;
		                        Rs232CommLengthL--;
		                        if(Rs232CommLengthL == 0) Rs232CommState++;
		                    }
		                    else
		                        Rs232CommState++;
		                }break;
		                case 5:                     /*chksum*/
		                {
		                    if(Rs232CommBytehilow == 0)
		                    {
		                        Rs232CommChksumH   = Rs232CommTemp1;
		                        Rs232CommBytehilow = 1;
		                    }
		                    else
		                    {
		                        Rs232CommBytehilow = 0;
		                        Rs232CommChksumL   = Rs232CommTemp1;
		                        //Rs232ReComCalculChkSum  = Rs232CommChksumH;
								//COMEN = CommTxden;
							    //Suart_Send_Byte(Rs232CommChksumH);
		                        //Rs232ReComCalculChkSum  = Rs232ReComCalculChkSum << 8;
		                        //Rs232ReComCalculChkSum |= Rs232CommChksumL;
		                        Rs232ComCalculChkSum = (~Rs232ComCalculChkSum)+1;
								//COMEN = CommTxden;
								//Suart_Send_Byte(Rs232CommChksumL);
								//COMEN = CommTxden;
							    //Suart_Send_Byte(Rs232ComCalculChkSum>>8);
								//Suart_Send_Byte(Rs232ComCalculChkSum);
		                        //if(Rs232ReComCalculChkSum == Rs232ComCalculChkSum)
								if(Rs232CommChksumH == (Rs232ComCalculChkSum >> 8)
								&&(Rs232CommChksumL == (uint8)(Rs232ComCalculChkSum)))
								{
								    Rs232CommState++;
									//RunLed = ~RunLed;
								}
		                        else
		                        {
//								    COMEN = CommTxden;
//							        Suart_Send_Byte(Rs232ReComCalculChkSum>>8);
//								    Suart_Send_Byte(Rs232ReComCalculChkSum);
//								    COMEN = CommTxden;
//							        Suart_Send_Byte(Rs232ComCalculChkSum>>8);
//								    Suart_Send_Byte(Rs232ComCalculChkSum);
		                            goto comrxend;		                        
								}
		                    }
		                }break;
		                case 6:                     /*EOI */
		                {
			                if(Rs232CommTemp0 == 0x0D)
				            {
			                    Rs232Massageflag = 1;
								//RunLed = ~RunLed;
				            }
				            Rs232CommState = 0;
			            }break;
		            }
		            comrxend:
		            ;
		        }
//                if( ReceivePoint < rs_RECEIVE_MAX)
//                {                       //保存收到的字节    
//                    rs232buffer[ReceivePoint++] = rs_BUF;
//                }
//                else
//                {
//                    rs_f_RI_enable = 0; //缓冲区满, 禁止接收   
//                }
            }
            else
            {
                if (rs_shift_count < 9 ) //收到的是数据位 1 -- 7  
                {
                    rs_BUF = rs_BUF >> 1;
                    rs_BUF_bit7 = rs_RXD;
                }
                else
                {   //收到停止位,继续检测 PC 机发出的下一个起始位    
                    soft_receive_init(); 
                }
            }
        }
        TCON_TFx = 0;                  //清定时器中断标志   
    }
    else
    {
        /************************ 发送 ****************************/  
        if (rs_f_TI_enable == 1)
        {
            rs_timerL += rs_FULL_BIT_L;//下次中断在数据位的末尾时刻   
            rs_timerH  = rs_FULL_BIT_H;

            rs_shift_count--;          //0:停止位末尾时刻到  
                                       //1:发送停止位  
                                       //2--9:发送数据位  
            if (rs_shift_count > 9)    //错误状态  
            {
                rs_shift_count = 9;
                rs_BUF = 0xFF;
            }

            if (rs_shift_count > 1)    //2--9:发送数据位  
            {
                ACC = rs_BUF;
                ACC = ACC >> 1;
                rs_TXD = CY;
                rs_BUF = ACC;
            }
            else
            {
                if (rs_shift_count == 0) //0:停止位末尾时刻到  
                {
                    rs_TXD = 1;
                    rs_f_TI = 1;       //已发送完毕一个字节  
                }
                else
                {
                    rs_TXD = 1;        //1:发送停止位  
                }
            }
        }
    }
}
/********************************************************************************************************
** 函数名称: void rs232_commright(void)  
** 功能描述: 
** 输   入: 无
** 输   出: 无
** 全局变量: 
** 调用模块: 
**
** 作   者: 李伟
** 日   期: 2008年12月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void rs232_commright(void)
{
	rs_send_byte(0x7E);        //报文头
    Rs232ComCalculChkSum = 0;
	Rs232CommSendByteWithChk((uint8)(ModeSysConfig[8])); //BoardAddress地址范围0~16
    Rs232CommSendByteWithChk(Rs232CommCid); //CID 07
    Rs232CommSendWordWithChk(0xA006); 		//LENTH
    Rs232CommSendByteWithChk(0x01);   		//
    Rs232CommSendWordWithChk(0x0001);		//写系数正确
    Rs232ComCalculChkSum = (~Rs232ComCalculChkSum)+1;
    Rs232CommSendByteWithoutChk((uint8)(Rs232ComCalculChkSum>>8));
    Rs232CommSendByteWithoutChk((uint8)(Rs232ComCalculChkSum));
	rs_send_byte(0x0D);
	while (rs_f_TI == 0);                   //等待最后一个字节发送完毕
}
/********************************************************************************************************
** 函数名称: void rs232_commwrong(void)  
** 功能描述: 
** 输   入: 无
** 输   出: 无
** 全局变量: 
** 调用模块: 
**
** 作   者: 李伟
** 日   期: 2008年12月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void rs232_commwrong(void)
{
	rs_send_byte(0x7E);        //报文头
    Rs232ComCalculChkSum = 0;
	Rs232CommSendByteWithChk((uint8)(ModeSysConfig[8])); //BoardAddress地址范围0~16
    Rs232CommSendByteWithChk(Rs232CommCid); //CID 07
    Rs232CommSendWordWithChk(0xA006); 		//LENTH
    Rs232CommSendByteWithChk(0x01);   		//
    Rs232CommSendWordWithChk(0x0000);		//写系数错误
    Rs232ComCalculChkSum = (~Rs232ComCalculChkSum)+1;
    Rs232CommSendByteWithoutChk((uint8)(Rs232ComCalculChkSum>>8));
    Rs232CommSendByteWithoutChk((uint8)(Rs232ComCalculChkSum));
	rs_send_byte(0x0D);
	while (rs_f_TI == 0);
}
/********************************************************************************************************
** 函数名称: void Comm_rs232_handshake(void)  
** 功能描述: 
** 输   入: 无
** 输   出: 无
** 全局变量: 
** 调用模块: 
**
** 作   者: 李伟
** 日   期: 2008年12月20日
**-------------------------------------------------------------------------------------------------------
** 修 改 人: 
** 日   期: 
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void Comm_rs232_handshake(void)
{
	rs_send_byte(0x7E);        //报文头
    Rs232ComCalculChkSum = 0;
	Rs232CommSendByteWithChk((uint8)(ModeSysConfig[8])); //BoardAddress地址范围0~16
    Rs232CommSendByteWithChk(Rs232CommCid); //CID 01
    Rs232CommSendWordWithChk(0xA006); 		//LENTH

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -