串口通讯的串口类模块.doc_第1页
串口通讯的串口类模块.doc_第2页
串口通讯的串口类模块.doc_第3页
串口通讯的串口类模块.doc_第4页
串口通讯的串口类模块.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

本模块开发平台BCB,用于串口通讯的串口类模块,不需要使用系统或第三方带的串口Com组件,不需要注册,直接加入到软件声明中即可使用。Comm.h /头文件声明/-#ifndef CommH#define CommH/-#include #include #include #include #include #include /类型定义 enum TBaudRate br110=110, br300=300, br600=600, br1200=1200, br2400=2400, br4800=4800, br9600=9600, br14400=14400, br19200=19200, br38400=38400, br56000=56000, br57600=57600, br115200=115200; enum TComPortNumber pnCOM1, pnCOM2, pnCOM3, pnCOM4, pnCOM5, pnCOM6, pnCOM7, pnCOM8, pnCOM9, pnCOM10, pnCOM11, pnCOM12, pnCOM13, pnCOM14, pnCOM15, pnCOM16; enum TParity None, Odd, Even, Mark, Space ; enum TStopBits SB1, SB1_5, SB2 ; enum TDataBits DB5, DB6, DB7, DB8 ; enum THwHandShakinghhNone,hhNoneRTSON,hhRTSCTS; enum TSwHandShakingshNone,shXonXoff; / 输入缓冲区的默认大小 const long INPUTBUFFERSIZE = 4096; / Line Status位定义 const int ME_CTS = 1; const int ME_DSR = 2; const int ME_RING = 4; const int ME_RLSD = 8; /DCB 位定义 const long dcb_Binary = 0x00000001; const long dcb_ParityCheck = 0x00000002; const long dcb_OutxCtsFlow = 0x00000004; const long dcb_OutxDsrFlow = 0x00000008; const long dcb_DtrControlMask = 0x00000030; const long dcb_DtrControlDisable = 0x00000000; const long dcb_DtrControlEnable = 0x00000010; const long dcb_DtrControlHandshake = 0x00000020; const long dcb_DsrSensivity = 0x00000040; const long dcb_TXContinueOnXoff = 0x00000080; const long dcb_OutX = 0x00000100; const long dcb_InX = 0x00000200; const long dcb_ErrorChar = 0x00000400; const long dcb_NullStrip = 0x00000800; const long dcb_RtsControlMask = 0x00003000; const long dcb_RtsControlDisable = 0x00000000; const long dcb_RtsControlEnable = 0x00001000; const long dcb_RtsControlHandShake = 0x00002000; const long dcb_RtsControlToggle = 0x00003000; const long dcb_AbortOnError = 0x00004000; const long dcb_Reserveds = 0xFFFF8000; /事件函数定位器声明 typedef void _fastcall (_closure *TReceiveDataEvent)(System:TObject *Sender); typedef void _fastcall (_closure *TReceiveErrorEvent)(System:TObject *Sender, DWORD EventMask); typedef void _fastcall (_closure *TModemStateChangeEvent)(System:TObject *Sender, DWORD ModemEvent);/-class PACKAGE TComm : public TComponent private: TTimer *CommTimer; /组件用的定时器 char szInputBufferINPUTBUFFERSIZE; HANDLE hComm; TComPortNumber FCommPort; bool FPortOpen; TBaudRate FBaudRate; bool FParityCheck; THwHandShaking FHwHandShaking; TSwHandShaking FSwHandShaking; TDataBits FDataBits; TParity FParity; TStopBits FStopBits; int FInputLen; /每次执行Input时所读取的字符串长度 int FRThreshold; /设置引发接收事件的门坎 bool FDTR; bool FRTS; String FInputData; DynamicArray FInputByteData;/ FInputByteData: array of Byte; int FCommEvent; int FCommError; bool FCDHolding; bool FCTSHolding; bool FDSRHolding; bool FRIHolding; /设置函数 void _fastcall SetCommPort(TComPortNumber Port); /设置COMPort void _fastcall SetBaudRate(TBaudRate Rate); /设置速率 void _fastcall SetHwHandShaking(THwHandShaking c ); /硬件交握 void _fastcall SetSwHandShaking(TSwHandShaking c ); /软件交握 THwHandShaking _fastcall GetHwHandShaking(void); /硬件交握 TSwHandShaking _fastcall GetSwHandShaking(void); /软件交握 void _fastcall SetDataBits(TDataBits Size); /数据位数 void _fastcall SetParity(TParity p); /奇偶校验 void _fastcall SetStopBits(TStopBits Bits); /停止位 void _fastcall SetInDataCount(DWORD StrNo); /设成0表示清除FInputData void _fastcall SetRThreshold(int RTNo); /接收门坎 void _fastcall SetPortOpen(bool b); /打开通信端口 void _SetCommState(void); /设置通信参数 bool _fastcall GetRTSStatus(); bool _fastcall GetDTRStatus(); void _fastcall SetDTRStatus(bool b); /DTR 状态 void _fastcall SetRTSStatus(bool b); /RTS状态 void _fastcall ReadProcess(void); /读取数据函数 void _fastcall EventProcess(void); /事件检测函数 void _fastcall GetModemState(void); /线路状态检测函数 void OpenComm(void); /打开通讯端口函数 void _fastcall CloseComm(void); /开关通信端口函数 int _fastcall ReadCommEvent(void); /硬件线路状态值读取 int _fastcall ReadCommError(void); /错误状态值的读取 String _fastcall ReadInputData(void); /返回收到的数据 int _fastcall ReadInDataCount(void); /读取有多少数据 bool _fastcall ReadCDHolding(void); /取得CD线路状态 bool _fastcall ReadDSRHolding(void); /取得DSR线路状态 bool _fastcall ReadRIHolding(void); /取得RI线路状态 bool _fastcall ReadCTSHolding(void); /取得CTS线路状态 /事件 TReceiveDataEvent FOnReceiveData; TReceiveErrorEvent FOnReceiveError; TModemStateChangeEvent FOnModemStateChange; protected: void _fastcall ProcTimer(TObject *Sender); void _fastcall ReceiveData(void); void _fastcall ReceiveError(DWORD EvtMask); void _fastcall ModemStateChange(DWORD ModemEvent); public: _fastcall TComm(TComponent* Owner); /构造函数 bool OutputString(String DataToWrite); bool OutputByte(const DynamicArray ByteData); DynamicArray ReadInputByte(void); _property bool PortOpen =read = FPortOpen, write=SetPortOpen,default=false; _property DWORD DataCount = read = ReadInDataCount , write = SetInDataCount; _property bool DTREnabled = read = GetDTRStatus, write = SetDTRStatus; _property bool RTSEnabled = read = GetRTSStatus, write = SetRTSStatus; _published: /以下加入属性 _property TComPortNumber CommPort = read = FCommPort, write = SetCommPort, default = pnCOM1; _property TBaudRate BaudRate = read = FBaudRate, write = SetBaudRate, default = br9600; _property THwHandShaking HwHandShaking = read = GetHwHandShaking, write = SetHwHandShaking, default = hhNone; _property TSwHandShaking SwHandShaking = read = GetSwHandShaking, write = SetSwHandShaking, default = shNone; _property TDataBits DataBits = read = FDataBits ,write =SetDataBits,default = DB8 ; _property TParity Parity = read = FParity ,write = SetParity,default = None; _property TStopBits StopBits = read = FStopBits ,write = SetStopBits,default =SB1; _property DWORD CommEvent = read = ReadCommEvent; _property DWORD CommError = read = ReadCommError; _property String Input = read = ReadInputData; _property int InputLen = read = FInputLen , write = FInputLen, default =0; _property int RThreshold = read = FRThreshold ,write = SetRThreshold, default =0 ; _property bool CDHolding = read = ReadCDHolding; _property bool DSRHolding = read = ReadDSRHolding; _property bool RIHolding = read = ReadRIHolding; _property bool CTSHolding = read = ReadCTSHolding; /事件 _property TReceiveDataEvent OnReceiveData = read = FOnReceiveData , write = FOnReceiveData; _property TReceiveErrorEvent OnReceiveError = read = FOnReceiveError , write = FOnReceiveError; _property TModemStateChangeEvent OnModemStateChange = read = FOnModemStateChange , write = FOnModemStateChange;/-#endifComm.cpp /主文件内容/-#include #pragma hdrstop#include Comm.h#pragma package(smart_init)/-/ ValidCtrCheck is used to assure that the components created do not have/ any pure virtual functions./static inline void ValidCtrCheck(TComm *) new TComm(NULL);/-_fastcall TComm:TComm(TComponent* Owner) : TComponent(Owner) CommTimer = new TTimer(this); CommTimer-Enabled = false; CommTimer-Interval = 5; CommTimer-OnTimer = ProcTimer; hComm = 0; /通信端口Handle先清空 FPortOpen = False; FCommPort = pnCOM1; /默认COM1 FBaudRate = br9600; /9600bps FHwHandShaking = hhNone; /不启动硬件流量控制 FSwHandShaking = shNone; /不启动软件流量控制 FDataBits = DB8; /数据位数=8 FParity = None; /不作同位检查 FStopBits = SB1; /停止位数=1 FInputLen = 0; /默认是一次指令全部读取 FDTR = FRTS = false;/-namespace Comm void _fastcall PACKAGE Register() TComponentClass classes1 = _classid(TComm); RegisterComponents(System, classes, 0); /-void TComm:OpenComm(void) HANDLE hNewCommFile; String ComStr; char *COMNo; ComStr = COM + IntToStr(1+FCommPort); hNewCommFile = CreateFile( ComStr.c_str(), GENERIC_READ | GENERIC_WRITE, 0, /not shared NULL, /no security OPEN_EXISTING, 0, /No Overlapped NULL /template ); if (hNewCommFile = INVALID_HANDLE_VALUE) throw 打开串口错误!; /ShowMessage(Error opening serial port); /raise Exception.Create( Error opening serial port ); if (!SetupComm(hNewCommFile, INPUTBUFFERSIZE, INPUTBUFFERSIZE) CloseHandle(hComm); throw 不能设置串口缓冲区!; /ShowMessage(Cannot setup comm buffer); / It is ok to continue. hComm = hNewCommFile; / 清除湲冲区 PurgeComm( hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ; / 通信端口配置 _SetCommState(); FDTR = true; SetDTRStatus(FDTR); SetRTSStatus(FRTS); FPortOpen = True; CommTimer-Enabled = true;/-void TComm:_SetCommState(void) DCB dcb; DWORD tmpValue; /取得串行端口设置 GetCommState(hComm, &dcb); /更改传输速率 dcb.BaudRate = FBaudRate; dcb.fBinary = 1; /必须指定为1 dcb.Parity = (unsigned char)FParity; /Parity的指定 FParityCheck = false; if (FParity != 0) FParityCheck = true; if (FParityCheck) dcb.fParity = (unsigned long)dcb_ParityCheck; / Enable parity check / 设置硬件流量控制 switch (FHwHandShaking) case hhNone: dcb.fRtsControl=0; break; case hhNoneRTSON: dcb.fRtsControl = RTS_CONTROL_ENABLE; /dcb_RtsControlEnable; break; case hhRTSCTS: dcb.fRtsControl = RTS_CONTROL_HANDSHAKE; /dcb_RtsControlHandShake; dcb.fOutxCtsFlow = 1; /dcb_OutxCtsFlow; break; /设置软件流量控制 if (FSwHandShaking!=shNone) dcb.fOutX = 1; /dcb_OutX; dcb.fInX = 1; /dcb_InX; /设置数据位数 dcb.ByteSize = FDataBits + 5; /设置停止位数 dcb.StopBits = FStopBits ; /将设置写入 SetCommState(hComm, &dcb);/- 组件用的定时器事件 -/void _fastcall TComm:ProcTimer(TObject *Sender) DWORD tmpValue; DWORD dwCommError; COMSTAT CS; if (hComm = 0) return; /若设置读取的字符数,检查并引发事件 ClearCommError(hComm,&dwCommError,&CS); /取得状态 FCommError = dwCommError; /错误数值 if (FRThreshold 0) if (CS.cbInQue = (DWORD)FRThreshold) ReceiveData(); GetModemState(); / EventProcess(); Application-ProcessMessages(); /看有无其他的指令需执行,以免锁住 /检查线路状态是否发生改变,若改变则引发事件 tmpValue = FCommEvent; if (tmpValue != 0) ModemStateChange(tmpValue); Application-ProcessMessages(); /看有无其他的指令需执行,以免锁住 /若发生错误,则引发错误 tmpValue = FCommError; if (tmpValue != 0) ReceiveError(tmpValue); Application-ProcessMessages(); /看有无其他的指令需执行,以免锁住/- 线路状态检测函数 -/void _fastcall TComm:GetModemState(void) DWORD dwModemState;if (hComm=0) ShowMessage(串口打开错误!); if (GetCommModemStatus(hComm, &dwModemState ) if (dwModemState & MS_RLSD_ON) if (!FCDHolding) FCommEvent=FCommEvent+EV_RLSD; FCDHolding=true; else if (FCDHolding) FCommEvent=FCommEvent-EV_RLSD; FCDHolding=false; if (dwModemState & MS_DSR_ON) if (!FDSRHolding) FCommEvent=FCommEvent+EV_DSR; FDSRHolding=true; else if (FDSRHolding) FCommEvent=FCommEvent-EV_DSR; FDSRHolding=false; if (dwModemState & MS_RING_ON) if (!FRIHolding) FCommEvent=FCommEvent+EV_RING; FRIHolding=true; else if (FRIHolding) FCommEvent=FCommEvent-EV_RING; FRIHolding=false; if (dwModemState & MS_CTS_ON) if (!FCTSHolding) FCommEvent=FCommEvent+EV_CTS; FCTSHolding=true; else if (FCTSHolding) FCommEvent=FCommEvent-EV_CTS; FCTSHolding=false; / GetCommModem Loop/- Receive Data -/void _fastcall TComm:ReceiveData(void) if (FOnReceiveData) FOnReceiveData(this);/- Modem State Change -/void _fastcall TComm:ModemStateChange(DWORD ModemEvent) if (FOnModemStateChange) FOnModemStateChange( this, ModemEvent );/- Receive Error -/void _fastcall TComm:ReceiveError(DWORD EvtMask) if (FOnReceiveError) FOnReceiveError( this, EvtMask );/- Change Port -/void _fastcall TComm:SetCommPort(TComPortNumber Port) if (Port=FCommPort) return; FCommPort = Port;/- 设置速率 -/void _fastcall TComm:SetBaudRate(TBaudRate Rate) if (Rate = FBaudRate) return; FBaudRate = Rate; if (hComm != 0) _SetCommState();/- 硬件交握 -/THwHandShaking _fastcall TComm:GetHwHandShaking(void) return(FHwHandShaking);void _fastcall TComm:SetHwHandShaking(THwHandShaking c ) if (c = FHwHandShaking) return; FHwHandShaking = c; if (hComm != 0) _SetCommState();/- 软件交握 -/TSwHandShaking _fastcall TComm:GetSwHandShaking(void) return(FSwHandShaking);void _fastcall TComm:SetSwHandShaking(TSwHandShaking c ) if (c = FSwHandShaking) return; FSwHandShaking = c; if (hComm != 0) _SetCommState();/- 数据位数 -/void _fastcall TComm:SetDataBits(TDataBits Size ) if (Size = FDataBits) return; FDataBits = Size; if (hComm != 0) _SetCommState();/- 奇偶校验 -/void _fastcall TComm:SetParity(TParity p ) if (p = FParity) return; FParity = p; if (hComm != 0) _SetCommState();/- 停止位 -/void _fastcall TComm:SetStopBits(TStopBits Bits ) if (Bits = FStopBits) return; FStopBits = Bits; if (hComm != 0) _SetCommState();/- 用来清除Buffer -/void _fastcall TComm:SetInDataCount(DWORD StrNo) if (StrNo!=0) return; PurgeComm(hComm, PURGE_RXCLEAR); / 清除COM 资料/- 接收阈值 -/void _fastcall TComm:SetRThreshold(int RTNo) FRThreshold=RTNo;/- 开始通信端口 -/void _fastcall TComm:SetPortOpen(bool b) CommTimer-Enabled=false; if (b) /若指定打开通信端口,则 if (FPortOpen) ShowMessage(串口已经打开!); return; /FportOpen loop OpenComm(); /打开通信端口 return; /b loop CloseComm();/- DTR状态 -/bool _fastcall TComm:GetDTRStatus() return(FDTR);void _fastcall TComm:SetDTRStatus(bool b) FDTR=b; if (hComm=0) return; if (b) EscapeCommFunction(hComm,SETDTR); /将DTR升至高电位 else EscapeCommFunction(hComm,CLRDTR);/将DTR降至低电位/- RTS状态 -/bool _fastcall TComm:GetRTSStatus() return(FRTS);void _fast

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论