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 + -
显示快捷键?