comm.cpp
来自「这是一个在正实际应用当中运行的电力监控系统软件源代码」· C++ 代码 · 共 682 行 · 第 1/2 页
CPP
682 行
#include <windowsx.h>
#include <windows.h>
#include <owl.h>
#include <stdio.h>
#include <string.h>
#include <mem.h>
#include <stdlib.h>
#include "cmdefs.h"
#include "comm.h"
#include "db.h"
#include "dbfile.h"
#include "def.h"
#include "wincomm.h"
#define ReadCommBuffLen 2048
#define WriteCommBuffLen 2048
HGLOBAL InputCommMem[80],OutputCommMem[80];
WORD InputReadP[80],InputWriteP[80],OutputReadP[80],OutputWriteP[80];
CHANNELPARAM FAR *ChP;
extern HGLOBAL hChannelParamMem;
extern int idComDev[80];
extern WORD Freq;
DWORD CommCount[80];
DCB dcb;
extern TSystemCfg *syscfg;
extern COMMPARA CommPara [80];
extern WORD TotalChNum;
extern BYTE GetSetFlag;
extern BYTE Radio;
extern BYTE NetTestFlag,NetTestCount;
extern BYTE huge ThisNodeName, MainFertName;
BYTE Lpc(BYTE FAR *Buf,WORD Ptr,BYTE Len,WORD Mode);
BOOL InitAllComm();
BOOL InitOneComm(BYTE);
BOOL InitAllModem();
BOOL InitOneModem(BYTE);
BOOL GetModemSet(BYTE);
BYTE GetSetCommNo;
BYTE GetSetChNo;
BOOL EnReadSelf(BYTE);
BOOL DiReadSelf(BYTE);
BYTE CalChNum(BYTE CommNo);
TCommWindow :: TCommWindow(PTWindowsObject AParent)
: TWindow(AParent, "")
{
Attr.Style = WS_POPUP|WS_MINIMIZE;
// cominf = &CommInf[comno];
CommIsOpen = FALSE;
BreakTimes = 0;
}
//----------------------------------------------------------------------//
//析构函数
TCommWindow :: ~TCommWindow()
{
KillTimer (HWindow, 1);
KillTimer (HWindow, 2);
KillTimer (HWindow, 3);
int Cards=syscfg->GetCommCardNums();
for (int i=1;i<=Cards*8+2;i++)
{
if (CommPara[i-1].Used==1 && idComDev[i]>=0)
{
CloseComm(idComDev[i]);
FlushComm(idComDev[i], 0);
FlushComm(idComDev[i], 1);
}
if (InputCommMem[i]) GlobalFree(InputCommMem[i]);
if (OutputCommMem[i]) GlobalFree(OutputCommMem[i]);
}
}
//----------------------------------------------------------------------//
void TCommWindow::SetupWindow ()
{
TWindow::SetupWindow ();
/*
for (int i=0;i<80;i++)
EnableCommNotification(idComDev[i], HWindow, 10, 1);
*/
if (!SetTimer (HWindow, 1, 5000U, NULL))
MessageBox (HWindow, "计时器太多!", "串行通信窗口提示",
MB_ICONEXCLAMATION | MB_OK);
if (!SetTimer (HWindow, 2, 100U, NULL))
MessageBox (HWindow, "计时器太多!", "串行通信窗口提示",
MB_ICONEXCLAMATION | MB_OK);
if (!SetTimer (HWindow, 3, 3U, NULL))
MessageBox (HWindow, "计时器太多!", "串行通信窗口提示",
MB_ICONEXCLAMATION | MB_OK);
}
//----------------------------------------------------------------------//
void TCommWindow::WMTimer(RTMessage Msg)
{
switch (Msg.WParam)
{
case 1:
WMCommReadWrite();
break;
case 2:
WriteCommProc();
ReadCommProc();
break;
case 3:
WMCommReadWrite();
break;
default: break;
}
}
int TCommWindow::WMCommReadWrite()
{
int Cards=syscfg->GetCommCardNums();
int i,ii,Len;
COMSTAT comstat;
BYTE FAR *RecBuff;
BYTE FAR *TransBuff;
BYTE Buf[10];
for (i=1;i<=Cards*8+2;i++)
{
if (CommPara[i-1].Used==0) continue;
CommCount[i]++;
if (InputCommMem[i]==NULL || OutputCommMem[i]==NULL || idComDev[i]<0) {continue;}
RecBuff=(BYTE FAR *)GlobalLock(InputCommMem[i]);
TransBuff=(BYTE FAR *)GlobalLock(OutputCommMem[i]);
int ERR=GetCommError(idComDev[i], &comstat);
if (ERR<0) {CommCount[i]=8888;}
Len=comstat.cbInQue;
if ((Len>0 && (InputWriteP[i]+1)%ReadCommBuffLen)!=InputReadP[i])
{
for (ii=0; ii<Len; ii++)
{
if (((InputWriteP[i]+1)%ReadCommBuffLen)!=InputReadP[i])
{
if (ReadComm(idComDev[i], &Buf[0], 1)>0)
{
*(RecBuff+InputWriteP[i])=Buf[0];
InputWriteP[i] = (++InputWriteP[i])%ReadCommBuffLen;
CommCount[i]=0;
}
}
//else {MessageBeep(0);
// MessageBox(0,"","",MB_OK);
// break;}
}
}
if (comstat.cbOutQue==0 && (OutputWriteP[i]-OutputReadP[i])!=0)
{
Len=(OutputWriteP[i]-OutputReadP[i]+WriteCommBuffLen)%WriteCommBuffLen;
int len;
if (Len!=0)
{
len=WriteComm (idComDev[i],TransBuff+OutputReadP[i],Len);
OutputWriteP[i]=(OutputWriteP[i]+len)%WriteCommBuffLen;
if (len==Len) {OutputReadP[i]=OutputWriteP[i]=0;}
}
}
GlobalUnlock(InputCommMem[i]);
GlobalUnlock(OutputCommMem[i]);
}
return 1;
}
//----------------------------------------------------------------------//
int TCommWindow::WMCommNotify(RTMessage Msg)
{return 0;
COMSTAT commstat;
int Cards=syscfg->GetCommCardNums();
int i,ii,Len;
COMSTAT comstat;
BYTE FAR *RecBuff;
BYTE FAR *TransBuff;
BYTE Buf[10];
for (i=1;i<=Cards*8+2;i++)
{
CommCount[i]++;
if (CommPara[i-1].Used==0) continue;
if (InputCommMem[i]==NULL || OutputCommMem[i]==NULL || idComDev[i]<0){continue;}
RecBuff=(BYTE FAR *)GlobalLock(InputCommMem[i]);
TransBuff=(BYTE FAR *)GlobalLock(OutputCommMem[i]);
int ERR=GetCommError(idComDev[i], &comstat);
if (ERR<0) {CommCount[i]=8000;}
Len=comstat.cbInQue;
if ((Len>0 && (InputWriteP[i]+1)%ReadCommBuffLen)!=InputReadP[i])
{
for (ii=0; ii<Len; ii++)
{
if (((InputWriteP[i]+1)%ReadCommBuffLen)!=InputReadP[i])
{
if (ReadComm(idComDev[i], &Buf[0], 1)>0)
{
*(RecBuff+InputWriteP[i])=Buf[0];
InputWriteP[i] = (++InputWriteP[i])%ReadCommBuffLen;
CommCount[i]=0;
}
}
}
}
if (comstat.cbOutQue==0 && OutputWriteP[i]-OutputReadP[i]!=0)
{
Len=OutputWriteP[i]-OutputReadP[i];
int len;
if (Len!=0)
{
len=WriteComm (idComDev[i],TransBuff+OutputReadP[i],Len);
OutputWriteP[i]=(OutputWriteP[i]+len)%WriteCommBuffLen;
if (len==Len) {OutputReadP[i]=OutputWriteP[i]=0;}
}
}
GlobalUnlock(InputCommMem[i]);
GlobalUnlock(OutputCommMem[i]);
}
return 1;
}
/******************************************************/
/******************************************************/
BOOL InitAllComm ()
{
int Cards=syscfg->GetCommCardNums();
int i;
ChP = (CHANNELPARAM FAR *) GlobalLock(hChannelParamMem);
for (i=0;i<TotalChNum;i++) (ChP+i)->TczPara.ModemStatus=1;
GlobalUnlock(hChannelParamMem);
char *baud[]={"150","300","600","1200","2400","4800","9600","19200","38400"};
char Buf[200];
int err;
for (i=1;i<80;i++) idComDev[i]=-8; //初始化
for (i=1;i<=Cards*8+2;i++)
{
idComDev[i]=-1;
CommCount[i]=0;
InputCommMem[i]=OutputCommMem[i]=NULL;
InputReadP[i]=InputWriteP[i]=OutputReadP[i]=OutputWriteP[i]=0;
if (CommPara[i-1].Used==0) continue;
wsprintf (Buf,"COM%d:",i);
err=idComDev[i]= OpenComm(Buf, 512, 256);
if (err==-10) CommPara[i-1].Used=0; //如果该口已经被系统或其他程序占用则不用。
if (err<0)
{
wsprintf((LPSTR)Buf,"打开串行口%d错,err=%d 错误代码=-2:已经打开,错误代码=-10:该口已经被系统占用!", i,err);
MessageBox( NULL, (LPSTR)Buf,(LPSTR)"串行通信提示", MB_OK) ;
continue;
}
lstrcat(Buf, baud[CommPara[i-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) ;
continue;
// 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[i]) ;
idComDev[i] = -1;
wsprintf((LPSTR)Buf,"设置串行口状态错,err=%x", err);
MessageBox( GetFocus(), (LPSTR)Buf,(LPSTR)"串行通信提示", MB_OK);
continue;
//return FALSE;
}
FlushComm(idComDev[i], 0); // 清空发送队列
FlushComm(idComDev[i], 1); // 清空接收队列
InputCommMem[i] = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_SHARE|GMEM_ZEROINIT, ReadCommBuffLen);
OutputCommMem[i] = GlobalAlloc (GMEM_NODISCARD|GMEM_MOVEABLE|GMEM_SHARE|GMEM_ZEROINIT, WriteCommBuffLen);
}
return TRUE;
}
/******************************************************/
/******************************************************/
//发参数
BOOL InitAllModem()
{
int CommNum,i,ii;
BYTE far *TxBuff;
CommNum=syscfg->GetCommCardNums();
ChP = (CHANNELPARAM FAR *) GlobalLock(hChannelParamMem);
for (i=1;i<CommNum*8+1+2;i++)
{
if (CommPara[i-1].Used==0) continue;
OutputWriteP[i]=OutputReadP[i]=0;
if (OutputCommMem[i]==NULL) continue;
if ( CalChNum(i)==0xff || (ChP+CalChNum(i))->CHType!=2) continue;
for (ii=0;ii<2;ii++)
{
TxBuff=(BYTE FAR *)GlobalLock(OutputCommMem[i]);
*(TxBuff+OutputWriteP[i])=0xBE;
*(TxBuff+OutputWriteP[i]+1)=0x7D;
*(TxBuff+OutputWriteP[i]+2)=ii&1;
*(TxBuff+OutputWriteP[i]+3)=0x81;
if (ii==0) *(TxBuff+OutputWriteP[i]+4)=(ChP+CommPara[i-1].CHANEL1)->TczPara.ModemStatus;
else *(TxBuff+OutputWriteP[i]+4)=(ChP+CommPara[i-1].CHANEL2)->TczPara.ModemStatus;
*(TxBuff+OutputWriteP[i]+5)=sizeof(COMMPARAMESSAGE)-1;
COMMPARAMESSAGE *TEMP;
TEMP=(COMMPARAMESSAGE *)(TxBuff+(OutputWriteP[i]+6)%WriteCommBuffLen);
if (ii==0) *TEMP=(ChP+CommPara[i-1].CHANEL1)->TczPara;
else *TEMP=(ChP+CommPara[i-1].CHANEL2)->TczPara;
*(TxBuff+OutputWriteP[i]+sizeof(COMMPARAMESSAGE)+5)=
Lpc(TxBuff,OutputWriteP[i]+2,sizeof(COMMPARAMESSAGE)+3,WriteCommBuffLen);
*(TxBuff+OutputWriteP[i]+sizeof(COMMPARAMESSAGE)+6)=0x16;
OutputWriteP[i]=(OutputWriteP[i]+sizeof(COMMPARAMESSAGE)+7)%WriteCommBuffLen;
GlobalUnlock(OutputCommMem[i]);
}
}
GlobalUnlock(hChannelParamMem);
for (i=0;i<TotalChNum;i++)
{
DiReadSelf(i);
}
return 0;
}
/*******************************************************/
/******************************************************/
//初始化单路Modem
BOOL InitOneModem(BYTE ChNum)
{
ChP = (CHANNELPARAM FAR *) GlobalLock(hChannelParamMem);
if ((ChP+ChNum)->CHType!=2) {GlobalUnlock(hChannelParamMem);return 0;}
BYTE CommNo=(ChP+ChNum)->SIOOrd;
BYTE ChNo=(ChP+ChNum)->ChNoInComm;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?