📄 comm.c
字号:
PutChar(CommChkOut);
PutChar(0x0D);
CommTxPointer = 0;
COMMEN = COMMEN_ON;
os_wait(K_TMO,20/OS_MSEL_PER_TICKS,0);
SBUF = 0xEB;//启动发送
}
/*********************************************************************************************************
** 函数名称: CommSendCellDataInfo
** 功能描述: 发送电池数据报文
** 输 入: 无
** 输 出: 无
** 全局变量: address CommCid ReturnCode outchk cell.u cell.i cell.c cell.s
** 调用模块: OSQCreate PutCharWithCheck PutChar
**
** 作 者: 刘宝贵
** 日 期: 2004年4月27日
**-------------------------------------------------------------------------------------------------------
** 修改人: 刘宝贵
** 日 期: 2004年4月29日22:17
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void CommSendCellDataInfo (void)
{
uint8 data temp8;
temp8 = 0;
CommTxPointer = 0;
CommTxLength = 35;
CommChkOut = 0xEB;
PutCharWithCheck(0x90);
PutCharWithCheck(0xEB);
PutCharWithCheck(0x90);
PutCharWithCheck(Address);
PutCharWithCheck(CommCid);
PutCharWithCheck(27);
PutCharWithCheck(ReturnCode);
PutCharWithCheck((uint8)(MeasureU>>8));
PutCharWithCheck((uint8)(MeasureU));
PutCharWithCheck((uint8)(MeasureI>>8));
PutCharWithCheck((uint8)(MeasureI));
PutCharWithCheck((uint8)(MeasureT>>8));
PutCharWithCheck((uint8)(MeasureT));
PutCharWithCheck((uint8)(LastTimeS>>24));
PutCharWithCheck((uint8)(LastTimeS>>16));
PutCharWithCheck((uint8)(LastTimeS>>8));
PutCharWithCheck((uint8)(LastTimeS));
PutCharWithCheck((uint8)((AmountQ10S/36000)>>8));
PutCharWithCheck((uint8)( AmountQ10S/36000));
PutCharWithCheck(State);
PutCharWithCheck(ProgramNo);
PutCharWithCheck(Step);
PutCharWithCheck(RemainLoopTimes);
PutCharWithCheck(Mode);
PutCharWithCheck(LoopTimes);
PutCharWithCheck((uint8)(SetupU>>8));
PutCharWithCheck((uint8)(SetupU));
PutCharWithCheck((uint8)(SetupI>>8));
PutCharWithCheck((uint8)(SetupI));
PutCharWithCheck(ErrorType);//告警信息
if(ChangeStateFlag)
{
temp8 = temp8 |1;
}
else
{
temp8 = temp8 & 0xFE;
}
PutCharWithCheck(temp8);
PutCharWithCheck(0);
PutCharWithCheck(0);
PutChar(CommChkOut);
PutChar(0x0D);
CommTxPointer = 0;
COMMEN = COMMEN_ON;
os_wait(K_TMO,20/OS_MSEL_PER_TICKS,0);
SBUF = 0xEB;//启动发送
}
/*********************************************************************************************************
** 函数名称: void TaskComm (void) _task_ 5
** 功能描述: 对所接收的数据包进行异或效验
** 输 入: 接收数据数据包
** 输 出: 效验通过返回1 ,否则返回0
** 全局变量:
** 调用模块:
**
** 作 者: 刘宝贵
** 日 期: 2006年4月26日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
bit XorCheck(void)
{
uint8 idata checktemp;
uint8 idata i;
checktemp = 0xeb^0x90^0xeb^0x90;
checktemp^= Address;
checktemp^= CommCid;
checktemp^= CommRxLength;
for(i=0;i<CommRxLength;i++)
{
checktemp ^= CommRxBuf[i];
}
if(checktemp == CommChkIn || CommChkIn==0x55)
{//如果接收的校验和为0x55则不校验
return 1;
}
else
{
return 0;
}
}
/*********************************************************************************************************
** 函数名称: bit XorCheck(void)
** 功能描述: 串口处理任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: 无
**
** 作 者: 刘宝贵
** 日 期: 2006年4月25日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TaskComm (void) _task_ 5
{
SCON = 0x50; /*page 111*/
RCAP2H = 0xFF;
RCAP2L = 0xE6;
T2CON = 0x34;
CommState = 0;
CommCid = 0;
CommRxPointer = 0;
CommTxPointer = 0;
ES = 1; /*page 101*///使能串口中断
for(;;)
{
os_wait (K_TMO, 10/OS_MSEL_PER_TICKS, 0);
if(CommNewMessage==1)
{
CommNewMessage = 0;
ReturnCode = RIGHT;
if(0 == XorCheck())//对所接收的数据包进行异或效验
{
ReturnCode = CHKSUM_ERROR;
}
if (0x0d != CommRxBuf[CommRxLength])// 判断报文尾
{
ReturnCode = TYPE_ERROR;
}
if(ReturnCode==RIGHT)//如果报文的校验和,类型正确
{
CommCounter = 0;
switch (CommCid)
{
case 0: // 握手命令
{
CommSendInfo();
}break;
case 1: // 取电池数据信息
{
CommSendCellDataInfo();
}break;
case 2: // 工步设置
{
if(State == STOP)//如果当前为停止状态则可以修改工步
{
ProgramNo = CommRxBuf[0];
Step = CommRxBuf[1];
Mode = CommRxBuf[2];
SetupU = CommRxBuf[3]; SetupU = SetupU<<8; SetupU |= CommRxBuf[4];
SetupI = CommRxBuf[5]; SetupI = SetupI<<8; SetupI |= CommRxBuf[6];
JumpTimeM = CommRxBuf[7]; JumpTimeM = JumpTimeM<<8;JumpTimeM |= CommRxBuf[8];
JumpU = CommRxBuf[9]; JumpU = JumpU<<8; JumpU |= CommRxBuf[10];
JumpI = CommRxBuf[11];JumpI = JumpI<<8; JumpI |= CommRxBuf[12];
JumpQ = CommRxBuf[13];JumpQ = JumpQ<<8; JumpQ |= CommRxBuf[14];
if(Mode==99)
{
SetupCurrentDirection = SetupU;
}
if(CheckSingleStep() == 0)//检测读取的工步是否合法 0:不合法。
{
ReturnCode = DATA_ERROR;
}
CommSendInfo();
if(ReturnCode==RIGHT)
{
SaveSingleStep();
}
}
else
{
ReturnCode = LOGIC_ERROR;
CommSendInfo();
}
}break;
case 3:// 模块停止
{
if(State == RUN || State == PAUSE )
{
State = STOP;
}
else
{
ReturnCode = LOGIC_ERROR;
}
CommSendInfo();
}break;
case 4:// 模块启动
{
if(State==STOP)
{
// ProgramNo = CommRxBuf[0];
Step = CommRxBuf[0];
if(Step<=STEP_MAX)
{
ProgramNo = 0;
State = RUN;
ReadLoopTimes();
}
else
{
ReturnCode = DATA_ERROR;
}
}
else
{
ReturnCode = LOGIC_ERROR;
}
CommSendInfo();
}break;
case 5:// 工步续接
{
CommSendInfo();
}break;
case 6:// 模块暂停
{
if(State==RUN)
{
State = PAUSE;
EepromWriteByte(E2State ,State);
}
else
{
ReturnCode = LOGIC_ERROR;
}
CommSendInfo();
}break;
case 7:// 模块由暂停恢复运行
{
if(State==PAUSE)
{
State = RUN;
EepromWriteByte(E2State ,State);
}
else
{
ReturnCode = LOGIC_ERROR;
}
CommSendInfo();
}break;
case 8:// 读取工步
{
CommSendWorkStepInfo();
}break;
case 0xC0:// 设模块参数
{
uint16 idata temp16;
temp16 = CommRxBuf[1];temp16 = temp16<<8;temp16 = temp16 | CommRxBuf[2];
if(temp16 <= PARAMETER_MAX && temp16 >=PARAMETER_MIN && CommRxBuf[0]<8)
{
switch(CommRxBuf[0])
{
case 0:temp16 = E2Uk ;break;
case 1:temp16 = E2Ub ;break;
case 2:temp16 = E2Ik ;break;
case 3:temp16 = E2Ib ;break;
case 4:temp16 = E2DAk;break;
case 5:temp16 = E2DAb;break;
case 6:temp16 = E2Tk ;break;
case 7:temp16 = E2Tb ;break;
}
EepromWriteByteA(temp16,CommRxBuf[1]);
EepromWriteByteA(temp16+1,CommRxBuf[2]);
switch(CommRxBuf[0])
{
case 0:Uk = EepromReadWordA(E2Uk) ;break;
case 1:Ub = EepromReadWordA(E2Ub) ;break;
case 2:Ik = EepromReadWordA(E2Ik) ;break;
case 3:Ib = EepromReadWordA(E2Ib) ;break;
case 4:DAk = EepromReadWordA(E2DAk);break;
case 5:DAb = EepromReadWordA(E2DAb);break;
case 6:Tk = EepromReadWordA(E2Tk) ;break;
case 7:Tb = EepromReadWordA(E2Tb) ;break;
}
}
else
{
ReturnCode = DATA_ERROR;
}
CommSendInfo();
}break;
case 0xC1:// 取模块参数
{
CommSendParaInfo();
}break;
default:
{
ReturnCode = CID_ERROR;
CommSendInfo();
}
}//switch (CommCid)
}//if(ReturnCode==1)//如果报文的校验和,类型正确]
else//如果校验和或类型不正确
{
CommSendInfo();
}
}//if(CommNewMessage==1)
}//for(;;)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -