?? 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 + -