📄 uartsio2.bak
字号:
//The Uart use for 8 bit data length,
//2 bit stop,1200 baud
//Odd parity
//********************************************************************
//const TargetAddressCode[]={0,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6}; //目标地址室内机1、2、3、4、5、6、7、8
const TargetAddressCode[]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; //目标地址室内机1、2、3、4、5、6、7、8
const LeadCode[]={0xaa,0x55,0xe7,0x18};
#define OutRoomAddress 0xFF //室外机地址
#define OwnAddress 0x00 //线控器地址
#define tUart2SendInterval 10 //接收到数据后间隔发送的时间(Ms)
#define SendLeadCode_s 4 //发送时引导码的个数
#define RecevLeadCode_s 4 //接收时引导码的个数
//LedCode[4]是源地址(线控器地址)
UartProgram()
{
if (UartSendingFlag) return;
if (UartReceivedFlag) //数据没有接收完清除100MS计时器
{
if (tUart2SendInterval>=UartDelaySendTime) return;
SourceAddress=OwnAddress; //源地址
InformationType=0; //发送的数据类型为0
UartLoadSendDataToIn(); //装载发送的数据
CheckSumP(); //发送前计算校验和
UART2_TIE=1; //启动发送中断
}
}
UartLoadSendDataToIn()
{
Uart2BufClear();
WDTC.byte=0x05;
i=cUart2Send-1;
CommandState=ModeRegister[i].byte; //模式
/*
if (InError[i]==9)
{//模式冲突关闭当前室内机
ModeRegister[i].byte |= 0x01;
LcdClear3sFlag=0;
Time3SecondCounter=0;
}
*/
if (TempErrorFlag)
{CommandState &= 0x7f;} //传感器故障时自动转到室内机传感器
Uart2Buf[0]=FuctionRegister[i].byte; //功能
Uart2Buf[1]=FanDoorAndSetTemp[i].byte; //风门及设定温度
Uart2Buf[2]=Command1[i].byte;
Uart2Buf[3]=A_DAverageValue; //室内温度AD值
Uart2Buf[4]=hiword(TimerOn[i]);
Uart2Buf[5]=loword(TimerOn[i]);
Uart2Buf[6]=hiword(TimerOff[i]);
Uart2Buf[7]=loword(TimerOff[i]);
Uart2Buf[8]=hiword(ValveOpen[i]);
Uart2Buf[9]=loword(ValveOpen[i]);
Uart2Buf[10]=NewIndoorNumber; //新的室内机器编码
}
Uart2BufClear()
{//缓冲区清零
for (i=0;i<16;i++)
{Uart2Buf[i]=0;}
}
//计算校验和
CheckSumP()
{
pointsend=&TargetAddress; //
if (UartSendTargetFlag) //----------------------- //发送给室内机的目标地址
{TargetAddress=TargetAddressCode[cUart2Send];}
CheckSum=SourceAddress; //------------------------------------>计算校验和时,第一个数是集控器的地址码
for (j=0;j<19;j++)//(j=0;j<(&CheckSum-&TargetAddress);j++)
{
WDTC.byte=0x05;
CheckSum += *pointsend;
pointsend++;
}
}
//****************************中断主程序*****************************************************
__interrupt void uart_sio2_int(void)
{
if (UartReceivedFlag)
{UART2_SendProgram();}
else
{UART2_ReceivProgram();}
}
//*****************************************************************************************
//发送程序
UART2_SendProgram()
{
unbyte i,j,k;
//----------------------------------------------------------------------------------------
if (!UartSendingFlag)
{
UartSendingFlag=1;
pointsend=&SourceAddress;
cUart2=0;
}
if (SendLeadCode_s>cUart2)
{//--------------------------------------------->发送引导码
SIDR2.byte=LeadCode[cUart2];
cUart2++;
return;
}
SIDR2.byte=*pointsend++;
if (pointsend>=(&CheckSum+1))
{
UART2_TIE=0; //----------------->关闭发送
UartSendingFlag=0; //----------------->清除数据正在发送标志
if (0==UartSendTargetFlag && IndoorTestOverFlag )//--------------->如果集控器正在给室外机发送指令,且没有检测到室不给室内机发信号
{UartSendTargetFlag=1;UartDelaySendTime=0;return;}//------------->设置标志,给室外机发送完后直接给室内机发送指令
UartSendTargetFlag=0;
UartReceivedFlag=0; //----------------->清除数据接收完毕标志
UART2_RIE=1; //----------------->启动接收中断允许
// cUart2Send++;
// if (IndoorMacs<cUart2Send)//-------------->IndoorMacs是室内机个数,此宏定义在文件"Keypress.h"中
// {cUart2Send=1;}
}
}
UART2_ReceivProgram()
{
unbyte i,j,k;
if (!UartReceivingFlag)
{
UartReceivingFlag=1;
pointreceiv = &SourceAddress;
cUart2=0;
}
//==========================================================================
i=SSD2.byte;
if (i&0xe0)
{ //接收数据出错处理
UartReceivingFlag=0;
UART2_RERC=0; //清除所有错误标志
i=SIDR2.byte;
return;
}
//===========================================================================
*pointreceiv=SIDR2.byte;
if (RecevLeadCode_s>cUart2)
{
if (*pointreceiv!=LeadCode[cUart2]) //判断接收到的引导码是否正确,
{UartReceivingFlag=0;} //引导码错误重新接收
cUart2++;
return;
}
pointreceiv++;
//---------------------------------------------------------------------------
if (pointreceiv>=(&CheckSum+1))
{
UartReceivingFlag=0;
//-------------------------------------------------
pointreceiv=&SourceAddress; //指针复位
k=0;
//-------------------------------------------------
for (j=0;j<20;j++)//(j=0;j<(&CheckSum-&SourceAddress);j++)
{k=k+*pointreceiv++;}
//--------------------------------------------------------------
if (k != CheckSum) {return;} //接收校验和不对,退出
//--------------------------------------------------------------
if (OwnAddress==TargetAddress && SourceAddress<17)
{//---------------------室内机发送给线控器的命令
k=SourceAddress-1;
if (MacNumEntOkFlag)
{
if (k != DisplayMachineOrder)
{
point= &Seg0_Seg1.byte;
for (i=0;i<16;i++)
{*point++ =0;}
ModeRegister[k].byte=ModeRegister[DisplayMachineOrder].byte;
FanDoorAndSetTemp[k].byte=FanDoorAndSetTemp[DisplayMachineOrder].byte;
ValveOpen[k]=ValveOpen[DisplayMachineOrder];
TimerOn[k]=TimerOn[DisplayMachineOrder];
TimerOff[k]=TimerOff[DisplayMachineOrder];
InError[k]=InError[DisplayMachineOrder];
FuctionRegister[k].byte=FuctionRegister[DisplayMachineOrder].byte;
SetCoolHeartTemp[k].byte=SetCoolHeartTemp[DisplayMachineOrder].byte;
ModeRegister[DisplayMachineOrder].byte=1;
FanDoorAndSetTemp[DisplayMachineOrder].byte=129;
ValveOpen[DisplayMachineOrder]=200;
TimerOn[DisplayMachineOrder]=0;
TimerOff[DisplayMachineOrder]=0;
InError[DisplayMachineOrder]=0;
FuctionRegister[DisplayMachineOrder].byte=0x80;
SetCoolHeartTemp[DisplayMachineOrder].byte=0x88;
if (NewIndoorNumber)
{
BuzzerWorkNumber=3;
NewIndoorNumber=0;
}
}
}
DisplayMachineOrder=k;//收到室内机的命令则读取机器编码
MacNumEntOkFlag=1; //收到数据
cUart2Send=SourceAddress; //接收到室内机给线控器发的命令后,将线控器发送目标定为当前室内机
UartSendTargetFlag=1; //设置此标志线控器一直向室内机发送命令
// if (Uart2Buf[0]&0x40) //确认室内机编号完成,且设置转移没完成
// {MoveMode();}
InError[SourceAddress-1]=Uart2Buf[2];//读室内机故障
ErrCode =Uart2Buf[3];//室外机故障
TargetFrequency =Uart2Buf[4];
InInAirTemp =Uart2Buf[5];//室内进风温度
InOutAirTemp =Uart2Buf[6];//室内出风温度
InInExchangeTemp =Uart2Buf[7];//室内进管温度
InOutExchangeTemp =Uart2Buf[8];//室内出管温度
AIR_T =Uart2Buf[9];
HEAT_T_A =Uart2Buf[10];
DISCHARGE_T =Uart2Buf[11];
HpMPa_H =Uart2Buf[12];
HpMPa_L =Uart2Buf[13];
OutCurrent =Uart2Buf[14];
OutValveOpenH =Uart2Buf[15];
ResSendProgram();
}
}
}
ResSendProgram()
{
UartReceivedFlag=1; //数据接收好标志
UART2_RIE=0; //禁止接收
UartDelaySendTime=0; //延时发送时间清零
}
//*****************************************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -