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

📄 tcomm.cpp

📁 个人早期编写的支持wavecom modem的串口短信控件
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//---------------------------------------------------------------------------
#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 + -