




已阅读5页,还剩31页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
最近因为工作的关系 要学习串口编程 在网上无意中发现了 PJ Naughter 写的一个串口类 不知是 何许人 孤陋寡闻 甚觉汗颜 感觉还可以 就抽了点时间把他网站上的有关此类的信息翻译了下 有时间研究下 说不定能用到项目中 时间较为仓促 加上我也不想在咬文嚼字上较真 肯定有许 多不足 望大家指正 同时也希望对串口有研究的同志们不吝赐教 一 类源文件 1 SERIALPORT H Module SERIALPORT H Purpose Declaration for an MFC wrapper class for serial ports Created PJN 31 05 1999 History None Copyright c 1999 by PJ Naughter All rights reserved Macros Structs etc ifndef SERIALPORT H define SERIALPORT H Classes Serial port exception class void AfxThrowSerialException DWORD dwError 0 class CSerialException public CException public Constructors Destructors CSerialException DWORD dwError CSerialException Methods ifdef DEBUG virtual void Dump CDumpContext endif virtual BOOL GetErrorMessage LPTSTR lpstrError UINT nMaxError PUINT pnHelpContext NULL CString GetErrorMessage 2 Data members DWORD m dwError protected DECLARE DYNAMIC CSerialException The actual serial port class class CSerialPort public CObject public Enums enum FlowControl NoFlowControl CtsRtsFlowControl CtsDtrFlowControl DsrRtsFlowControl DsrDtrFlowControl XonXoffFlowControl enum Parity EvenParity MarkParity NoParity OddParity SpaceParity enum StopBits OneStopBit OnePointFiveStopBits TwoStopBits Constructors Destructors CSerialPort CSerialPort General Methods void Open int nPort DWORD dwBaud 9600 Parity parity NoParity BYTE DataBits 8 StopBits stopbits OneStopBit FlowControl fc NoFlowControl BOOL bOverlapped 3 FALSE void Close void Attach HANDLE hComm HANDLE Detach operator HANDLE const return m hComm BOOL IsOpen const return m hComm INVALID HANDLE VALUE ifdef DEBUG void CSerialPort Dump CDumpContext endif Reading Writing Methods DWORD Read void lpBuf DWORD dwCount BOOL Read void lpBuf DWORD dwCount OVERLAPPED void ReadEx void lpBuf DWORD dwCount DWORD Write const void lpBuf DWORD dwCount BOOL Write const void lpBuf DWORD dwCount OVERLAPPED void WriteEx const void lpBuf DWORD dwCount void TransmitChar char cChar void GetOverlappedResult OVERLAPPED void CancelIo Configuration Methods void GetConfig COMMCONFIG static void GetDefaultConfig int nPort COMMCONFIG void SetConfig COMMCONFIG static void SetDefaultConfig int nPort COMMCONFIG Misc RS232 Methods void ClearBreak void SetBreak void ClearError DWORD void GetStatus COMSTAT void GetState DCB void SetState DCB void Escape DWORD dwFunc void ClearDTR void ClearRTS void SetDTR void SetRTS void SetXOFF void SetXON void GetProperties COMMPROP void GetModemStatus DWORD 4 Timeouts void SetTimeouts COMMTIMEOUTS void GetTimeouts COMMTIMEOUTS void Set0Timeout void Set0WriteTimeout void Set0ReadTimeout Event Methods void SetMask DWORD dwMask void GetMask DWORD void WaitEvent DWORD void WaitEvent DWORD Queue Methods void Flush void Purge DWORD dwFlags void TerminateOutstandingWrites void TerminateOutstandingReads void ClearWriteBuffer void ClearReadBuffer void Setup DWORD dwInQueue DWORD dwOutQueue Overridables virtual void OnCompletion DWORD dwErrorCode DWORD dwCount LPOVERLAPPED lpOverlapped protected HANDLE m hComm Handle to the comms port BOOL m bOverlapped Is the port open in overlapped IO static void WINAPI OnCompletion DWORD dwErrorCode DWORD dwCount LPOVERLAPPED lpOverlapped DECLARE DYNAMIC CSerialPort endif SERIALPORT H 2 Module SERIALPORT CPP Purpose Implementation for an MFC wrapper class for serial ports Created PJN 31 05 1999 History PJN 03 06 1999 1 Fixed problem with code using CancelIo which does not exist on 95 2 Fixed leaks which can occur in sample app when an exception is thrown PJN 16 06 1999 1 Fixed a bug whereby CString ReleaseBuffer was not being called in 5 CSerialException GetErrorMessage PJN 29 09 1999 1 Fixed a simple copy and paste bug in CSerialPort SetDTR Copyright c 1999 by PJ Naughter All rights reserved Includes include stdafx h include serialport h include winerror h defines ifdef DEBUG define new DEBUG NEW undef THIS FILE static char THIS FILE FILE endif Implementation Class which handles CancelIo function which must be constructed at run time since it is not imeplemented on NT 3 51 or Windows 95 To avoid the loader bringing up a message such as Failed to load due to missing export the function is constructed using GetProcAddress The CSerialPort CancelIo function then checks to see if the function pointer is NULL and if it is it throws an exception using the error code ERROR CALL NOT IMPLEMENTED which is what 95 would have done if it had implemented a stub for it in the first place class SERIAL PORT DATA public Constructors Destructors SERIAL PORT DATA SERIAL PORT DATA HINSTANCE m hKernel32 typedef BOOL CANCELIO HANDLE typedef CANCELIO LPCANCELIO 6 LPCANCELIO m lpfnCancelIo SERIAL PORT DATA SERIAL PORT DATA m hKernel32 LoadLibrary T KERNEL32 DLL VERIFY m hKernel32 NULL m lpfnCancelIo LPCANCELIO GetProcAddress m hKernel32 CancelIo SERIAL PORT DATA SERIAL PORT DATA FreeLibrary m hKernel32 m hKernel32 NULL The local variable which handle the function pointers SERIAL PORT DATA SerialPortData Exception handling code void AfxThrowSerialException DWORD dwError 0 if dwError 0 dwError GetLastError CSerialException pException new CSerialException dwError TRACE T Warning throwing CSerialException for error d n dwError THROW pException BOOL CSerialException GetErrorMessage LPTSTR pstrError UINT nMaxError PUINT pnHelpContext ASSERT pstrError NULL if pnHelpContext NULL pnHelpContext 0 LPTSTR lpBuffer BOOL bRet FormatMessage FORMAT MESSAGE ALLOCATE BUFFER FORMAT MESSAGE FROM SYSTEM NULL m dwError MAKELANGID LANG NEUTRAL 7 SUBLANG SYS DEFAULT LPTSTR if bRet FALSE pstrError 0 else lstrcpyn pstrError lpBuffer nMaxError bRet TRUE LocalFree lpBuffer return bRet CString CSerialException GetErrorMessage CString rVal LPTSTR pstrError rVal GetBuffer 4096 GetErrorMessage pstrError 4096 NULL rVal ReleaseBuffer return rVal CSerialException CSerialException DWORD dwError m dwError dwError CSerialException CSerialException IMPLEMENT DYNAMIC CSerialException CException ifdef DEBUG void CSerialException Dump CDumpContext dc m dwError m dwError endif The actual serial port code 8 CSerialPort CSerialPort m hComm INVALID HANDLE VALUE m bOverlapped FALSE CSerialPort CSerialPort Close IMPLEMENT DYNAMIC CSerialPort CObject ifdef DEBUG void CSerialPort Dump CDumpContext dc T m hComm m hComm T n dc T m bOverlapped 0 ASSERT pSerialPort IsKindOf RUNTIME CLASS CSerialPort Call the C function pSerialPort OnCompletion dwErrorCode dwCount lpOverlapped void CSerialPort OnCompletion DWORD dwErrorCode DWORD dwCount LPOVERLAPPED lpOverlapped Just free up the memory which was previously allocated for the OVERLAPPED structure delete lpOverlapped Your derived classes can do something useful in OnCompletion but don t forget to call CSerialPort OnCompletion to ensure the memory is freed up void CSerialPort CancelIo ASSERT IsOpen 14 if SerialPortData m lpfnCancelIo NULL TRACE T CancelIo function is not supported on this OS You need to be running at least NT 4 or Win 98 to use this function n AfxThrowSerialException ERROR CALL NOT IMPLEMENTED if SerialPortData m lpfnCancelIo m hComm TRACE T Failed in call to CancelIO n AfxThrowSerialException void CSerialPort WriteEx const void lpBuf DWORD dwCount ASSERT IsOpen OVERLAPPED pOverlapped new OVERLAPPED ZeroMemory pOverlapped sizeof OVERLAPPED pOverlapped hEvent HANDLE this if WriteFileEx m hComm lpBuf dwCount pOverlapped OnCompletion delete pOverlapped TRACE T Failed in call to WriteFileEx n AfxThrowSerialException void CSerialPort ReadEx void lpBuf DWORD dwCount ASSERT IsOpen OVERLAPPED pOverlapped new OVERLAPPED ZeroMemory pOverlapped sizeof OVERLAPPED pOverlapped hEvent HANDLE this if ReadFileEx m hComm lpBuf dwCount pOverlapped OnCompletion delete pOverlapped TRACE T Failed in call to ReadFileEx n AfxThrowSerialException void CSerialPort TransmitChar char cChar ASSERT IsOpen 15 if TransmitCommChar m hComm cChar TRACE T Failed in call to TransmitCommChar n AfxThrowSerialException void CSerialPort GetConfig COMMCONFIG DWORD dwSize sizeof COMMCONFIG if GetCommConfig m hComm AfxThrowSerialException void CSerialPort SetConfig COMMCONFIG DWORD dwSize sizeof COMMCONFIG if SetCommConfig m hComm AfxThrowSerialException void CSerialPort SetBreak ASSERT IsOpen if SetCommBreak m hComm TRACE T Failed in call to SetCommBreak n AfxThrowSerialException void CSerialPort ClearBreak ASSERT IsOpen if ClearCommBreak m hComm 16 TRACE T Failed in call to SetCommBreak n AfxThrowSerialException void CSerialPort ClearError DWORD if ClearCommError m hComm AfxThrowSerialException void CSerialPort GetDefaultConfig int nPort COMMCONFIG 23 pEx Delete 其 API 包含两个类 CSerialException and CSerialPort 它们有如下成员函数和变量 CSerialException CSerialException CSerialException GetErrorMessage CSerialException m dwError CSerialPort CSerialPort CSerialPort CSerialPort CSerialPort Open CSerialPort Close CSerialPort Attach CSerialPort Detach CSerialPort operator HANDLE CSerialPort IsOpen CSerialPort Dump CSerialPort Read CSerialPort ReadEx CSerialPort Write CSerialPort WriteEx CSerialPort TransmitChar CSerialPort GetOverlappedResult CSerialPort CancelIo CSerialPort GetConfig CSerialPort GetDefaultConfig CSerialPort SetConfig CSerialPort SetDefaultConfig CSerialPort ClearBreak CSerialPort SetBreak CSerialPort ClearError CSerialPort GetStatus CSerialPort GetState CSerialPort SetState CSerialPort Escape CSerialPort ClearDTR CSerialPort ClearRTS CSerialPort SetDTR CSerialPort SetRTS CSerialPort SetXOFF CSerialPort SetXON CSerialPort GetProperties CSerialPort GetModemStatus CSerialPort SetTimeouts CSerialPort GetTimeouts 24 CSerialPort Set0Timeout CSerialPort Set0WriteTimeout CSerialPort Set0ReadTimeout CSerialPort SetMask CSerialPort GetMask CSerialPort WaitEvent CSerialPort Flush CSerialPort Purge CSerialPort TerminateOutstandingWrites CSerialPort TerminateOutstandingReads CSerialPort ClearWriteBuffer CSerialPort ClearReadBuffer CSerialPort Setup CSerialPort OnCompletion CSerialException CSerialException CSerialException DWORD dwError 0 参数 dwError 导致异常的错误 注释 当创建一个 CSerialException 对象时 此成员函数被调用 抛出 CSerialException 异常 调用全 局 函数 AfxThrowSerialException 如果你调用时使用 dwError 的默认值 那么他会在内部为你调用 GetLastError CSerialException GetErrorMessage virtual BOOL GetErrorMessage LPTSTR lpszError UINT nMaxError PUINT pnHelpContext NULL CString GetErrorMessage 返回值 1 如果函数调用成功 返回非 0 值 如果没有有效错误信息 返回 0 2 一个 CString 标识的错误 参数 25 lpszError 一个指向接受错误信息的缓冲区 nMaxError 缓冲区能够包含的最大字符数 包括 NULL 终止符 pnHelpContext 一个 UINT 地址 将接受 help context ID 如果为空 则没有 ID 会返回 注释 调用此函数 可以获得一个有关发生错误的文本 CSerialException m dwError 注释 导致异常的错误 此错误值是一个系统错误代码 同 WINERROR H 中一样 可参考更多细节请参 考 Win32 SDK 文档中错误代码 CSerialPort CSerialPort CSerialPort 注释 标准 C 类构造函数 在其内部 仅仅只是给成员变量一个默认值 CSerialPort CSerialPort CSerialPort 注释 标准类析构函数 它确保打开的串行端口被关闭 CSerialException Open void Open int nPort DWORD dwBaud 9600 Parity parity NoParity BYTE DataBits 8 StopBits stopbits OneStopBit FlowControl fc NoFlowControl BOOL bOverlapped FALSE throw CSerialException 参数 nPort 要打开的通讯端口 dwBaud 要是用的波特率 parity 要是用的校验方式 其值是一个枚举 26 enum Parity EvenParity MarkParity NoParity OddParity SpaceParity Databits The number of data bits to use stopbits 要使用的停止位 其值是一个枚举 enum StopBits OneStopBit OnePointFiveStopBits TwoStopBits fc 要使用的流控制方法 其值是一个枚举 enum FlowControl NoFlowControl CtsRtsFlowControl CtsDtrFlowControl DsrRtsFlowControl DsrDtrFlowControl XonXoffFlowControl bOverlapped 如果使用重叠方式 值为 TRUE 否则使用阻塞方式 值为 FALSE 注释 调用此成员函数打开一个通讯端口 在类内部将会使用 CreateFile 打开一个串行端口 处理串口数目大于 9 的情况 并且使用 SetState 来设置可变的 RS 232 设置 如果发生 错误 将会抛出异常 CSerialPort Close Close 注释 同 Open 函数对应 只是用来关闭打开的串行端口 CSerialPort Attach void Attach HANDLE hComm 参数 27 hComm 打开串行端口的 SDK 句柄 注释 允许你给一个 CSerialPort 实例附加一个存在的 SDK 串行端口句柄 这个函数同 MFC 中的 CWnd Attach function 类似 CSerialPort Detach HANDLE Detach 返回值 SDK 串行端口 HANDLE 注释 与 Attach 相对应 这个函数同 MFC 中的 CWnd Detach 类似 CSerialPort operator HANDLE operator HANDLE 返回值 SDK 串行端口 HANDLE 注释 使用操作符获取底层串行端口句柄 利用句柄 你可以直接调用 Windows APIs CSerialPort IsOpen BOOL IsOpen const 返回值 如果串口打开 返回 TRUE 否则 FALSE CSerialPort Dump void Dump CDumpContext 28 BOOL Read void lpBuf DWORD dwCount OVERLAPPED void ReadEx void lpBuf DWORD dwCount throw CSerialException 返回值 已读取字节数 如果重叠读取同步的完成 返回帧 如果操作被异步完成 返回假 参数 lpBuf 指向存放从串口读取字符缓冲区 dwCount 从串口读取的字节数 overlapped 对应一个 OVERLAPPED 结构体 如果端口是以重叠方式打开 这是必须的 注释 这三个函数是对 SDK ReadFile 和 ReadFileEx 的封装 Read 的第二版是重叠方式 CSerialPort Write WriteEx DWORD Write const void lpBuf DWORD dwCount BOOL Write const void lpBuf DWORD dwCount OVERLAPPED void WriteEx const void lpBuf DWORD dwCount throw CSerialException 返回值 已写的字节数 如果重叠写是同步的完成 返回真 如果操作被异步完成 返回假 参数 lpBuf 指向存放写向串口字符的缓冲区 dwCount 写向串口的字节数 overlapped 对应一个 OVERLAPPED 结构体 如果端口是以重叠方式打开 这是必须的 注释 这三个函数是对 SDK WriteFile 和 WriteFileEx 的封装 Write 的第二版是重叠方式 CSerialPort TransmitChar void TransmitChar char cChar const throw CSerialException 注释 29 对 TransmitCommChar SDK 函数的简单封装 更多细节请参考 更多细节请参考 Win32 SDK 文 档 文档 CSerialPort GetOverlappedResult void GetOverlappedResult OVERLAPPED 注释 是对 GetOverlappedResult SDK 函数的简单封装 更多细节请参考 更多细节请参考 Win32 SDK 文档 文档 CSerialPort CancelIo void CancelIo throw CSerialException 注释 是对 CancelIo SDK 函数的简单封装 更多细节请参考 更多细节请参考 Win32 SDK 文档 文档 请注意这个函数只在 NT 4 Windows 98 或更新版本上有效 在 CSerialPort 1 0 里 存在问 题 在 V1 01 以后的版本里 已经被纠正 CSerialPort GetConfig void GetConfig COMMCONFIG 注释 是对 GetCommConfig SDK 函数的简单封装 更多细节请参考 更多细节请参考 Win32 SDK 文档 CSerialPort GetDefaultConfig static void GetDefaultConfig int nPort COMMCONFIG 注释 是对 GetDefaultCommConfig SDK 函数的简单封装 更多细节请参考 更多细节请参考 Win32 SDK 文档 30 CSerialPort SetConfig void SetConfig COMMCONFIG 注释 是对 SetCommConfig SDK 函数的简单封装 更多细节请参考 更多细节请参考 Win32 SDK 文档 CSerialPort SetDefaultConfig static void SetDefaultConfig int nPort COMMCONFIG 注释 是对 SetDefaultCommConfig SDK 函数的简单封装 更多细节请参考 更多细节请参考 Win32 SDK 文档 CSerialPort ClearBreak void ClearBreak throw CSerialException 注释 是对 ClearCommBreak SDK 函数的简单封装 更多细节请参考 更多细节请参考 Win32 SDK 文 档 CSerialPort SetBreak void SetBreak throw CSerialException 注释 是对 SetCommBreak SDK 函数的简单封装 更多细节请参考 更多细节请参考 Win32 SDK 文档 CSerialPort ClearError void ClearError DWORD 注释 是对 ClearCommError SDK 函数的简单封装 更多细节请参考 更多细节请参考 Win32 SDK 文 档 31 CSerialPort GetStatus void GetStatus COMMSTAT 注释 是对 GetCommStatus SDK 函数的简单封装 更多细节请参考 Win32 SDK 文档 CSerialPort GetState void GetState DCB 注释 是对 GetCommState SDK 函数的简单封装 更多细节请参考 Win32 SDK 文档 CSerialPort SetState void SetState DCB 注释 Simple 是对 SetCommStateSDK 函数的简单封装 更多细节请参考 Win32 SDK 文档 CSerialPort Escape void Escape DWORD dwFunc throw CSerialException 注释 是对 EscapeCommFunction SDK 函数的简单封装 更多细节请参考 Win32 SDK 文档 CSerialPort ClearDTR void ClearDTR throw CSerialException 注释 使用常量 CLRDTR 调用 Escape 函数清除 DTR 32 CSerialPort ClearRTS void ClearRTS throw CSerialException 注释 使用常量 CLRRTS 调用 Escape 函数清除 RTS CSerialPort SetDTR void SetDTR throw CSerialException 注释 使用常量 SETDTR 调用 Escape 函数设置 DTR CSerialPort SetRTS void SetRTS throw CSerialException 注释 使用常量 SETRTS 调用 Escape 函数设置 RTS CSerialPort SetXOFF void SetXOFF throw CSerialException 注释 当一个 XOFF 接受时 使用常量 SETXOFF 调用 Escape 函数 导致传输发生 CSerialPort SetXON void SetXON throw CSerialException 注释 当一个 XON 接受时 使用常量 SETXON 调用 Escape 函数 导致传输发生 33 CSerialPort GetProperties void GetProperties COMMPROP 注释 Simple 是对 SDK 函数的简单封装 更多细节请参考 Win32 SDK 文档 CSerialPort GetModemStatus void GetModemStatus DWORD 注释 是对 SDK 函数的简单封装 更多细节请参考 Win32 SDK 文档 CSerialPort SetTimeouts void SetTimeouts COMMTIMEOUTS 注释 是对 SDK 函数的简单封装 更多细节请参考 Win32 SDK 文档 CSerialPort GetTimeouts void GetTimeouts COMMTIMEOUTS 注释 是对 SDK 函数的简单封装 更多细节请参考 Win32 SDK 文档 CSerialPort Set0Timeout void Set0Timeout throw CSerialException 注释 发送和接受超时配置为 0 这会导致写立即返回 读立即返回 无论什么数据在接受缓冲区 而不 等待特定数目的字节数到达 34 CSerialPort Set0WriteTimeout void Set0WriteTimeout throw CSerialException 注释 发送超时配置为
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年前庭蜗器考试题及答案
- 2025年陕西省宝鸡市公务员省考公共基础知识预测试题(含答案)
- 2025年山西省大同市事业单位工勤技能考试题库(含答案)
- CN222963691U 一种三维边坡监测雷达支架 (四川天府新区北理工创新装备研究院)
- 2025年铁路抢答题目及答案
- CN120108607B 一种基于图神经网络的智能材料性质预测系统 (广东铂崛科技有限公司)
- CN120106525B 基于跨模态数据对齐的无人设备自主任务优化方法及系统 (江苏飞睿得科技有限公司)
- CN120102030B 气象驱动的危化品泄漏智能示踪方法 (南京和电科技有限公司)
- unit1艺术课件教学课件
- twi安全培训心得课件
- 立杆方法分类普通电杆的组立系列课件
- 2024年农艺师专业考试试题及答案
- 学校食堂运营管理职责与分工
- 会计师事务所公司质量控制制度范本
- 实习生劳务合作合同6篇
- 2025《义务教育信息科技课程标准(2022年版)》测试题库及答案(共4套)
- 环境监测业务流程
- 房屋提前移交免责协议书5篇
- DB36-T 954-2024 低产低效林改造技术规程
- 《环境保护法》知识参考试题库200题(含答案)
- 食堂食材配送采购投标方案(技术标)
评论
0/150
提交评论