📄 jbscomm.c
字号:
S_EXPAND, // 0x52
S_NEW_TEST // 0x53
};
void NewSendAll(byte bMenu)
{
byte bParaNum=0;
byte bParaType;
uint iAddr;
bool fSendManagement=0;
DispSymbol(LARGE_COMM);
ResetUart();
DispSymbol(LARGE_FLASH);
fFirstCmd=0;
while(TRUE){
bParaType=aNewUCmd[bParaNum];
switch(bParaType){
case S_NEW_SYSTEM: // 0x40
AutoReadPara(100);
iAddr=NEW_SYSTEM_ADDR;
break;
case S_NEW_DISCOUNT: // 0x41
AutoReadPara(101);
iAddr=NEW_DISCOUNT_ADDR;
break;
case S_CALLSTATION: // 0x42
AutoReadPara(102);
iAddr=NEW_CALLSTATION_ADDR;
break;
case S_IDD_CLASS: // 0x43
AutoReadPara(103);
iAddr=NEW_IDD_CLASS_ADDR;
break;
case S_DDD_CLASS: // 0x44
AutoReadPara(104);
iAddr=NEW_DDD_CLASS_ADDR;
break;
case S_LOCAL_CLASS: // 0x45
AutoReadPara(105);
iAddr=NEW_LOCAL_CLASS_ADDR;
break;
case S_IDD_TARIFF: // 0x46
AutoReadPara(106);
iAddr=NEW_IDD_TARIFF_ADDR;
break;
case S_DDD_TARIFF: // 0x47
AutoReadPara(107);
iAddr=NEW_DDD_TARIFF_ADDR;
break;
case S_LOCAL_TARIFF: // 0x48
AutoReadPara(108);
iAddr=NEW_LOCAL_TARIFF_ADDR;
break;
case S_EXPAND: // 0x50
AutoReadPara(109);
if(!fSendManagement) // 少传2个参数
iParaWord-=2;
iAddr=NEW_EXPAND_ADDR;
break;
case S_MANAGEMENT:
if(!fSendManagement){
bParaNum++;
continue;
}
AutoReadPara(110);
iAddr=NEW_MANAGEMENT_ADDR;
break;
case S_NEW_TEST: // 0x53
iParaWord=0x0a;
iAddr=NEW_TEST_ADDR;
break;
}
DispCmd(bParaType);
iPaNeNum=iParaWord;
GeneralReadData(1,iAddr,iPaNeNum,&aDataBuf); // 缓冲数据到aDataBuf[]中。
bPaBuf=(byte)(iParaWord/128);
bNeBuf=(byte)(iParaWord%128);
TxCmd(aNewUCmd[bParaNum]); // 发送命令
if(bParaNum==0){
fWaitExit=1;
if(!RxCmd())
return;
fWaitExit=0;
if(bErrorCode==KEY_EXIT)
return;
}
else{
fWaitExit=0;
if(!RxCmd())
return;
}
if((bParaType==S_NEW_SYSTEM)&&(bRecSBUF==0x10))
fSendManagement=1;
else if(bRecSBUF!=OK){
bErrorCode=ERR_05;
return;
}
if(!TxPaNe()) // 发送PA、NE,并接收应答:
return;
if(!TxData()) // 发送数据:
return;
if(++bParaNum==12){
if(bMenu==1){ //最后发送初始化命令
TxCmd(S_INITIAL);
if(!RxCmd())
return;
}
TxCmd(END);
return;
}
} // End while(TRUE)
}
// End function: NewSendAll()
/************************************************************
*
* 函 数:OldRecvAll()
* 说 明:OLD模式下接收所有数据
*
***********************************************************/
void OldRecvAll(void)
{
byte i,j;
byte bCmdBuf;
byte bCheckSum;
uint iAddr;
// 先接收时钟:
bCmdBuf=bRecSBUF;
DispCmd(bCmdBuf&0x0f);
TxCmd(OK);
if(bCmdBuf==S_TRANSCLOCK){
RecvClock();
return;
}
// 接收其它所有数据,并将它们缓冲到aDataBuf:
iAddr=0;
for(i=0;i<81;i++) // 共81包数据
{
for(j=0,bCheckSum=0;j<65;j++){ // 每包数据64字节+1字节检验和
if(!RxByte())
return;
if(j<64){
aDataBuf[iAddr+j]=bRecSBUF;
bCheckSum+=bRecSBUF; // 计算校验和
}
}
if(bCheckSum!=bRecSBUF){
bErrorCode=ERR_04;
return;
}
iAddr+=64;
if(i<80) TxCmd(OK);
}
TxCmd(OK);
iPaNeNum=iAddr;
Open(POWER_ON);
GeneralWriteData(PARA_202); // 写到OLD模式数据区
// 将老模式控制参数写到扩充参数内
iAddress=PARA_232;
ReadBytes(1,2);
iParaWord--;
iParaWord|=0xf000;
iAddress=iParaWord;
ReadBytes(1,1);
if((bParaByte&0x08)!=0) // 特殊情况,BHY的标志与其他相反
bParaByte&=0xf7;
else
bParaByte|=0x08;
AutoWritePara(51);
// 若命令是S_TRANSANDCLR,还需要清除FLASH和12887的有关记录
if(bCmdBuf==S_TRANSANDCLR)
ClrTotal();
// 自动设置计费器为OLD模式:
bParaByte=0x88;
AutoWritePara(47);
Close(POWER_ON);
}
// End function: OldRecvAll()
/************************************************************
*
* 函 数:NewRecvAll()
* 说 明:NEW模式下接收所有数据
*
***********************************************************/
void NewRecvAll(void)
{
byte bParaType;
byte bParaCode;
uint iAddr;
bool fClrTalk=0;
while(TRUE){
bParaType=bRecSBUF;
DispCmd(bParaType);
if(bRecSBUF==END){
Open(POWER_ON);
if(fClrTalk)
ClrTotal();
Close(POWER_ON);
break;
}
else if(bRecSBUF==S_CLOCK){
TxCmd(OK); // 要接收管理系统号码
RecvClock();
break;
}
else if(bRecSBUF==S_INITIAL){
fClrTalk=1;
TxCmd(OK);
if(!RxCmd())
return;
continue;
}
if(bParaType==S_NEW_SYSTEM) // 2002-04-01 17:26 yxw add ch
TxCmd(0x10);
else
TxCmd(OK);
if(!RxPaNe()) // 接收PA、NE,并接收应答:
break;
if(!RxData()) // 接收数据:
break;
switch(bParaType){
case S_NEW_SYSTEM: // 0x40
bParaCode=100;
iAddr=NEW_SYSTEM_ADDR;
break;
case S_NEW_DISCOUNT: // 0x41
bParaCode=101;
iAddr=NEW_DISCOUNT_ADDR;
break;
case S_CALLSTATION: // 0x42
bParaCode=102;
iAddr=NEW_CALLSTATION_ADDR;
break;
case S_IDD_CLASS: // 0x43
bParaCode=103;
iAddr=NEW_IDD_CLASS_ADDR;
break;
case S_DDD_CLASS: // 0x44
bParaCode=104;
iAddr=NEW_DDD_CLASS_ADDR;
break;
case S_LOCAL_CLASS: // 0x45
bParaCode=105;
iAddr=NEW_LOCAL_CLASS_ADDR;
break;
case S_IDD_TARIFF: // 0x46
bParaCode=106;
iAddr=NEW_IDD_TARIFF_ADDR;
break;
case S_DDD_TARIFF: // 0x47
bParaCode=107;
iAddr=NEW_DDD_TARIFF_ADDR;
break;
case S_LOCAL_TARIFF: // 0x48
bParaCode=108;
iAddr=NEW_LOCAL_TARIFF_ADDR;
break;
case S_EXPAND: // 0x50
bParaCode=109;
iAddr=NEW_EXPAND_ADDR;
break;
case S_NEW_TEST: // 0x53
iAddr=NEW_TEST_ADDR;
break;
case S_MANAGEMENT:
bParaCode=110;
iAddr=NEW_MANAGEMENT_ADDR;
break;
default:
bErrorCode=ERR_05;
return;
}
Open(POWER_ON);
GeneralWriteData(iAddr); // 写入参数内容
if(bParaType!=S_NEW_TEST)
AutoWritePara(bParaCode); // 写入参数长度
Close(POWER_ON);
TxCmd(OK);
if(!RxCmd())
return;
} // End while(TRUE)
bParaByte=0x99;
AutoWritePara(47);
}
// End function: NewRecvAll()
void RecvClock(void)
{
byte i;
byte bTemp;
for(i=0,bTemp=0;i<10;i++){
if(!RxByte())
return;
aNumBuf[i]=bRecSBUF;
bTemp+=bRecSBUF;
}
if(!RxByte())
return;
if(bTemp!=bRecSBUF){
bErrorCode=ERR_04;
return;
}
Page(6);
XBYTE[RTC_CONTROLB]=0x92;
for(i=0;i<10;i++)
aRTCTime[i]=aNumBuf[i];
XBYTE[RTC_CONTROLB]=0x12;
Page(5);
TxCmd(OK); //回应OK
}
// End function: RecvClock()
/************************************************************
*
* 函 数:ChangeWorkMode()
* 说 明:切换工作模式。“88”表示OLD模式,“99”表示NEW模式。
*
***********************************************************/
void ChangeWorkMode(void)
{
bool fLastKey=TRUE;
bool fDispUpdate=TRUE;
AutoReadPara(47);
if((bParaByte!=0x88)&&(bParaByte!=0x99)){
bParaByte=0x99;
AutoWritePara(47);
}
while(TRUE){
IDLE;
if(fDispUpdate){
fDispUpdate=FALSE;
DispClr();
DispCmd(bParaByte);
}
if(fLastKey){
if(bKeyBuf==0xf0)
fLastKey=FALSE;
continue;
}
if(!fKey) continue;
fKey=FALSE;
switch(bKeyBuf){
case K1:
//bErrorCode=KEY_EXIT;
return;
case K23:
fDispUpdate=TRUE;
if(bParaByte==0x88){
bParaByte=0x99;
fWorkMode=1;
}
else{
bParaByte=0x88;
fWorkMode=0;
}
break;
case K4:
AutoWritePara(47);
DispOK(3);
return;
}
} // End while(TRUE)
}
// End function: ChangeWorkMode()
//
// 下为各上层调用的子函数:
//
/************************************************************
*
* 函 数:ResetUart()
* 说 明:初始化异步串行口
*
***********************************************************/
void ResetUart(void)
{
SCON=0x40; // 串口工作模式1,8位UART
TH1=L9600; // 串口9600BPS定时常数
TL1=L9600;
TI=0;
RI=0;
TR1=1;
REN=1;
ES=1;
EX0=1;
bLastCmd=0xff;
fRxDataReady=0;
fTxDataReady=0;
}
// End function: ResetUart()
void SendProgram(void)
{
byte i,bTemp;
byte bNum,k;
uint j;
byte code *Program;
bErrorCode=ERR_NO;
DispSymbol(LARGE_COMM);
ResetUart();
TxCmd(QUERY_VERSION);
fWaitExit=1;
if(!RxCmd())
return;
fWaitExit=0;
if(bErrorCode==KEY_EXIT)
return;
else if(bRecSBUF!=QUERY_VERSION){
bErrorCode=ERR_05;
return;
}
TxCmd(OK);
if(!RxPaNe())
return;
if(!RxData())
return;
TxCmd(OK);
if(!RxCmd())
return;
if(bRecSBUF!=EQ){
bErrorCode=ERR_05;
return;
}
AutoReadPara(50);
if(memcmp(&aDataBuf,&aParaBuf,7)!=0){
TxCmd(END);
bErrorCode=ERR_34;
return;
}
if(aParaBuf[7]>aDataBuf[7]);
else if(aParaBuf[8]>aDataBuf[8]);
else if(aParaBuf[9]>=aDataBuf[9]);
else{
bErrorCode=ERR_34;
return;
}
TxCmd(DOWNLOAD_PROGRAM);
if(!RxCmd())
return;
if(bRecSBUF!=OK){
bErrorCode=ERR_05;
return;
}
DispSymbol(LARGE_FLASH);
DispCmd(DOWNLOAD_PROGRAM);
bPaBuf=0x01;
bNeBuf=0xc0;
if(!TxPaNe())
return;
bNum=44;
k=0;
for(i=0,Program=0x2000;i<224;i++){
DispSpeed(bNum);
bPaBuf=1;
bNeBuf=128;
for(j=0;j<256;j++,Program++){
Page(0);
bTemp=*Program;
Page(5);
aDataBuf[j]=bTemp;
}
if(++k==5){
k=0;
bNum--;
}
FlashComm();
if(!TxData())
return;
}
TxCmd(END);
}
//
// End file: jbscomm.c
//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -