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

📄 testuart.c

📁 基于电总协议的串口测试程序,MCU为AVR单片机,GCC编译
💻 C
📖 第 1 页 / 共 2 页
字号:
	unsigned int i, result = 0;
	
	for (i = 0; i < length; i++)
	/*Loop through all the bytes to be checked*/
	/*Result is limited to unsigned integer.So there is no need to modulus 65536*/  
	{
		result += *startaddress++;
	}
	/*get inverse code and plus one*/ 
	result = (~result + 1);
	return result;
}
unsigned char CheckASCII(unsigned char *startaddress, unsigned char length)
{
	unsigned int i;
	
	
	for (i = 0; i < length; i++)
	/*Loop through all the bytes to be checked*/
	{
		if ((*startaddress < 0x30) || (*startaddress > 0x46) || ((*startaddress > 0x39) && (*startaddress < 0x41)))
		{
		    return 0;
		}
		else
		{
		    startaddress++;
		}
	}
	
	return 1;
}
void DealReceiveData( void)
{
  
	if (CheckASCII(&receiveBuffer[1], receivePointer - 2) == 0)	
	{
		receivePointer = 0;   //接收指针复位
		RtnValue = 0x80;      //ASC码错
		return;
	}
	if (ASCIIToByte(receiveBuffer[5], receiveBuffer[6]) != DEVICEID) //机型匹配错误,不是空调时,不返回
	{   
		receivePointer = 0;   //接收指针复位
		
		return;
	}
	else    //机型匹配正确
	{  
		Version = ASCIIToByte(receiveBuffer[1], receiveBuffer[2]);
			
		Address = ASCIIToByte(receiveBuffer[3], receiveBuffer[4]);  //获取地址
			
		CommandID = ASCIIToByte(receiveBuffer[7], receiveBuffer[8]);  //获取命令码
        			
		if (CommandID != GETADDRESS)
		{   //非"获取设备地址"命令时
			
		    if (Address != unitNoSet)   //地址不匹配,也不返回
			{   											
					return;
		    }
		    if ((CommandID != GETVERSION) && (CommandID != GETADDRESS))
			{   //非"获取通信协议版本"和"获取设备地址"命令时
			
			    if (Version != PROTOCOLVERSION)  //协议不匹配
				{   
					RtnValue = 0x01;  //协议不匹配,返回01
					//VersionIsWrong();    //协议不匹配处理
			        return;
				}
			}
				    
			//校验和
			if (Checksum(&receiveBuffer[1], receivePointer - 6)
			    != (ASCIIToByte(receiveBuffer[receivePointer - 5], receiveBuffer[receivePointer - 4]) << 8) + ASCIIToByte(receiveBuffer[receivePointer - 3], receiveBuffer[receivePointer - 2]))
			{		    
			    RtnValue = 0x02;      //检验和不匹配
			    //ChecksumIsWrong();    //检验和不匹配处理
				return;
			}
			
			
			//数据长度校验和
			if (LengthChecksum(receivePointer - 18) != (ASCIIToByte(receiveBuffer[9], receiveBuffer[10]) << 8) + ASCIIToByte(receiveBuffer[11], receiveBuffer[12]))
			{
			    
			    RtnValue = 0x03;    //数据长度校验和不匹配
			    //LengthChecksumIsWrong();
				return;		
			}
	    }
		
	}

}
void MakeResponseHead(void)
{
	unsigned int lengthChecksum;
	
	/*Start of information*/
	transmitBuffer[0] = SOI;
	
	/*Version*/
	transmitBuffer[1] = (ByteToASCII(PROTOCOLVERSION) >> 8);
	transmitBuffer[2] = (ByteToASCII(PROTOCOLVERSION) & 0xff);
	
	/*Address*/
	transmitBuffer[3] = (ByteToASCII((unsigned char)unitNoSet) >> 8);
	
	transmitBuffer[4] = (ByteToASCII((unsigned char)unitNoSet) & 0xff);
	
	/*Device ID code*/
	transmitBuffer[5] = (ByteToASCII(DEVICEID) >> 8);
	transmitBuffer[6] = (ByteToASCII(DEVICEID) & 0xff);
	
	/*Length checksum*/
	lengthChecksum = LengthChecksum(0);
	transmitBuffer[9] = (ByteToASCII(lengthChecksum >> 8) >> 8);
	transmitBuffer[10] = (ByteToASCII(lengthChecksum >> 8) & 0xff);
	transmitBuffer[11] = (ByteToASCII(lengthChecksum & 0xff) >> 8);
	transmitBuffer[12] = (ByteToASCII(lengthChecksum & 0xff) & 0xff);
}

void GetAnalogDataFixed()
{
    unsigned int lengthChecksum, checksum;
    
    /*fill head information*/
    MakeResponseHead();
    
    /*normal response return code*/
	transmitBuffer[7] = 0x30;
	transmitBuffer[8] = 0x30;
    
    /*Length checksum*/
    lengthChecksum = LengthChecksum(8);
    transmitBuffer[9] = (ByteToASCII(lengthChecksum >> 8) >> 8);
    transmitBuffer[10] = (ByteToASCII(lengthChecksum >> 8) & 0xff);
    transmitBuffer[11] = (ByteToASCII(lengthChecksum & 0xff) >> 8);
    transmitBuffer[12] = (ByteToASCII(lengthChecksum & 0xff) & 0xff);
    
    /*fill analog data*/
    transmitBuffer[13] = (ByteToASCII(tempInputSta >> 8) >> 8);
    transmitBuffer[14] = (ByteToASCII(tempInputSta >> 8) & 0xff);
    transmitBuffer[15] = (ByteToASCII(tempInputSta & 0xff) >> 8);
    transmitBuffer[16] = (ByteToASCII(tempInputSta & 0xff) & 0xff);
    transmitBuffer[17] = (ByteToASCII(humInputSta >> 8) >> 8);
    transmitBuffer[18] = (ByteToASCII(humInputSta >> 8) & 0xff);
    transmitBuffer[19] = (ByteToASCII(humInputSta & 0xff) >> 8);
    transmitBuffer[20] = (ByteToASCII(humInputSta & 0xff) & 0xff);
    
    /*Make checksum*/
	checksum = Checksum(&transmitBuffer[1], 20);
	transmitBuffer[21] = (ByteToASCII(checksum >> 8) >> 8);
	transmitBuffer[22] = (ByteToASCII(checksum >> 8) & 0xff);
	transmitBuffer[23] = (ByteToASCII(checksum & 0xff) >> 8);
	transmitBuffer[24] = (ByteToASCII(checksum & 0xff) & 0xff);
	
	/*End of information*/
	transmitBuffer[25] = EOI;
	
	/*reset transmit buffer pointer*/
	transmitPointer = 0;
	
	/*Set transmission buffer ready flag*/
	WriteSendData(transmitBuffer[0]);
}
void TransData( void )
{
	switch( RtnValue )
	{
		case 0x00:
		switch( CommandID )
		{
			//获取设备时间
			/*	case GETTTIME:
				    GetTime();
					break;
							
		        //设置设备时间
				case SETTIME:
				    SetTime();
				    break;

				//获取通信协议版本
				case GETVERSION:
				    GetVersion();
				    break;

				//获取设备地址
				case GETADDRESS:
				    GetAddress();
				    break;

      		    //获取厂家信息
				case GETMODULEID:
				    GetModuleID();
					break;  */

			    //获取模拟量数据(定点数)
			    case GETANALOGDATAFIXED:
			        GetAnalogDataFixed();
			        break;
			        
				//获取开关量状态
			/*	case GETSWITCHINPUT:
				    GetSwitchInput();
					break;
				
			    //遥控开关机
				case REMOTECONTROL:
				    RemoteControl();
				    break;

			   //获取系统参数
				case GETINTEGERPARA:
				    GetIntegerPara();
				    break;
										
		        //设置系统参数
		        case SETINTEGERPARA:
    			    SetIntegerPara();
					break;
				
			    //获取报警状态
			    case GETALARMSTATUS:
			        GetAlarmStatus();
			        break;
				
				//获取报警历史
			    case GETALARMHISTORY:
			        GetAlarmHistory();
			        break;
			    
			    //获取机组状态
			    case GETUNITSTATUS:
			        GetUnitStatus();
			        break;
        
                //工装测试
                case FACTORYMANUTEST:
                    FactoryManuProcess();
			        break;
			         
				//无效命令
				default:
				    CommandInvalid();
				    break;  */
		}
		break;
	}
	EnableSendInterrupt();
}
int main(void)
{
    
	InitT1();
 	uart1_init();
 	unitNoSet=0x01;
	sei();
    //LengthCheck = LengthChecksum(0);
    TranstmpData();
    SumCheck = Checksum(&transmitBuffer[1],12);
	DisableSendInterrupt();
    
while(1)
    {
        /*if(time_1sFlag == 1)
	    {
	    	time_1sFlag = 0;
	    	WriteSendData(transmitBuffer[0]);
			tmp1++;
			EnableSendInterrupt();
	    	
	    }    */
		if(RxdEndFlag==1)
		{
		    RxdEndFlag=0;
            DealReceiveData();
            _delay_ms(3);
			//TransData();
			tmp1++;
		}
				      	     		   	 
    }
}	
		                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               

⌨️ 快捷键说明

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