📄 testuart.c
字号:
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 + -