📄 receivetest.c~
字号:
if(Tx_Count<Send_Size) // 还没有发送到待发送数据包的最后一个字节
{
if(Send_Status==0x00) // 发送状态0x00表示正常发送状态
{
if(*P_RS485_Send_Buff==Data_Head) // 当待发送的数据为Data_Head时,
{ // 将状态转为0x01转换数据状态;
Send_Status=0x01; // 并发送0x7D
UDR=0x7D;
}
else if(*P_RS485_Send_Buff==Data_Change) // 当待发送的数据为Data_Head时,
{
Send_Status=0x02; // 将状态转为0x02转换数据状态;
UDR=0x7D; // 并发送0x7D
}
else
{
UDR=*P_RS485_Send_Buff; // 没有转移,将待发送数据输出到数据寄存器
P_RS485_Send_Buff++; // 发送数据指针加1
Tx_Count++; // 发送计数器计数1次
}
}
else if(Send_Status==0x01) // 发送状态为0x01时,
{
UDR=0x5E; // 将0x5E输出到数据寄存器
Send_Status=0x00; // 发送状态转为正常发送状态0x00,待发送下一字节数据
P_RS485_Send_Buff++; // 发送数据指针加1
Tx_Count++; // 发送计数器计数一次
}
else if(Send_Status==0x02) // 发送状态为0x02时,
{
UDR=0x5D; // 将0x5E输出到数据寄存器
Send_Status=0x00; // 发送状态转为正常发送状态0x00,待发送下一字节数据
P_RS485_Send_Buff++; // 发送数据指针加1
Tx_Count++; // 发送计数器计数一次
}
}
else // 发送完待发送数据最后一个字节
{
UDR=0x7E; // 发送0x7E作帧结束标志
Tx_Send_End=1; // 置位发送结束标志
}
}
else // 发送完一帧数据
{
DRE = 0; // 发送完数据包之后,将485转换到接收状态
Tx_Send_End=0; // 清发送结束标志
Tx_Count=0; // 发送完之后,中断发送计数器Tx_Count清0
Start_Delay=1; // 发送完一帧数据之后启动延时检测回复包程序
}
}
//----------------------------------------------------------------------------------------------
//
//对接收到在接收缓冲区的数据进行判断,为回复包还是为数据包,为回复包的作数据处理
INT8U RS485_Data_Judge(void)
{
if((RS485_Receive_Buff[FunctionCode] & 0x80)==0x80) // 当功能代码第七位为1时,接收到的为回复包,进行回复包处理
{
return 0; // 为回复包时返回0值
}
else
{
return 1; // 当功能代码第七位为0,即接收到的为数据包,返回1值
}
}
//----------------------------------------------------------------------------------------------
// 字节判断函数
// 接收到的为数据包,再作判断,数据包处理函数 接收到的字节数与功能代码中说明的字节一致返回1,不一致返回0
INT8U RS485_Byte_Judge(void)
{
INT8U Handle_Data;
Byte_Len=0;
Handle_Data=RS485_Receive_Buff[FunctionCode] & 0x30;
switch(Handle_Data)
{
case 0x00:
if(Receive_Count==8)
{
Byte_Len=8;
return 1;
}
break;
case 0x10:
if(Receive_Count==40)
{
Byte_Len=40;
return 1;
}
break;
case 0x20:
if(Receive_Count==128)
{
Byte_Len=128;
return 1;
}
break;
default:
return 0;
break;
}
}
//----------------------------------------------------------------------------------------------
//
// 简单累加和校验,包括数据包和校验,数据头和校验
INT8U RS485_CRC_Judge(void)
{
INT8U count;
Receive_CheckHead=0;
for(count=0; count<Byte_Len;count++)
{
if(count==7)
{
//
}
else
{
Receive_CheckHead += RS485_Receive_Buff[count]; // 更新累加数据头和校验信息
}
}
if(Receive_CheckHead==RS485_Receive_Buff[7])
//if((Receive_CheckData==RS485_Receive_Buff[6]) && (Receive_CheckHead==RS485_Receive_Buff[7]))
{
return 1; //校验正确返回1;
}
else
{
return 0; // 校验错误返回0;
}
}
// //----------------------------------------------------------------------------------------------
// //
// // 判断是否为自己的地址或广播地址,自己的地址返回Address_Self,广播地址返回Address_Broad;都不是返回Address_Rong
// INT8U RS485_Address_Judge(void)
// {
// INT8U data;
// data=RS485_Receive_Buff[0];
// if(data==RS485_Address_Broad)
// {
// return Address_Broad;
// }
//
// else if(data==RS485_Address_Self)
// {
// return Address_Self;
// }
// else
// {
// return Address_Rong;
// }
// }
//
//
//----------------------------------------------------------------------------------------------
//
//IIC发送数据处理函数
void IIC_Send_Handle()
{
INT8U i=12;
INT8U IIC_Send_Count;
UpdateFlag=1; // 表示有数据更新
if( (RS485_Receive_Save[Order_Attribute]==0x42)||(RS485_Receive_Save[Order_Attribute]==0x62)
||(RS485_Receive_Save[Order_Attribute]==0x46) ) // 判断命令属性是否符合要求
{
IICSendBuff[0]= 0x01; // 状态标志不为0时,为有数据状态(命令属性符合要求的状态)
IICCSendDataheck += IICSendBuff[0];
for(IIC_Send_Count=1;IIC_Send_Count<7;IIC_Send_Count++)
{
if(IIC_Send_Count==5)
{
i=i+1;
}
IICSendBuff[IIC_Send_Count]=RS485_Receive_Save[i];
IICCSendDataheck += IICSendBuff[IIC_Send_Count];
i++;
}
IICCSendDataheck=(~IICCSendDataheck)+0x01;
IICSendBuff[IIC_Send_Count]=IICCSendDataheck; // 校验和,单字节累加和补码
}
else
{
IICSendBuff[0]=0; // 状态标志为0时,为无数据状态(命令属性不符合要求的状态)
}
}
//----------------------------------------------------------------------------------------------
//
//IIC接收数据处理函数
void IIC_Receive_Handle()
{
{
INT8U i,m,t;
INT8U Aim_ID=8;
RS485_Send_Buff[0]= 0x41; // 待发数据的目的地址为射频地址0x41
RS485_Send_Buff[1]= RS485_Address_Self; // 待发送数据的源地址为本机地址
RS485_Send_Buff[2]= 0x10; // 待发送数据的功能代码,为首发40个字节的数据包
RS485_Send_Buff[12]= 0x82; // 待发数据的源设备ID首位,源设备ID为82,0,0,01。
RS485_Send_Buff[15]= 0x01; // 待发数据的源设备ID末位,源设备ID为82,0,0,01。
RS485_Send_Buff[16]= 0x42; // 命令属性,此定为B,即0x42
RS485_Send_Buff[17]= IICReceiveBuff[5]; // 命令参数,为IIC接收数据的第5位,第6位
RS485_Send_Buff[18]= IICReceiveBuff[6]; // 命令参数,为IIC接收数据的第5位,第6位
RS485_Send_Buff[23]= 0x10; // 待发数据有效数据的位数,此为16位数据
for(i=1;i<5;i++) // 待发送数据的目标设备ID,为IIC接收到数据的第1到第4位置
{
RS485_Send_Buff[Aim_ID]= IICReceiveBuff[i];
Aim_ID++;
}
for(m=8;m<40;m++)
{
Send_CheckData += RS485_Send_Buff[m];
}
RS485_Send_Buff[6]=Send_CheckData;
for(t=0;t<7;t++)
{
Send_CheckHead += RS485_Send_Buff[t];
}
RS485_Send_Buff[7]=Send_CheckHead;
}
RS485_Send_Flag=1;
}
//----------------------------------------------------------------------------------------------
//
// 设置回复包程序
void RS485_Answer_Set(void)
{
INT8U i,Send_Answer_Checksum=0;
//将目的地址和源地址放及回复包功能代码位放入回复回复包缓冲区RS485_Answer_Send_Buff
RS485_Answer_Send_Buff[0]= RS485_Receive_Buff[1]; // 目的地址放入发送回复包缓冲区
RS485_Answer_Send_Buff[1]= RS485_Receive_Buff[0]; // 源地址放入发送回复包缓冲区
RS485_Answer_Send_Buff[2]= 0x80; // 回复包功能代码
for(i=0;i<7;i++)
{
Send_Answer_Checksum+=RS485_Answer_Send_Buff[i];
}
RS485_Answer_Send_Buff[7]=Send_Answer_Checksum;
}
//----------------------------------------------------------------------------------------------
//
//数据包处理函数
void RS485_Data_Handle(void)
{
INT8U Byte_Flag; // 字节标志,字节数相符为1,否则为0
INT8U CRC_Flag; // CRC标志,CRC校验正确为1,否则为0
INT8U Address_Flag; // 地址标志,有自己本身地址。广播地址,和其他地址
INT8U Receive_Data_Type;
Byte_Flag=RS485_Byte_Judge();
CRC_Flag=RS485_CRC_Judge();
//Address_Flag= RS485_Address_Judge();
Address_Flag= RS485_Receive_Buff[0];
Receive_Data_Type=RS485_Data_Judge(); // 判断为回复包还是为数据包
if(Byte_Flag==1)
{
if(CRC_Flag==1)
{
if(Address_Flag==RS485_Address_Self)
{
if(Receive_Data_Type==0)
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -