串口VC编程步骤及程序.docx

上传人:自*** 文档编号:126251588 上传时间:2020-03-23 格式:DOCX 页数:13 大小:44.30KB
返回 下载 相关 举报
串口VC编程步骤及程序.docx_第1页
第1页 / 共13页
串口VC编程步骤及程序.docx_第2页
第2页 / 共13页
串口VC编程步骤及程序.docx_第3页
第3页 / 共13页
串口VC编程步骤及程序.docx_第4页
第4页 / 共13页
串口VC编程步骤及程序.docx_第5页
第5页 / 共13页
点击查看更多>>
资源描述

《串口VC编程步骤及程序.docx》由会员分享,可在线阅读,更多相关《串口VC编程步骤及程序.docx(13页珍藏版)》请在金锄头文库上搜索。

1、1添加C+类 CCESeries下面是CCESeries.h 文件的内容:#pragma once/定义串口接收数据函数类型/这是一个回调函数,执行该函数时,表示串口接收到了数据。typedef void (CALLBACK* ONSERIESREAD)(void * pOwner /*父对象指针*/,BYTE* buf /*接收到的缓冲区*/,DWORD dwBufLen /*接收到的缓冲区长度*/);class CCESeriespublic:CCESeries(void); /CCESeries类的构造函数CCESeries(void); /CCESeries类的析构函数public:/

2、打开串口BOOL OpenPort(void* pOwner,/*指向父指针*/UINT portNo = 1, /*串口号*/UINT baud = 9600, /*波特率*/UINT parity = NOPARITY, /*奇偶校验*/UINT databits = 8, /*数据位*/UINT stopbits = 0 /*停止位*/);/关闭串口void ClosePort();/同步写入数据BOOL WriteSyncPort(const BYTE*buf , DWORD bufLen);/设置串口读取、写入超时BOOL SetSeriesTimeouts(COMMTIMEOUTS

3、 CommTimeOuts);/得到串口是否打开BOOL GetComOpened();private:/串口读线程函数,该函数被定义成私有静态。static DWORD WINAPI ReadThreadFunc(LPVOID lparam);private:/关闭读线程,当使用完串口后,便调用这个函数退出串口数据接收线程。void CloseReadThread();private:/已打开的串口句柄/ HANDLE m_hComm;/读线程句柄HANDLE m_hReadThread;/读线程ID标识DWORD m_dwReadThreadID;/读线程退出事件HANDLE m_hRea

4、dCloseEvent;BOOL m_bOpened; /串口是否打开void * m_pOwner; /指定父对象指针public:ONSERIESREAD m_OnSeriesRead; /串口读取回调函数HANDLE m_hComm;2.下面是CCESeries.cpp文件的内容:#include StdAfx.h#include CESeries.h/构造函数,将m_hComm初始化为无效的句柄CCESeries:CCESeries()/初始化内部变量m_hComm = INVALID_HANDLE_VALUE;m_OnSeriesRead = NULL;m_bOpened = 0;/

5、析构函数,检测如果串口是打开的,则关闭串口CCESeries:CCESeries()if (m_bOpened)/关闭串口ClosePort();/串口读线程函数,该线程用于异步接收串口数据。大家应仔细理解该线程的具体实现过程,/该线程通过循环调用WaitCommEvent函数来检测串口状态,当发现有数据时,调用/ReadFile函数读取数据,并触发回调函数,由此实现串口数据的实时异步读取。DWORD CCESeries:ReadThreadFunc(LPVOID lparam)CCESeries *ceSeries = (CCESeries*)lparam;DWORD evtMask;BYT

6、E * readBuf = NULL;/读取的字节DWORD actualReadLen=0;/实际读取的字节数DWORD willReadLen;DWORD dwReadErrors;COMSTAT cmState;/ 清空缓冲,并检查串口是否打开。ASSERT(ceSeries-m_hComm !=INVALID_HANDLE_VALUE);/清空串口PurgeComm(ceSeries-m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR );SetCommMask (ceSeries-m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );

7、while (TRUE)if (WaitCommEvent(ceSeries-m_hComm,&evtMask,0)SetCommMask (ceSeries-m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );/表示串口收到字符if (evtMask & EV_RXCHAR)ClearCommError(ceSeries-m_hComm,&dwReadErrors,&cmState);willReadLen = cmState.cbInQue ;if (willReadLen m_hComm, readBuf, willReadLen,&actualReadLen,

8、0);/如果读取的数据大于,if (actualReadLen0)/触发读取回调函数if (ceSeries-m_OnSeriesRead)ceSeries-m_OnSeriesRead(ceSeries-m_pOwner,readBuf,actualReadLen);/释放内存delete readBuf;readBuf = NULL;/如果收到读线程退出信号,则退出线程if (WaitForSingleObject(ceSeries-m_hReadCloseEvent,500) =WAIT_OBJECT_0)break;return 0;/关闭读线程void CCESeries:Close

9、ReadThread()/设置读线程退出信号SetEvent(m_hReadCloseEvent);/设置所有事件无效无效SetCommMask(m_hComm, 0);/清空所有将要读的数据PurgeComm( m_hComm, PURGE_RXCLEAR );/等待秒,如果读线程没有退出,则强制退出if (WaitForSingleObject(m_hReadThread,4000) = WAIT_TIMEOUT)TerminateThread(m_hReadThread,0);m_hReadThread = NULL;/*函数介绍:打开串口*入口参数:pPortOwner :使用此串口类

10、的窗体句柄portNo :串口号baud :波特率parity :奇偶校验databits :数据位stopbits :停止位*出口参数:(无)*返回值:TRUE:成功打开串口;FALSE:打开串口失败*/供外部调用此方法打开串口,该函数将根据制定的参数打开串口,并创建此串口的读线程,以实现串口数据实时异步读操作。BOOL CCESeries:OpenPort(void * pOwner,UINT portNo , /*串口号*/UINT baud , /*波特率*/UINT parity , /*奇偶校验*/UINT databits , /*数据位*/UINT stopbits /*停止位

11、*/)DCB commParam;TCHAR szPort15;ASSERT(pOwner!=NULL);m_pOwner = pOwner;/ 已经打开的话,直接返回if (m_hComm != INVALID_HANDLE_VALUE)return TRUE;/设置串口名wsprintf(szPort, LCOM%d:, portNo);/打开串口m_hComm = CreateFile(szPort,GENERIC_READ | GENERIC_WRITE, /允许读和写0, /独占方式(共享模式)NULL,OPEN_EXISTING, /打开而不是创建(创建方式)0,NULL);if

12、(m_hComm = INVALID_HANDLE_VALUE)/ 无效句柄,返回。TRACE(_T(CreateFile 返回无效句柄n);return FALSE;/ 得到打开串口的当前属性参数,修改后再重新设置串口。if (!GetCommState(m_hComm,&commParam)/关闭串口CloseHandle (m_hComm);m_hComm = INVALID_HANDLE_VALUE;return FALSE;/设置串口参数commParam.BaudRate = baud; / 设置波特率commParam.fBinary = TRUE; / 设置二进制模式,此处必须

13、设置TRUEcommParam.fParity = TRUE; / 支持奇偶校验commParam.ByteSize = databits; / 数据位,范围:4-8commParam.Parity = parity; / 校验模式commParam.StopBits = stopbits; / 停止位commParam.fOutxCtsFlow = FALSE; / No CTS output flow controlcommParam.fOutxDsrFlow = FALSE; / No DSR output flow controlcommParam.fDtrControl = DTR_

14、CONTROL_ENABLE;/ DTR flow control typecommParam.fDsrSensitivity = FALSE; / DSR sensitivitycommParam.fTXContinueOnXoff = TRUE; / XOFF continues TxcommParam.fOutX = FALSE; / No XON/XOFF out flow controlcommParam.fInX = FALSE; / No XON/XOFF in flow controlcommParam.fErrorChar = FALSE; / Disable error replacementcommParam.fNull = FALSE; / Disable null strippingcommParam.fRtsControl = RTS_CONTROL_ENABLE;/

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号