comm.cpp
来自「这是一个在正实际应用当中运行的电力监控系统软件源代码」· C++ 代码 · 共 682 行 · 第 1/2 页
CPP
682 行
if ((OutputReadP[CommNo]-OutputWriteP[CommNo]+WriteCommBuffLen)%WriteCommBuffLen<8) {GlobalUnlock(hChannelParamMem);return 0;}
if (OutputCommMem[CommNo]==NULL) {GlobalUnlock(hChannelParamMem);return 0;}
BYTE FAR *TxBuff=(BYTE FAR *)GlobalLock(OutputCommMem[CommNo]);
*(TxBuff+(OutputWriteP[CommNo]+0)%WriteCommBuffLen)=0xBE;
*(TxBuff+(OutputWriteP[CommNo]+1)%WriteCommBuffLen)=0x7D;
*(TxBuff+(OutputWriteP[CommNo]+2)%WriteCommBuffLen)=ChNo&1;
*(TxBuff+(OutputWriteP[CommNo]+3)%WriteCommBuffLen)=0x85;
*(TxBuff+(OutputWriteP[CommNo]+4)%WriteCommBuffLen)=(ChP+ChNum)->TczPara.ModemStatus;
*(TxBuff+(OutputWriteP[CommNo]+5)%WriteCommBuffLen)=0x00;
*(TxBuff+(OutputWriteP[CommNo]+6)%WriteCommBuffLen)=Lpc(TxBuff,OutputWriteP[CommNo]+2,4,WriteCommBuffLen);
*(TxBuff+(OutputWriteP[CommNo]+7)%WriteCommBuffLen)=0x16;
OutputWriteP[CommNo]=(OutputWriteP[CommNo]+8)%WriteCommBuffLen;
GlobalUnlock(OutputCommMem[CommNo]);
GlobalUnlock(hChannelParamMem);
return 1;
}
/******************************************************/
/******************************************************/
void TCommWindow::ReadCommProc()
{
int Cards=syscfg->GetCommCardNums();
int i,j,Len,ii,iii;
BYTE CHANEL=0xff,CHANEL1,CHANEL2;
ChP = (CHANNELPARAM FAR *) GlobalLock(hChannelParamMem);
for (i=1;i<=Cards*8+2;i++)
{
if (InputCommMem[i]==NULL) continue;
if (((InputWriteP[i]-InputReadP[i]+ReadCommBuffLen)%ReadCommBuffLen)<8) continue;
if ( CalChNum(i)==0xff || CalChNum(i)>=TotalChNum || (ChP+CalChNum(i))->CHType!=2) continue;
BYTE far *RecBuff=(BYTE FAR *)GlobalLock(InputCommMem[i]);
while ((InputWriteP[i]-InputReadP[i]+ReadCommBuffLen)%ReadCommBuffLen>=8)
{
if (*(RecBuff+InputReadP[i]%ReadCommBuffLen)!=0xBE ||
*(RecBuff+(InputReadP[i]+1)%ReadCommBuffLen)!=0x7D)
{
InputReadP[i]=(++InputReadP[i])%ReadCommBuffLen;
continue;
}
CHANEL1=CommPara[i-1].CHANEL1;CHANEL2=CommPara[i-1].CHANEL2;
CHANEL=0xff;
if (*(RecBuff+(InputReadP[i]+2)%ReadCommBuffLen)==0) CHANEL=CHANEL1;
if (*(RecBuff+(InputReadP[i]+2)%ReadCommBuffLen)==1) CHANEL=CHANEL2;
if (CHANEL>=TotalChNum) {InputReadP[i]=InputWriteP[i]=0;break;}
if (!(ChP+CHANEL)->CHValidFlag) {InputReadP[i]=InputWriteP[i]=0;break;}
if ( (ChP+CHANEL)->CHType!=2) break;
(ChP+CHANEL)->TczPara.ModemStatus=*(RecBuff+(InputReadP[i]+4)%ReadCommBuffLen);
Len=*(RecBuff+(InputReadP[i]+5)%ReadCommBuffLen);
if (((InputWriteP[i]-InputReadP[i]+ReadCommBuffLen)%ReadCommBuffLen)<Len+8) break;
BYTE LPC=Lpc(RecBuff,InputReadP[i]+2,Len+4,ReadCommBuffLen);
if (LPC==*(RecBuff+(InputReadP[i]+Len+6)%ReadCommBuffLen))
{
(ChP+CHANEL)->TczPara.ModemStatus=*(RecBuff+(InputReadP[i]+4)%ReadCommBuffLen);
if (*(RecBuff+(InputReadP[i]+3)%ReadCommBuffLen)==1)
{
if (GetSetCommNo==i && GetSetChNo==*(RecBuff+(InputReadP[i]+2)%ReadCommBuffLen) && GetSetFlag==1)
{
COMMPARAMESSAGE *TEMP;
TEMP=(COMMPARAMESSAGE *)(RecBuff+(InputReadP[i]+6)%ReadCommBuffLen);
(ChP+Radio)->TczPara=*TEMP;
GetSetFlag=2;
}
}
else if (*(RecBuff+(InputReadP[i]+3)%ReadCommBuffLen)==0xf)
{
Freq=(*(RecBuff+(InputReadP[i]+6)%ReadCommBuffLen))*256+*(RecBuff+(InputReadP[i]+7)%ReadCommBuffLen);
}
else
{
BYTE FAR *rxb=(ChP+CHANEL)->RecBuff;
WORD rdp=(ChP+CHANEL)->RxReadP;
WORD wrp=(ChP+CHANEL)->RxWriteP;
if ((-wrp+rdp+(ChP+CHANEL)->RxBuffLen-1)%(ChP+CHANEL)->RxBuffLen>=Len)
{
for (iii=0;iii<Len;iii++)
{
*(rxb+(wrp+iii)%(ChP+CHANEL)->RxBuffLen)=*(RecBuff+(InputReadP[i]+iii+6)%ReadCommBuffLen);//6
}
(ChP+CHANEL)->RxWriteP=(wrp+Len)%(ChP+CHANEL)->RxBuffLen;
//InputReadP[i]=(InputReadP[i]+Len+8)%ReadCommBuffLen;
}
}
}
InputReadP[i]=(InputReadP[i]+Len+8)%ReadCommBuffLen;
}
GlobalUnlock(InputCommMem[i]);
}
for (i=1;i<=Cards*8+2;i++)
{
if (InputCommMem[i]==NULL) continue;
if (((InputWriteP[i]-InputReadP[i]+ReadCommBuffLen)%ReadCommBuffLen)<6) continue;
CHANEL=CalChNum(i);
if (CHANEL==0xff || CHANEL>=TotalChNum) continue;
if ((ChP+CHANEL)->CHType!=1 || !(ChP+CHANEL)->CHValidFlag) continue;
BYTE far *RecBuff=(BYTE FAR *)GlobalLock(InputCommMem[i]);
while ((InputWriteP[i]-InputReadP[i]+ReadCommBuffLen)%ReadCommBuffLen>=6)
{
Len=(InputWriteP[i]-InputReadP[i]+ReadCommBuffLen)%ReadCommBuffLen;
BYTE FAR *rxb=(ChP+CHANEL)->RecBuff;
WORD rdp=(ChP+CHANEL)->RxReadP;
WORD wrp=(ChP+CHANEL)->RxWriteP;
if ((-wrp+rdp+(ChP+CHANEL)->RxBuffLen-1)%(ChP+CHANEL)->RxBuffLen>=Len)
{
for (iii=0;iii<Len;iii++)
{
*(rxb+(wrp+iii)%(ChP+CHANEL)->RxBuffLen)=*(RecBuff+(InputReadP[i]+iii)%ReadCommBuffLen);//6
}
(ChP+CHANEL)->RxWriteP=(wrp+Len)%(ChP+CHANEL)->RxBuffLen;
InputReadP[i]=(InputReadP[i]+Len)%ReadCommBuffLen;
}
}
GlobalUnlock(InputCommMem[i]);
}
GlobalUnlock(hChannelParamMem);
}
/******************************************************/
/******************************************************/
void TCommWindow::WriteCommProc()
{
ChP = (CHANNELPARAM FAR *) GlobalLock(hChannelParamMem);
int i,ii;
BYTE CommNo,ChNo;
WORD Len;
BYTE FAR *txb;
BYTE FAR *TxBuff;
WORD rp;
for (i=0;i<TotalChNum;i++)
{
if ((ChP+i)->CHType!=2 || !((ChP+i)->CHValidFlag)) continue;
if ((ChP+i)->TxReadP==(ChP+i)->TxWriteP) continue;
Len=((ChP+i)->TxWriteP-(ChP+i)->TxReadP+(ChP+i)->TxBuffLen)%(ChP+i)->TxBuffLen;
Len= ( (Len < 60) ? Len : 60);
CommNo=(ChP+i)->SIOOrd;ChNo=(ChP+i)->ChNoInComm;
if (OutputCommMem[CommNo]==NULL) {continue;}
if (((OutputReadP[CommNo]-OutputWriteP[CommNo]+WriteCommBuffLen-1)%WriteCommBuffLen)<Len+8) continue;
if ((ChP+i)->TczPara.ModemStatus==0) continue;
txb=(ChP+i)->SendBuff;
rp=(ChP+i)->TxReadP;
TxBuff=(BYTE FAR *)GlobalLock(OutputCommMem[CommNo]);
*(TxBuff+(OutputWriteP[CommNo])%WriteCommBuffLen)=0xBE ;
*(TxBuff+(OutputWriteP[CommNo]+1)%WriteCommBuffLen)=0x7D;
*(TxBuff+(OutputWriteP[CommNo]+2)%WriteCommBuffLen)=ChNo&1;
*(TxBuff+(OutputWriteP[CommNo]+3)%WriteCommBuffLen)=0x80;
*(TxBuff+(OutputWriteP[CommNo]+4)%WriteCommBuffLen)=(ChP+i)->TczPara.ModemStatus;
*(TxBuff+(OutputWriteP[CommNo]+5)%WriteCommBuffLen)=Len;
for (ii=0;ii<Len;ii++)
{
*(TxBuff+(OutputWriteP[CommNo]+ii+6)%WriteCommBuffLen)=*(txb+(rp+ii)%(ChP+i)->TxBuffLen);
}
BYTE LPC=Lpc(TxBuff,OutputWriteP[CommNo]+2,Len+4,WriteCommBuffLen);
*(TxBuff+(OutputWriteP[CommNo]+6+Len)%WriteCommBuffLen)=LPC;
*(TxBuff+(OutputWriteP[CommNo]+7+Len)%WriteCommBuffLen)=0x16;
OutputWriteP[CommNo]=(OutputWriteP[CommNo]+Len+8)%WriteCommBuffLen;
(ChP+i)->TxReadP=(rp+Len)%(ChP+i)->TxBuffLen;
if ((ChP+i)->TxReadP==(ChP+i)->TxWriteP) (ChP+i)->TxReadP=(ChP+i)->TxWriteP=0;
GlobalUnlock(OutputCommMem[CommNo]);
}
for (i=0;i<TotalChNum;i++)
{
if ((ChP+i)->CHType!=1 || !((ChP+i)->CHValidFlag)) continue;
if ((ChP+i)->TxReadP==(ChP+i)->TxWriteP) continue;
if ((ChP+i)->TxReadP-(ChP+i)->TxWriteP==-1) {(ChP+i)->TxWriteP=(ChP+i)->TxReadP=0;continue;}
Len=((ChP+i)->TxWriteP-(ChP+i)->TxReadP+(ChP+i)->TxBuffLen)%(ChP+i)->TxBuffLen;
CommNo=(ChP+i)->SIOOrd;ChNo=(ChP+i)->ChNoInComm;
if (OutputCommMem[CommNo]==NULL) {continue;}
if (((OutputReadP[CommNo]-OutputWriteP[CommNo]+WriteCommBuffLen-1)%WriteCommBuffLen)<Len) continue;
if (OutputReadP[CommNo]!=OutputWriteP[CommNo]) continue;
txb=(ChP+i)->SendBuff;
rp=(ChP+i)->TxReadP;
TxBuff=(BYTE FAR *)GlobalLock(OutputCommMem[CommNo]);
for (ii=0;ii<Len;ii++)
{
*(TxBuff+(OutputWriteP[CommNo]+ii)%WriteCommBuffLen)=*(txb+(rp+ii)%(ChP+i)->TxBuffLen);
}
OutputWriteP[CommNo]=(OutputWriteP[CommNo]+Len)%WriteCommBuffLen;
(ChP+i)->TxReadP=(rp+Len)%(ChP+i)->TxBuffLen;
GlobalUnlock(OutputCommMem[CommNo]);
}
GlobalUnlock(hChannelParamMem);
}
/******************************************************/
BYTE Lpc(BYTE FAR *Buf,WORD Ptr,BYTE Len,WORD Mode)
{
BYTE temp=0;
for (int i=0;i<Len;i++)
{
temp ^=*(Buf+(Ptr+i)%Mode);
}
return temp^=0xff;
}
/******************************************************/
BOOL GetModemSet(BYTE ChNum)
{
ChP = (CHANNELPARAM FAR *) GlobalLock(hChannelParamMem);
if ((ChP+ChNum)->CHType!=2) {GlobalUnlock(hChannelParamMem);return 0;}
BYTE CommNo,ChNo;
GetSetCommNo=CommNo=(ChP+ChNum)->SIOOrd;
GetSetChNo=ChNo=(ChP+ChNum)->ChNoInComm;
if ((OutputReadP[CommNo]-OutputWriteP[CommNo]+WriteCommBuffLen)%WriteCommBuffLen<8) {GlobalUnlock(hChannelParamMem);return 0;}
if (OutputCommMem[CommNo]==NULL) {GlobalUnlock(hChannelParamMem);return 0;}
BYTE FAR *TxBuff=(BYTE FAR *)GlobalLock(OutputCommMem[CommNo]);
*(TxBuff+(OutputWriteP[CommNo]+0)%WriteCommBuffLen)=0xBE;
*(TxBuff+(OutputWriteP[CommNo]+1)%WriteCommBuffLen)=0x7D;
*(TxBuff+(OutputWriteP[CommNo]+2)%WriteCommBuffLen)=ChNo&1;
*(TxBuff+(OutputWriteP[CommNo]+3)%WriteCommBuffLen)=0x82;
*(TxBuff+(OutputWriteP[CommNo]+4)%WriteCommBuffLen)=(ChP+ChNum)->TczPara.ModemStatus;
*(TxBuff+(OutputWriteP[CommNo]+5)%WriteCommBuffLen)=0x00;
*(TxBuff+(OutputWriteP[CommNo]+6)%WriteCommBuffLen)=Lpc(TxBuff,OutputWriteP[CommNo]+2,4,WriteCommBuffLen);
*(TxBuff+(OutputWriteP[CommNo]+7)%WriteCommBuffLen)=0x16;
OutputWriteP[CommNo]=(OutputWriteP[CommNo]+8)%WriteCommBuffLen;
GlobalUnlock(OutputCommMem[CommNo]);
GlobalUnlock(hChannelParamMem);
return 1;
}
BOOL EnReadSelf(BYTE ChNum)
{
DiReadSelf(ChNum);
ChP = (CHANNELPARAM FAR *) GlobalLock(hChannelParamMem);
if ((ChP+ChNum)->CHType!=2) {GlobalUnlock(hChannelParamMem);return 0;}
BYTE CommNo,ChNo;
GetSetCommNo=CommNo=(ChP+ChNum)->SIOOrd;
GetSetChNo=ChNo=(ChP+ChNum)->ChNoInComm;
if ((OutputReadP[CommNo]-OutputWriteP[CommNo]+WriteCommBuffLen)%WriteCommBuffLen<8) {GlobalUnlock(hChannelParamMem);return 0;}
if (OutputCommMem[CommNo]==NULL) {GlobalUnlock(hChannelParamMem);return 0;}
BYTE FAR *TxBuff=(BYTE FAR *)GlobalLock(OutputCommMem[CommNo]);
*(TxBuff+(OutputWriteP[CommNo]+0)%WriteCommBuffLen)=0xBE;
*(TxBuff+(OutputWriteP[CommNo]+1)%WriteCommBuffLen)=0x7D;
*(TxBuff+(OutputWriteP[CommNo]+2)%WriteCommBuffLen)=ChNo&1;
*(TxBuff+(OutputWriteP[CommNo]+3)%WriteCommBuffLen)=0x83;
*(TxBuff+(OutputWriteP[CommNo]+4)%WriteCommBuffLen)=(ChP+ChNum)->TczPara.ModemStatus;
*(TxBuff+(OutputWriteP[CommNo]+5)%WriteCommBuffLen)=0x00;
*(TxBuff+(OutputWriteP[CommNo]+6)%WriteCommBuffLen)=Lpc(TxBuff,OutputWriteP[CommNo]+2,4,WriteCommBuffLen);
*(TxBuff+(OutputWriteP[CommNo]+7)%WriteCommBuffLen)=0x16;
OutputWriteP[CommNo]=(OutputWriteP[CommNo]+8)%WriteCommBuffLen;
GlobalUnlock(OutputCommMem[CommNo]);
GlobalUnlock(hChannelParamMem);
return 1;
}
BOOL DiReadSelf(BYTE ChNum)
{
ChP = (CHANNELPARAM FAR *) GlobalLock(hChannelParamMem);
if ((ChP+ChNum)->CHType!=2) {GlobalUnlock(hChannelParamMem);return 0;}
BYTE CommNo,ChNo;
GetSetCommNo=CommNo=(ChP+ChNum)->SIOOrd;
GetSetChNo=ChNo=(ChP+ChNum)->ChNoInComm;
if ((OutputReadP[CommNo]-OutputWriteP[CommNo]+WriteCommBuffLen)%WriteCommBuffLen<8) {GlobalUnlock(hChannelParamMem);return 0;}
if (OutputCommMem[CommNo]==NULL) {GlobalUnlock(hChannelParamMem);return 0;}
BYTE FAR *TxBuff=(BYTE FAR *)GlobalLock(OutputCommMem[CommNo]);
*(TxBuff+(OutputWriteP[CommNo]+0)%WriteCommBuffLen)=0xBE;
*(TxBuff+(OutputWriteP[CommNo]+1)%WriteCommBuffLen)=0x7D;
*(TxBuff+(OutputWriteP[CommNo]+2)%WriteCommBuffLen)=ChNo&1;
*(TxBuff+(OutputWriteP[CommNo]+3)%WriteCommBuffLen)=0x84;
*(TxBuff+(OutputWriteP[CommNo]+4)%WriteCommBuffLen)=(ChP+ChNum)->TczPara.ModemStatus;
*(TxBuff+(OutputWriteP[CommNo]+5)%WriteCommBuffLen)=0x00;
*(TxBuff+(OutputWriteP[CommNo]+6)%WriteCommBuffLen)=Lpc(TxBuff,OutputWriteP[CommNo]+2,4,WriteCommBuffLen);
*(TxBuff+(OutputWriteP[CommNo]+7)%WriteCommBuffLen)=0x16;
OutputWriteP[CommNo]=(OutputWriteP[CommNo]+8)%WriteCommBuffLen;
GlobalUnlock(OutputCommMem[CommNo]);
GlobalUnlock(hChannelParamMem);
return 1;
}
BOOL InitOneComm(BYTE CommNo)
{
char *baud[]={"150","300","600","1200","2400","4800","9600","19200","38400"};
char Buf[200];
int err;
if (idComDev[CommNo]>=0) CloseComm(idComDev[CommNo]);
if (idComDev[CommNo]!=-10) idComDev[CommNo]=-1;
CommCount[CommNo]=0;
if (InputCommMem[CommNo]) GlobalFree(InputCommMem[CommNo]);
if (OutputCommMem[CommNo]) GlobalFree(OutputCommMem[CommNo]);
InputCommMem[CommNo]=OutputCommMem[CommNo]=NULL;
InputReadP[CommNo]=InputWriteP[CommNo]=OutputReadP[CommNo]=OutputWriteP[CommNo]=0;
if (CommPara[CommNo-1].Used==0) return 0;
wsprintf (Buf,"COM%d:",CommNo);
err=idComDev[CommNo]= OpenComm(Buf, 512, 256);
if (err==-10) CommPara[CommNo-1].Used=0; //如果该口已经被系统或其他程序占用则不用。
if (err<0)
{
wsprintf((LPSTR)Buf,"打开串行口%d错,err=%d 错误代码=-2:已经打开,错误代码=-10:该口已经被系统占用!",CommNo,err);
MessageBox( NULL, (LPSTR)Buf,(LPSTR)"串行通信提示", MB_OK) ;
return FALSE;
}
lstrcat(Buf, baud[CommPara[CommNo-1].COMMBAUD]);
lstrcat(Buf, ",n");
lstrcat(Buf, ",8");
lstrcat(Buf, ",1");
err=BuildCommDCB(Buf, &dcb);
lstrcat(Buf, " 创建DCB错!");
if (err<0)
{
MessageBox( GetFocus(), (LPSTR)Buf,(LPSTR)"串行通信提示" ,MB_OK) ;
return FALSE;
}
dcb.fDtrDisable=0;
dcb.fRtsDisable=0;
dcb.fOutxCtsFlow=0;
dcb.fOutxDsrFlow=0; //
dcb.fRtsflow =0;
dcb.fDtrflow = 0;
dcb.fOutX=0;
dcb.fInX=0;
err=SetCommState((DCB far *)&dcb);
if (err<0)
{
CloseComm(idComDev[CommNo]) ;
idComDev[CommNo] = -1;
wsprintf((LPSTR)Buf,"设置串行口状态错,err=%x", err);
MessageBox( GetFocus(), (LPSTR)Buf,(LPSTR)"串行通信提示", MB_OK);
return FALSE;
}
FlushComm(idComDev[CommNo], 0); // 清空发送队列
FlushComm(idComDev[CommNo], 1); // 清空接收队列
InputCommMem[CommNo] = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_SHARE|GMEM_ZEROINIT, ReadCommBuffLen);
OutputCommMem[CommNo] = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_SHARE|GMEM_ZEROINIT, WriteCommBuffLen);
return 1;
}
//根据串行口号码计算出通道号
BYTE CalChNum(BYTE CommNo)
{
for (BYTE i=0;i<TotalChNum;i++)
{
if ((ChP+i)->SIOOrd==CommNo) return i;
}
return 0xff;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?