📄 unitcomm.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 + -