?? jbmcomm.c
字號:
/************************************************************
*
* 文件名: jbmcomm.c
* 說 明:MODEM通信主文件
* 主要含: 計費器上呼管理機函數: UpCall()
* 管理機呼叫計費器函數: DownCall()
*
*************************************************************/
//#pragma SRC
//#pragma DEBUG
#include <jbMcomm.h>
#define MODEM_TEST 1
/************************************************************
*
* 函 數:UpCall(void)
* 說 明:計費器呼叫管理機程序
* 手動,出錯自動呼叫及回報話單均調用本過程
*
***********************************************************/
void UpCall(void)
{
byte bBuf;
bErrorCode=ERR_NO; // 缺省設置為無錯
cbFangDao=0; // 啟動發防盜音
while(TRUE)
{
if(!Dial()){ // 撥管理機電話號碼
bErrorCode=ERR_00;
break;
}
if(!ConnectModem()){ // MODEM聯絡過程
bErrorCode=ERR_01;
break;
}
if(!RxFirstOK()) // 接收管理機下傳的第一個OK
break;
SendTelNum(1);
if(!RxByte())
break;
bBuf=bRecSBUF;
if(!RxByte())
break;
if((bBuf==END)&&(bBuf==~bRecSBUF)){ // 無此用戶
bErrorCode=ERR_21;
break;
}
if((bBuf==ERR_CS)&&(bBuf==~bRecSBUF)){
fWorkMode=0;
bStatusWord=S_OLDUPCOMM;
return;
}
if((bRecSBUF!=0xbb)||((bBuf!=0x88)&&(bBuf!=0x99))){
TxByte(0xcc);
TxByte(0xdd);
bErrorCode=ERR_31;
break;
}
if(bBuf==0x88){
fWorkMode=0;
bStatusWord=S_OLDUPCOMM; // 新系統下按OLD模式通信
return;
}
fWorkMode=1;
bStatusWord=S_NEWUPCOMM; // 新系統下按NEW模式通信
return;
}
ExitPro(); // 關閉CML644A并延時顯示出錯信息
}
// End function: UpCall()
/************************************************************
*
*
* 函 數:DownCall
* 說 明:管理機呼叫計費器程序,收到聯絡音后進入
*
*
***********************************************************/
void DownCall(void)
{
byte i,bBuf,k,j;
bErrorCode=ERR_NO;
bCallReason=0xff;
cbFangDao=0;
////////////////////////////////////
bDlpReason=0;
InitLevel();
FSK=1;
EA=0;
IE=0x00;
TMOD=0x21;
SCON=0x40; // 串口工作模式1,8位UART
TH0=L5MS_H; // 主頻為11.0592MHZ,5MS定時常數
TL0=L5MS_L;
ET0=1;
TH1=0xfc; // 串口9600BPS定時常數
TL1=0xfc;
TI=0;
RI=0;
TR1=0;
REN=1;
ES=1;
T2CON=0x00;
T2MOD=0x00;
TF2=0;
TR2=0;
RCAP2H=0xff; // 278US
RCAP2L=0x56;
TH2=0xff;
TL2=0x56;
ET2=1;
EA=1;
PCON=0x80;
P1=(P1&0xf8)|0x06;
Close(MD_CS);
ResetUart();
P1=(P1&0xf8)|0x05;
aCallID[99]=0;
aCallID[98]=0;
aCallID[97]=0;
TR2=0;
TR1=1;
TR0=0;
bCurrentVoltage=0;
fTxFSKStart=1;
while(1){
for(j=0;j<10;j++){
TxByte(j);
}
TxByte(aCallID[99]);
TxByte(aCallID[98]);
TxByte(aCallID[97]);
j=0;
i=0;
k=0;
while(1){
switch(k){
case 0:
TR0=1;
EA=1;
Delay5MS(100);
TR0=0;
TR1=0;
TR2=0;
EA=0;
P1=(P1&0xf8)|0x06;
k=1;
break;
case 1:
j=0;
for(i=0;i<8;i++){
TxFskByte(0x55);
}
for(i=0;i<2;i++){
TxFskByte(0xFF);
}
TxFskByte(0x80);
while(j<128){
TxFskByte(j++);
}
k=2;
break;
case 2:
InitLevel();
P1=(P1&0xf8)|0x05;
TR0=1;
TR1=1;
TR2=1;
EA=1;
Delay5MS(200);
TxByte(0xaa);
TxByte(0xaa);
k=3;
break;
case 3:
Delay5MS(60);
cbDelay5MS=200;
fDelay5MS=0;
while(!fDelay5MS){
if(aCallID[99]>0){
if(RxFskByte(&j))
TxByte(j);
cbDelay5MS=200;
fDelay5MS=0;
}
}
k=0;
break;
default :
TxByte(0xfa);
TxByte(0xfa);
break;
}
}
}
////////////////////////////////////
while(TRUE){
if(!ConnectModem()){
bErrorCode=ERR_01; // 載波聯絡失敗
break;
}
DispSymbol(LARGE_COMM);
DelaySecond(2);
TxCmd(OK);
for(i=0,bBuf=0;i<17;i++){
if(!RxByte())
return;
if(i<16)
bBuf+=bRecSBUF;
}
if(bBuf==bRecSBUF){
fWorkMode=0;
bCallReason=0x88;
bStatusWord=S_OLDDOWNCOMM;
return;
}
if(bBuf!=~bRecSBUF){
TxByte(0xcc);
TxByte(0xdd);
bErrorCode=ERR_31;
break;
}
//TxCmd(OK);
TxByte(0x66);
TxByte(0xbb);
if(!RxByte())
break;
bBuf=bRecSBUF;
if(!RxByte())
break;
if((bRecSBUF!=0xbb)||((bBuf!=0x88)&&(bBuf!=0x99))){
bErrorCode=ERR_31;
break;
}
bCallReason=0x99;
if(bBuf==0x88){
if(fWorkMode)
fSecretSelect=0;
fWorkMode=0;
bStatusWord=S_OLDDOWNCOMM;
return;
}
if(!fWorkMode)
fSecretSelect=0;
fWorkMode=1;
bStatusWord=S_NEWDOWNCOMM;
return;
}
ExitPro();
}
// End function: DownCall()
/************************************************************
*
* 函 數:OldComm()
* 說 明:OLD模式數據交換過程
* OLD模式上呼和下傳均調用本函數
*
***********************************************************/
void OldComm(void)
{
byte bTemp;
byte bRecord=0;
bool fTest;
uint iCommFail;
bErrorCode=ERR_NO;
if(bStatusWord==S_OLDUPCOMM){
SendTelNum(0);
while(1){
if(RxCmd())
break;
if(bRecSBUF==OK)
break;
else
bErrorCode=ERR_04;
ExitPro();
return;
}
if((bCallReason==NEW_TEST)||(bCallReason==NEW_REPORT_BILLS))
bCallReason=OLD_TEST;
if(bCallReason==OLD_TEST)
bRecord=1;
}
else{ // OLD模式下傳通信準備
if(bCallReason==0x88) //老系統下傳
TxCmd(ERR_CS);
else
TxCmd(OK);
bCallReason=DYNAMIC_PASSWORD; // 接收動態密碼
}
fWorkMode=0;
while(TRUE)
{
if(bCallReason==DYNAMIC_PASSWORD)
bTemp=bCallReason;
else{
bTemp=SearchCmd(bCallReason);
DispCmd(bTemp); // 顯示通信代碼
}
if(bTemp==0xff)
break;
fTest=0;
iCommFail=0;
switch(bCallReason)
{
case OLD_TEST: // 0x23
OldTest();
fTest=1;
break;
case DYNAMIC_PASSWORD: // 0x09
DynamicPassword();
break;
case OLD_REPORT_BILLS: // 0x20
OldReportBills();
break;
case OLD_DAYTOTAL: // 0x24
OldDayTotal();
break;
case OLD_SCALL_TOTAL: // 0x25
OldScallTotal(bCallReason);
break;
case OLD_POWERONOFF: // 0x26
OldPowerOnOff();
break;
case OLD_SYSTEM: // 0x10
OldSystem();
break;
case OLD_DISABLE: // 0x12
OldDisable();
break;
case OLD_DISCOUNT: // 0x11
OldDiscount();
break;
case OLD_IDD_TARIFF: // 0x16
iCommFail=PARA_229;
OldIDDTariff();
break;
case OLD_DDD_TARIFF: // 0x17
iCommFail=PARA_230;
OldDDDTariff();
break;
case OLD_LOCAL_TARIFF: // 0x18
iCommFail=PARA_231;
OldLocalTariff();
break;
case OLD_IDD_CLASS: // 0x13
iCommFail=PARA_226;
OldIDDClass();
break;
case OLD_DDD_CLASS: // 0x14
iCommFail=PARA_227;
OldDDDClass();
break;
case OLD_LOCAL_CLASS: // 0x15
iCommFail=PARA_228;
OldLocalClass();
break;
case OLD_QUERY_BILLS: // 0x1c
OldQueryBills();
break;
case OLD_REPORT_QUERYBILLS: // 0x22
OldReportQueryBills();
break;
case OLD_CLOCK: // 0x19
OldClock();
break;
case QUERY_VERSION: // 0x81
QueryVersion();
break;
default:
bErrorCode=ERR_33; // 收到異常命令
break;
}// End switch(bCallReason)
// 接收下一條命令或進行出錯處理:
if(bDlpReason!=0) return;
if((bErrorCode!=ERR_NO)||(!RxCmd())){
// yxw 2001-03-15 15:30 add 避免通訊不成功時,寫入不完整的數據,更改校驗和
if((iCommFail>=PARA_226)&&(iCommFail<PARA_232)){
Page(6);
XBYTE[PARA_76]=1;
Page(5);
}
break;
}
if(bRecSBUF==END){
if(fTest){
bErrorCode=ERR_21;
break;
}
AutoReadPara(47);
if(bParaByte!=0x88){
bParaByte=0x88;
AutoWritePara(47);
ClrRam();
}
if(bRecord==2)
bCallReason=OLD_TEST;
break;
}
bCallReason=bRecSBUF;
if(bCallReason==OLD_CLOCK)
bRecord++;
else
bRecord=0;
} //End while(TRUE)
ExitPro();
}
// End function: OldComm()
/************************************************************
*
* 函 數:OldTest()
* 說 明:OLD模式上傳測試參數
*
***********************************************************/
void OldTest(void)
{
byte i;
TxCmd(OLD_TEST);
if(!RxCmd())
return;
if(bRecSBUF!=OK){
if(bRecSBUF==END)
bErrorCode=ERR_21;
else
bErrorCode=ERR_05;
return;
}
bPaBuf=OLD_TEST_PA; // 0x00;
bNeBuf=OLD_TEST_NE; // 0x0a;
if(!TxPaNe()){
return;
}
i=0;
memcpy(&aDataBuf,&aTestPara,9);
if(!TxData())
return;
TxCmd(EQ); // 尋問管理機下一命令
}
// End function: OldTest()
/************************************************************
*
* 函 數:DynamicPassword()
* 說 明:校驗動態密碼及接收實時時鐘
* OLD模式和NEW模式共用本函數
*
***********************************************************/
void DynamicPassword(void)
{
byte i,bTemp;
byte xdata *Point;
byte data aTemp[6];
uint iAddr;
bPaBuf=0x00;
bNeBuf=0x10;
iPaNeNum=0;
if(!RxData())
return;
if(fWorkMode)
iAddr=PARA_00;
else
iAddr=PARA_200;
ReadData(1,iAddr,6,&aTemp);
if(fSecretSelect){
if((aTemp[2]!=0)&&(memcmp(&aDataBuf,&aTemp,6)!=0)){
TxCmd(ERR_PW);
bErrorCode=ERR_03;
return;
}
}
bParaByte=0;
AutoWritePara(78);
aTemp[0]=aDataBuf[15]; // 記錄動態密碼
aTemp[1]=aDataBuf[14];
aTemp[2]=aDataBuf[13];
aTemp[3]=aDataBuf[10];
aTemp[4]=aDataBuf[8];
aTemp[5]=aDataBuf[6];
WriteData(1,iAddr,6,&aTemp);
Page(6); // 暫停12887走時
XBYTE[RTC_CONTROLB]=0x92;
Page(5);
// 存儲實時時鐘
for(i=0,Point=0xc000;i<10;i++,Point++){
bTemp=aDataBuf[i+6];
Page(6);
*Point=bTemp;
Page(5);
}
Page(6); // 啟動12887繼續走時
XBYTE[RTC_CONTROLB]=0x12;
Page(5);
TxCmd(OK);
}
// End function: DynamicPassword()
/************************************************************
*
* 函 數:OldReportBills()
* 說 明:OLD模式自動回報話單
*
***********************************************************/
void OldReportBills(void)
{
byte i,j,bTemp;
uint cNoReport;
uint ciBills;
TxCmd(OLD_REPORT_BILLS);
if(!RxCmd())
return;
if(bRecSBUF!=OK){
bErrorCode=ERR_05;
return;
}
// 計算需回報話單的Pa,Ne:
AutoReadPara(69);
cNoReport=iParaWord; //匯報話單數量
ciBills=iParaWord*OLD_BILL_LEN; //匯報話單長度
bPaBuf=(byte)(ciBills/128);
bNeBuf=(byte)(ciBills%128);
if(bNeBuf==0){
bNeBuf=128;
--bPaBuf;
}
if(!TxPaNe())
return;
// 從話單存儲區取內容到aDataBuf[]緩沖區:
AutoReadPara(68); //匯報話單指針
ciBills=OLD_BILLS_ADDR+iParaWord*OLD_BILL_LEN;
iParaWord=0;
for(i=0;i<cNoReport;i++){
for(j=0;j<OLD_BILL_LEN;j++){
Page(1);
bTemp=XBYTE[ciBills++];
Page(5);
aDataBuf[iParaWord++]=bTemp;
}
if(ciBills>=(OLD_BILLS_ADDR+200*OLD_BILL_LEN))
ciBills=OLD_BILLS_ADDR;
}
if(!TxData())
return;
iParaWord=0;
AutoWritePara(69);
AutoReadPara(67);
AutoWritePara(68);
TxCmd(EQ);
}
// End function: OldReportBills();
/************************************************************
*
* 函 數:OldDayTotal()
* 說 明:OLD模式上傳日分項合計記錄
*
***********************************************************/
void OldDayTotal(void)
{
TxCmd(OLD_DAYTOTAL);
if(!RxCmd())
return;
if(bRecSBUF!=OK){
bErrorCode=ERR_05;
return;
}
bPaBuf=OLD_DAYTOTAL_PA; // 0x01;
bNeBuf=OLD_DAYTOTAL_NE; // 0x70;
if(!TxPaNe())
return;
GeneralReadData(1,OLD_DAYTOTAL_ADDR,iPaNeNum,&aDataBuf);
if(!TxData())
return;
TxCmd(EQ);
}
// End function: OldDayTotal()
/************************************************************
*
* 函 數:OldPowerOnOff()
* 說 明:OLD模式上傳開關機記錄
*
***********************************************************/
void OldPowerOnOff(void)
{
TxCmd(OLD_POWERONOFF);
if(!RxCmd())
return;
if(bRecSBUF!=OK){
bErrorCode=ERR_05;
return;
}
bPaBuf=OLD_POWERONOFF_PA; // 0x02;
bNeBuf=OLD_POWERONOFF_NE; // 0x00;
if(!TxPaNe())
return;
GeneralReadData(1,OLD_POWERONOFF_ADDR,iPaNeNum,&aDataBuf);
if(!TxData())
return;
TxCmd(EQ);
}
// End function: OldPowerOnOff()
/************************************************************
*
* 函 數:OldSystem()
* 說 明:OLD模式接收系統參數
*
***********************************************************/
void OldSystem(void)
{
TxCmd(OK);
if(!RxPaNe())
return;
if((bPaBuf!=OLD_SYSTEM_PA)||(bNeBuf!=OLD_SYSTEM_NE)){
bErrorCode=ERR_05;
return;
}
if(!RxData())
return;
GeneralWriteData(OLD_SYSTEM_ADDR);
bParaByte=CalcCSSubA(OLD_SYSTEM_ADDR,iPaNeNum);
AutoWritePara(223);
TxCmd(OK);
}
// End function: OldSystem()
/************************************************************
*
* 函 數:OldDisable()
* 說 明:OLD模式上傳測試參數
*
***********************************************************/
void OldDisable(void)
{
TxCmd(OK);
if(!RxPaNe())
return;
if((bPaBuf!=OLD_DISABLE_PA)||(bNeBuf!=OLD_DISABLE_NE)){
bErrorCode=ERR_05;
return;
}
if(!RxData())
return;
GeneralWriteData(OLD_DISABLE_ADDR);
bParaByte=CalcCSSubA(OLD_DISABLE_ADDR,iPaNeNum);
AutoWritePara(225);
TxCmd(OK);
}
// End function: OldDisableNumber()
/************************************************************
*
* 函 數:OldDiscount()
* 說 明:OLD模式接收折扣參數
*
***********************************************************/
void OldDiscount(void)
{
TxCmd(OK);
if(!RxPaNe())
return;
if((bPaBuf!=OLD_DISCOUNT_PA)||(bNeBuf!=OLD_DISCOUNT_NE)){
bErrorCode=ERR_05;
return;
}
if(!RxData())
return;
GeneralWriteData(OLD_DISCOUNT_ADDR);
bParaByte=CalcCSSubA(OLD_DISCOUNT_ADDR,iPaNeNum);
AutoWritePara(224);
TxCmd(OK);
}
// End function: OldDiscount()
/************************************************************
*
* 函 數:OldIDDClass()
* 說 明:OLD模式接收國際級數表
*
***********************************************************/
void OldIDDClass(void)
{
TxCmd(OK);
if(!RxPaNe())
return;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -