谢欣伦 - OpenDev原创教程 - 串口类CxSerial
这是一个精练的串口类,类名、函数名和变量名均采用匈牙利命名法。小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合。
串口类CxSerial的使用如下(以某个叫做CSomeClass的类的相关代码为例):
一、声明串口对象实例。
CxSerial m_xComm;
二、打开串口。
三、配置串口(可选)。通常配置波特率、奇偶校验位、停止位等。
四、设置串口(可选)。通常设置缓冲区大小、接收阈值等。
五、设置串口接收缓冲区事件通知方式。消息响应或回调函数,任选其一。
六、侦听串口。
BOOL CSomeClass::OpenCommPort(LPCSTR lpszCommPort, DWORD dwBitrate)
{
BOOL bRet = m_xComm.Open(lpszCommPort, sizeof(SOME_DATA_STRUCT)); if (bRet)
{
DCB dcb = {};
m_xComm.GetSettings(&dcb);
dcb.BaudRate = dwBitrate;
dcb.ByteSize = ;
dcb.Parity = NOPARITY;
dcb.StopBits = ONESTOPBIT;
m_xComm.SetSettings(&dcb);
m_xComm.SetWndMsgProc(GetSafeHwnd(), WM_SERIAL_EVENT, NULL, 0);
}
else
{
TCHAR szDebug[MAX_PATH];
_stprintf(szDebug, _T("Open %s failed. err code [%d].\n"),
lpszCommPort, ::GetLastError());
OutputDebugString(szDebug);
} return bRet;
}
七、处理消息响应或函数回调。
1.消息响应
BEGIN_MESSAGE_MAP(CSomeClass, CStatic)
//{{AFX_MSG_MAP(CSomeClass)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_SERIAL_EVENT, OnCommEvent)
END_MESSAGE_MAP() /////////////////////////////////////////////////////////////////////////////
// CSomeClass message handlers LRESULT CSomeClass::OnCommEvent(WPARAM wParam, LPARAM lParam)
{
LRESULT lRet = ;
switch (lParam)
{
case EV_RXCHAR:
lRet = OnCommRead(wParam, lParam);
break;
default: break;
} return lRet;
} LRESULT CSomeClass::OnCommRead(WPARAM wParam, LPARAM lParam)
{// may not be more than SetRThreshold, due to a delay message coming
LRESULT lRet = ;
TCHAR szDebug[MAX_PATH], szComm[FIX_SERIALCOMM];
if ((HANDLE)wParam == m_xComm.GetSafeHandle())
{
int nSize = sizeof(SOME_DATA_STRUCT);
DWORD dwInQue, dwOutQue;
if (!m_xComm.GetBufferCount(&dwInQue, &dwOutQue))
return lRet; m_xComm.GetCommPort(szComm);
while (dwInQue >= nSize)
{
_stprintf(szDebug, _T("%s dwInQue=%d, dwOutQue=%d\n"),
szComm, dwInQue, dwOutQue);
OutputDebugString(szDebug); SOME_DATA_STRUCT data = {};
if (m_xComm.Receive((LPBYTE)&data, nSize))
{
//do something with data;
}
if (!m_xComm.GetBufferCount(&dwInQue, &dwOutQue))
return lRet;
}
lRet = ;
} return lRet;
}
2.回调函数
LRESULT CALLBACK CSomeClass::CommProc(LPVOID lpParam, WPARAM wParam, LPARAM lParam)
{
LRESULT lRet = ;
CSomeClass* pThis = (CSomeClass*)lpParam;
if (pThis != NULL)
lRet = pThis->OnCommEvent(wParam, lParam); return lRet;
}
注意,在使用回调函数时应设置串口接收缓冲区事件通知方式为回调函数,并且设法把this指针传入设置函数,方便在回调函数中调用成员函数。
m_xComm.SetWindowMessage(NULL, 0, CommProc, (LPVOID)this);
八、关闭串口。
BOOL CSomeClass::CloseCommPort()
{
return m_xComm.Close();
}
至于串口数据发送,很简单,在需要处调用以下函数:
m_xComm.Send((LPBYTE)pData, sizeof(SOME_DATA_STRUCT));
精练的代码不需要过多解释,你们懂的。To be continued...
下载
Sample using libComm - v1.1 For WinXP
谢欣伦 - OpenDev原创教程 - 串口类CxSerial的更多相关文章
- 谢欣伦 - OpenDev原创教程 - 蓝牙设备查找类CxBthRadio & CxBthRadioFind
这是一个精练的蓝牙设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxBthRadioFind的使用如下: void CU ...
- 谢欣伦 - OpenDev原创教程 - 服务端套接字类CxServerSocket
这是一个精练的服务端套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxServerSocket的使用如下(以某个叫做CSo ...
- 谢欣伦 - OpenDev原创教程 - 蓝牙设备查找类CxBthRemoteDeviceFind
这是一个精练的蓝牙设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxBthRemoteDeviceFind的使用如下: ...
- 谢欣伦 - OpenDev原创教程 - 无连接套接字类CxUdpSocket
这是一个精练的无连接套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxUdpSocket的使用如下(以某个叫做CSomeC ...
- 谢欣伦 - OpenDev原创教程 - 客户端套接字类CxClientSocket
这是一个精练的客户端套接字类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxClientSocket的使用如下(以某个叫做CSo ...
- 谢欣伦 - OpenDev原创教程 - 网络设备查找类CxNetworkHostFind & CxNetworkAdapterFind
这是一个精练的网络设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxNetworkHostFind的使用如下: void ...
- 谢欣伦 - OpenDev原创教程 - 本地IP查找类CxLocalHostIPAddrFind
这是一个精练的本地IP查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxLocalHostIPAddrFind的使用如下: ...
- 谢欣伦 - OpenDev原创教程 - 设备查找类CxDeviceFind & CxDeviceMapFind
这是一个精练的设备查找类,类名.函数名和变量名均采用匈牙利命名法.小写的x代表我的姓氏首字母(谢欣伦),个人习惯而已,如有雷同,纯属巧合. CxDeviceFind的使用如下: void CUsbSc ...
- 谢欣伦 - OpenDev原创教程 - 媒体开发库libMedia
libMedia是一个免费的简单的媒体开发库,其中的接口类与函数大都以小写的x打头,来源于我的姓氏首字母(谢欣伦). 下载 OpenDev for VS2012 libMedia提供四大功能,一是视频 ...
随机推荐
- Linux C fcntl()函数详解
fcntl系统调用 功能描述:根据文件描述词来操作文件的特性. 用法: int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg ...
- python的一道面试题 __call__ 的使用.
class Person: def __init__(self): self.age = 1 def __call__(self, *args, **kwargs): print 'age', sel ...
- JVM内存管理------垃圾搜集器简介
引言 上一章我们已经探讨过GC的各个算法,那么垃圾搜集器是什么呢? 通俗的讲,使用编程语言将算法实现出来,产生的程序就是垃圾搜集器了.既然谈到了编程语言的实现,那么在讨论垃圾搜集器的时候,就已经涉及到 ...
- CFileDialog(文件夹对话框类)和CFontDialog(字体设置对话框类)的使用学习
CFileDialog(文件夹对话框类) 主要用于文件的保存,另存,打开,关闭等功能 功能“另存为”的实现: void CTXTDlg::OnFileSaveas() { LPCTSTR szFilt ...
- caffe初试(一)happynear的caffe-windows版本的配置及遇到的问题
之前已经配置过一次caffe环境了: Caffe初试(一)win7_64bit+VS2013+Opencv2.4.10+CUDA6.5配置Caffe环境 但其中也提到,编译时,用到了cuda6.5,但 ...
- TFS二次开发系列:五、工作项查询
本节将讲述如何查询工作项,用于二次开发中定义获取工作项列表. 使用WorkItemStore.Query方法进行查询工作项,其使用的语法和SQL语法类似: Select [标题] from worki ...
- WebConfig配置
安全配置示例 https://msdn.microsoft.com/zh-cn/magazine/gg309184.aspx
- HTML开源框架
swiper http://www.swiper.com.cn/ frawework7 http://framework7.cn/
- 电脑莫名其妙的被装上了流氓软件DNSunlocker的解决办法
重大更新:之前说的这些方法只能删除流氓文件,不能解决其弹出机具诱惑性的广告,网络经常不好用 经过测试,使用Malwarebytes Anti-Malware可以彻底解决这个问题,还能发现更多隐藏在你电 ...
- cacti添加主机监控
登入cacti后 主机-->添加-->填入信息.如下图所示 填好后点击右下角添加 添加完.左上角出现如下信息.说明被监控的服务器snmp工作正常. 然后咱们给这个主机添加图形. 当前主机模 ...