养生 装修 购物 美食 感冒 便秘 营销 加盟 小吃 火锅 管理 创业 搭配 减肥 培训 旅游

VC++6.0封装串口通讯类

时间:2024-10-09 07:17:30

经常开发串口通讯软件,就需要编写一个串口通讯类,通用性能高,比如可以在MFC中调用,也可以在DLL中调用这个类.

工具/原料

VC++6.0开发平台

XP,win7操作系统都能安装.

方法/步骤

1、新建一个win32控制台程序

VC++6.0封装串口通讯类

2、在类视图添加一个新类

VC++6.0封装串口通讯类

3、类的名字为:SerialPort

VC++6.0封装串口通讯类

4、双击类名,在头文件中添加方法声明.

VC++6.0封装串口通讯类

5、在SerialPort.h中添加代码:public: //设置串口号 void 衡痕贤伎setPortName(constintport)稆糨孝汶; //设置波特率 void setBaud(UINTbaud); //打开串口 BOOL InitPort(UINTportnr=5,UINTbaud=9600,charparity='N',UINTdatabits=8,UINTstopsbits=1); //发送数据 int WriteToPort(char*writeData,intWriteSize); //读取数据 int ReceiveChar(char*readBuff,intReadSize); //关闭串口 void ClosePort();private: HANDLE m_hComm;//串口句柄 COMMTIMEOUTS m_CommTimeouts;//超时时间 DCB m_dcb;//设置波特率停止位串口号码..... int m_port;//串口号 UINT m_baud;//波特率

VC++6.0封装串口通讯类

6、切换到文件视图在SerialPort.cpp中实现声明的方法:

VC++6.0封装串口通讯类

7、在SerialPort.cpp中添加代码:SerialPort::SerialPo筠续师诈rt()//构造函数中初始化{ m_hComm=惺绅寨瞀NULL; m_port=1; m_baud=9600;}SerialPort::~SerialPort()//析构中释放{ if(m_hComm!=NULL) { CloseHandle(m_hComm); m_hComm=NULL; }}voidSerialPort::setPortName(constintport)//设置串口号{m_port=port;}voidSerialPort::setBaud(UINTbaud)//设置波特率{ m_baud=baud;}voidSerialPort::ClosePort()//关闭串口{ if(m_hComm!=INVALID_HANDLE_VALUE) { CloseHandle(m_hComm); } m_hComm=INVALID_HANDLE_VALUE;}BOOLSerialPort::InitPort(UINTportnr,UINTbaud,charparity,UINTdatabits,UINTstopsbits)//打开串口{ //assert(portnr>0&&portnr<50); char*szPort=newchar[50]; char*szBaud=newchar[50]; baud=m_baud; portnr=m_port; sprintf(szPort,"COM%d",portnr); sprintf(szBaud,"baud=%dparity=%cdata=%dstop=%d",baud,parity,databits,stopsbits); if(m_hComm!=NULL) { CloseHandle(m_hComm); m_hComm=NULL; } m_hComm=CreateFile(szPort, //communicationportstring(COMX) GENERIC_READ|GENERIC_WRITE, //read/writetypes NULL, //commdevicesmustbeopenedwithexclusiveaccess NULL, //nosecurityattributes OPEN_EXISTING, //commdevicesmustuseOPEN_EXISTING FILE_ATTRIBUTE_NORMAL, //AsyncI/O NULL); //templatemustbe0forcommdevices if(m_hComm==INVALID_HANDLE_VALUE) { //portnotfound delete[]szPort; delete[]szBaud; returnFALSE; } //setthetimeoutvalues memset(&m_CommTimeouts,0,sizeof(m_CommTimeouts)); memset(&m_dcb,0,sizeof(m_dcb)); m_CommTimeouts.ReadIntervalTimeout=1000; m_CommTimeouts.ReadTotalTimeoutMultiplier=1000; m_CommTimeouts.ReadTotalTimeoutConstant=1000; m_CommTimeouts.WriteTotalTimeoutMultiplier=1000; m_CommTimeouts.WriteTotalTimeoutConstant=1000; //configure if(SetCommTimeouts(m_hComm,&m_CommTimeouts)) { if(GetCommState(m_hComm,&m_dcb)) { if(BuildCommDCB(szBaud,&m_dcb)) { if(SetCommState(m_hComm,&m_dcb)) ;//normaloperation...continue else returnFALSE;//ProcessErrorMessage("SetCommState()"); } else returnFALSE;//ProcessErrorMessage("BuildCommDCB()"); } else returnFALSE;//ProcessErrorMessage("GetCommState()"); } else returnFALSE;//ProcessErrorMessage("SetCommTimeouts()"); delete[]szPort; delete[]szBaud; //flushtheport PurgeComm(m_hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT); returnTRUE;}int SerialPort::WriteToPort(char*writeData,intWriteSize)//发送数据{ BOOLbResult=TRUE; DWORDBytesSent=0; //Clearbuffer PurgeComm(m_hComm,PURGE_RXCLEAR|PURGE_TXCLEAR|PURGE_RXABORT|PURGE_TXABORT); bResult=WriteFile(m_hComm,writeData,WriteSize,&BytesSent,NULL); if(!bResult) { DWORDdwError=GetLastError(); switch(dwError) { caseERROR_IO_PENDING: { //continuetoGetOverlappedResults() BytesSent=0; //bWrite=FALSE; return-1; break; } default: { //allothererrorcodes //port->ProcessErrorMessage("WriteFile()"); //return-1; } } } //endif(bWrite) //Verifythatthedatasizesendequalswhatwetriedtosend if(BytesSent!=(DWORD)WriteSize) //Lengthofmessagetosend) { //TRACE("WARNING:WriteFile()error..BytesSent:%d;MessageLength:%d\n",BytesSent,strlen((char*)port->m_szWriteBuffer)); return-1; } returnBytesSent;}//----------------int SerialPort::ReceiveChar(char*readBuff,intReadSize)//接收数据{ BOOLbRead=TRUE; BOOLbResult=TRUE; DWORDdwError=0; DWORDBytesRead=0; bResult=ReadFile(m_hComm,readBuff,ReadSize,&BytesRead,NULL); if(!bResult) { switch(dwError=GetLastError()) { caseERROR_IO_PENDING: { //asynchronousi/oisstillinprogress //ProceedontoGetOverlappedResults(); //bRead=FALSE; return-1; break; } default: { //Anothererrorhasoccured.Processthiserror. //port->ProcessErrorMessage("ReadFile()"); break; } } } if(BytesRead!=(DWORD)ReadSize) { PurgeComm(m_hComm,PURGE_RXCLEAR|PURGE_TXCLEAR); return-1; } returnBytesRead;}

8、第7步骤中的代码复制后没有排版,先按ctrl+a全选然后再按alt+F8自动排版在stdafx.h中引入头文件#include<windows.h>

VC++6.0封装串口通讯类

9、以下是Demo.cpp中的代码#include"stdafx.h争犸禀淫"#include"SerialPort.h"SerialPort惺绅寨瞀m_serialPort=newSerialPort();intmain(intargc,char*argv[]){ m_serialPort->setPortName(1); m_serialPort->setBaud(9600); m_serialPort->InitPort(); //一下是打印机的功能 charwriteBuf[10]; writeBuf[0]=0x0A; for(inti=0;i<5;i++)//循环发送打印空的5行 { m_serialPort->WriteToPort(writeBuf,1);//发送打印换行 } printf("HelloWorld!\n"); return0;}

10、这个类封装好后可以将SerialPort.h和SerialPort.cpp文件放带MFC中调用,也可以在Win32程序中调用.扩展功能,比如写一个热敏打印机的程序.则添加一个HotPrinter类继承这个类,这样管理起来比较方便.比如我自己的热敏打印机这样写的,我就不写具体步骤了.

VC++6.0封装串口通讯类

© 一点知识