⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unitcomm.cpp

📁 基于MD110程控交换机的计费程序,使用C++Builder开发
💻 CPP
字号:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "UnitMain.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
__fastcall SCommunication::SCommunication()
{
}
//---------------------------------------------------------------------------
__fastcall SCommunication::~SCommunication()
{
}
//---------------------------------------------------------------------------
bool __fastcall SCommunication::ComInitialization()
{
DCB dcb;
BOOL fSuccess;
COMMTIMEOUTS CommTimeOuts;
int BaudRateP,ByteSizeP,ParityP,StopBitsP;
AnsiString CommPort=FormMain->GetCommParameter(&BaudRateP,&ByteSizeP,&ParityP,&StopBitsP);

hCom = CreateFile(CommPort.c_str(),
    GENERIC_READ | GENERIC_WRITE,
    0,    //必须以opened w/exclusive-access
    NULL, //无安全属性
    OPEN_EXISTING, //必须用OPEN_EXISTING
    FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,  //重叠I/O
    NULL  //对通信设备必须是NULL
    );
if (hCom == INVALID_HANDLE_VALUE) {
//    dwError = GetLastError();
    MessageBox(NULL,"打开通信设备文件失败!","错误",MB_OK);
    return false;
}

   SetupComm(hCom,4096,4096);      // 设置输入,输出缓冲区皆为4096字节

fSuccess = GetCommState(hCom, &dcb);
if (!fSuccess) {
    MessageBox(NULL,"获取通信设备控制块数据结构操作异常!","错误",MB_OK);

    return false;
}

// 填充DCB: baud=9600, 8 data bits, no parity, 1 stop bit.

    dcb.BaudRate = BaudRateP;
    dcb.ByteSize = ByteSizeP;
    dcb.Parity = ParityP;
    dcb.StopBits = StopBitsP;
    dcb.fDtrControl = DTR_CONTROL_ENABLE;

    dcb.fInX =  TRUE;             //允许输入(接收)Xon/Xoff流量控制
    dcb.fOutX =  TRUE;            //允许输出(发送)Xon/Xoff流量控制
    dcb.XonLim =  BLOCK_LENGTH/4; //接收时发出Xon时的门限值
    dcb.XoffLim =  BLOCK_LENGTH/4;//接收时发出Xoff时的门限值

    //用改变后的控制(配置)块数据结构设置串行口
    fSuccess = SetCommState(hCom, &dcb);
    if (!fSuccess) {
        MessageBox(NULL,"设置通信设备控制块数据结构操作异常!","错误",MB_OK);
        return false;
    }

   	CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
	CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
	CommTimeOuts.ReadTotalTimeoutConstant = 0;
	CommTimeOuts.WriteTotalTimeoutMultiplier = 0;
	CommTimeOuts.WriteTotalTimeoutConstant = 5000;

	SetCommTimeouts(hCom, &CommTimeOuts);
    if(!SetCommMask(hCom, EV_RXCHAR))
    {
        MessageBox(NULL,"设置通信设备超时数据结构操作异常!","错误",MB_OK);
        return false;
    }

   	memset(&osRead, 0, sizeof(OVERLAPPED));
   	memset(&osWrite, 0, sizeof(OVERLAPPED));
   	osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
   	osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);

    BufferOffset=0;
    LineBytes=0;
    return true;

}

DWORD __fastcall SCommunication::ReadCommBlock(LPSTR lpBlock,DWORD nMaxLength)
{
BOOL fReadStat;
COMSTAT ComStat;
DWORD dwErrorFlages,dwLength;
ClearCommError(hCom,&dwErrorFlages,&ComStat);
dwLength=(((DWORD)nMaxLength<ComStat.cbInQue)?(DWORD)nMaxLength:ComStat.cbInQue);
  if(dwLength>0)
  {
    fReadStat=ReadFile(hCom,lpBlock,dwLength,
            &dwLength,&osRead);
    if(!fReadStat)
    {
        if(GetLastError()==ERROR_IO_PENDING)
        {
            if(WaitForSingleObject(osRead.hEvent,1000))
                    dwLength=0;
            else
            {
                GetOverlappedResult(hCom,&osRead,&dwLength,FALSE);
                osRead.Offset+=dwLength;
            }
        }
        else dwLength=0;
    }
  }
  return dwLength;
}

BOOL  __fastcall SCommunication::WriteCommBlock(LPSTR lpBlock,DWORD nMaxLength)
{
    BOOL fWriteStat;
	DWORD dwLineBytesWritten;
    if(nMaxLength==0)return false;
    for(DWORD i=0;i<nMaxLength;i++)
    {
	    fWriteStat = WriteFile(hCom, lpBlock+i, 1, &dwLineBytesWritten, &osWrite);
	    if (!fWriteStat && (GetLastError() == ERROR_IO_PENDING))
	    {
	    	if (WaitForSingleObject(osWrite.hEvent, 1000)) dwLineBytesWritten = 0;
		    else
		    {
	    		GetOverlappedResult(hCom, &osWrite, &dwLineBytesWritten, FALSE);
		    	osWrite.Offset += dwLineBytesWritten;
		    }
	    }
    }
    return TRUE;
}

void __fastcall SCommunication::ReadCommToBuffer(void)
{
    DWORD nLength,i,j;
    do
    {
        if((nLength=ReadCommBlock((LPSTR)(Buffer+BufferOffset),BLOCK_LENGTH))>0)
        {
            BufferOffset+=nLength;
        }
    }
    while(nLength>0);

    j=BufferOffset-LineBytes;
    for(i=0;i<j;i++)
    {
        if(*(Buffer+LineBytes)==0x0a||LineBytes==LINE_LENGTH)
        {
            *(Buffer+LineBytes-1)=0;
            CallTichetSubmit();
            LineBytes++;
            BufferOffset-=LineBytes;
            if(BufferOffset)
                memmove(Buffer,Buffer+LineBytes,BufferOffset);
            LineBytes=0;
        }
        else LineBytes++;
    }
}

void __fastcall SCommunication::CallTichetSubmit(void)
{
    FormMain->Memo1->Lines->Add(AnsiString((char*)Buffer));
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -