📄 tcomm.cpp
字号:
//---------------------------------------------------------------------------
#include <basepch.h>
#pragma hdrstop
#include "TComm.h"
#pragma resource "*.res"
#pragma package(smart_init)
//---------------------------------------------------------------------------
// 张磊 TComm 控件
// Copyright (c) 张磊 . All Rights Reserved.
//
// 版本 日期 更新内容
// V1.0.0 2007.8.20 初版串口控件完成
//---------------------------------------------------------------------------
//Start of TTComm
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// TTComm::构造函数,继承自TComponent
//
//
//---------------------------------------------------------------------------
__fastcall TTComm::TTComm(TComponent* Owner)
: TComponent(Owner)
{
//建立发送及接受线程
ReadThread = new TReadThread(true);
WriteThread = new TWriteThread(true);
//建立异常处理
//ECommError = new Exception();
FCommPort = "COM1";
FBaudRate = 9600;
FByteSize = Bit8;
FParity = None;
FStopBits = Bit1;
FPortOpen = false;
FHandShaking = comNone;
FRtsControl = RtsEnable;
FDtrControl = DtrEnable;
FDTREnable = true;
FRTSEnable = true;
FXonLim = 2048;
FXoffLim = 512;
FParityReplace = 0;
FXonChar = 0x11;
FXoffChar = 0x13;
if (!ComponentState.Contains(csDesigning))
FHWnd = AllocateHWnd(CommWndProc);
lpCommData = NULL;
}
//---------------------------------------------------------------------------
// ~TTComm::析构函数,释放建立的线程
//
//
//---------------------------------------------------------------------------
__fastcall TTComm::~TTComm(void)
{
//先关闭串口
if(FPortOpen)
FSetPortOpen(false);
//删除发送接收线程
ReadThread->Terminate();
WriteThread->Terminate();
delete ReadThread;
delete WriteThread;
if (!ComponentState.Contains(csDesigning))
DeallocateHWnd(FHWnd);
}
//---------------------------------------------------------------------------
// FSetPortOpen::PortOpen属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetPortOpen(bool IsPortOpen)
{
if (IsPortOpen^FPortOpen)
{
if (IsPortOpen)//打开端口
{
HANDLE hNewComm;
hNewComm = CreateFile(FCommPort.c_str(),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,0);
if (hNewComm != INVALID_HANDLE_VALUE)
{
if (GetFileType(hNewComm) == FILE_TYPE_CHAR)
{
if (SetupComm( hNewComm, 4096, 4096 ))
{
//打开的端口没有问题
hComm = hNewComm;
//清除缓冲区内的数据
PurgeComm( hComm, PURGE_TXABORT | PURGE_RXABORT |PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
//建立发送监听事件
sendEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
okEvent = CreateEvent(NULL,FALSE,FALSE,NULL);
//设置串口参数
SetProperty();
//打开发送及接收线程
ReadThread->Resume();
WriteThread->Resume();
//置串口开关标记位为开
FPortOpen = true;
}
else{
CloseHandle( hNewComm );
throw Exception("Cannot setup comm buffer");
}
}
else {
CloseHandle( hNewComm );
throw Exception("File handle is not a comm handle");
}
}
else {
throw Exception("Error opening serial port");
}
}
else //关闭端口
{
if (hComm != 0)
{
if (ReadThread->QueueIsNULL() && WriteThread->QueueIsNULL())
{
//关闭发送监听事件
CloseHandle(sendEvent);
CloseHandle(okEvent);
//关闭发送、接收线程
ReadThread->Suspend();
WriteThread->Suspend();
//关闭串口
CloseHandle( hComm );
hComm = 0;
//置串口开关标记位为关
FPortOpen = false;
}
else
{
int result = MessageBox(NULL,"发送接收队列不为空,是否继续关闭串口并清空队列?","提示",MB_YESNOCANCEL |MB_ICONWARNING|MB_DEFBUTTON2|MB_SYSTEMMODAL);
if ( result == 6)
{
ReadThread->FClearQueue();
WriteThread->FClearQueue();
//关闭发送监听事件
CloseHandle(sendEvent);
CloseHandle(okEvent);
//关闭发送、接收线程
ReadThread->Suspend();
WriteThread->Suspend();
//关闭串口
CloseHandle( hComm );
hComm = 0;
//置串口开关标记位为关
FPortOpen = false;
}
else if (result == 2)
{
//关闭发送监听事件
CloseHandle(sendEvent);
CloseHandle(okEvent);
//关闭发送、接收线程
ReadThread->Suspend();
WriteThread->Suspend();
//关闭串口
CloseHandle( hComm );
hComm = 0;
//置串口开关标记位为关
FPortOpen = false;
}
}
}
}
}
else {
throw Exception("serial port is opened or closed");
}
}
//---------------------------------------------------------------------------
// SetProperty::串口属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::SetProperty(void)
{
TDCB dcb;
GetCommState( hComm, &dcb );
//设置波特率
dcb.BaudRate = FBaudRate;
//设置fBinary
dcb.fBinary = 1; //Enable fBinary
//设置是否校验检查
dcb.fParity = FSettings.Contains(ParityCheck);
//设置CTS输出流量控制
dcb.fOutxCtsFlow = FSettings.Contains(OutxCtsFlow);
//设置DSR输出流量控制
dcb.fOutxDsrFlow = FSettings.Contains(OutxDsrFlow);
//DTR流量控制类型
switch (FDtrControl)
{
case DtrDisable: dcb.fDtrControl = 0;break;
case DtrEnable: dcb.fDtrControl = 1;break;
case DtrHandshake: dcb.fDtrControl = 2;break;
}
//DSR安全设置
dcb.fDsrSensitivity = FSettings.Contains(DsrSensitivity);
//XOFF持续TX
dcb.fTXContinueOnXoff = FSettings.Contains(TxContinueOnXoff);
//XON/XOFF输出流量控制
dcb.fOutX = FSettings.Contains(OutxXonXoffFlow);
//XON/XOFF输入流量控制
dcb.fInX = FSettings.Contains(InxXonXoffFlow);
//激活错误替换机制
dcb.ErrorChar = FSettings.Contains(IsParityReplace);
//允许舍弃空
dcb.fNull = FSettings.Contains(IgnoreNullChar);
//RTS流量控制
switch (FRtsControl)
{
case RtsDisable: dcb.fRtsControl = 0;break;
case RtsEnable: dcb.fRtsControl = 1;break;
case RtsHandshake: dcb.fRtsControl = 2;break;
case RtsToggle: dcb.fRtsControl = 3;break;
}
//有错误时放弃读/写
dcb.fAbortOnError = FSettings.Contains(AbortOnError);
//设置ByteSize
dcb.ByteSize = FByteSize + 5;
//设置Parity
dcb.Parity = FParity;
//设置StopBits
dcb.StopBits = FStopBits;
//设置XonLim
dcb.XonLim = FXonLim;
//设置XoffLim
dcb.XoffLim = FXoffLim;
//设置errorchar
dcb.ErrorChar = FParityReplace;
//设置XonChar
dcb.XonChar = FXonChar;
//设置
dcb.XoffChar = FXoffChar;
//执行设置操作
SetCommState( hComm, &dcb );
}
//---------------------------------------------------------------------------
// FSetBaudRate::S属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetBaudRate(unsigned NewBaudRate)
{
if (NewBaudRate == FBaudRate)
return;
FBaudRate = NewBaudRate;
if (hComm != 0)
SetProperty();
}
//---------------------------------------------------------------------------
// FSetParity::Parity属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetParity(TParity NewParity)
{
if (NewParity == FParity)
return;
FParity = NewParity;
if (hComm != 0)
SetProperty();
}
//---------------------------------------------------------------------------
// FSetStopBits::StopBits属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetStopBits(TStopBits NewStopBits)
{
if (NewStopBits == FStopBits)
return;
FStopBits = NewStopBits;
if (hComm != 0)
SetProperty();
}
//---------------------------------------------------------------------------
// FSetByteSize::ByteSize属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetByteSize(TByteSize NewByteSize)
{
if (NewByteSize == FByteSize)
return;
FByteSize = NewByteSize;
if (hComm != 0)
SetProperty();
}
//---------------------------------------------------------------------------
// FSetSetting::Setting属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetSettings(TSettings NewSettings)
{
FSettings = NewSettings;
if (hComm !=0)
SetProperty();
}
//---------------------------------------------------------------------------
// FSetHandShaking::HandShaking属性设置方法
//
//
//---------------------------------------------------------------------------
void __fastcall TTComm::FSetHandShaking(THandShaking NewHandShaking)
{
if (NewHandShaking == FHandShaking)
return;
FHandShaking = NewHandShaking;
switch (NewHandShaking)
{
case comNone:
FRtsControl = RtsEnable;
FDtrControl = DtrEnable;
FSettings>>OutxCtsFlow>>OutxDsrFlow>>OutxXonXoffFlow>>InxXonXoffFlow;
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -