VC学习:Windows CE下的串口通讯类.doc_第1页
VC学习:Windows CE下的串口通讯类.doc_第2页
VC学习:Windows CE下的串口通讯类.doc_第3页
VC学习:Windows CE下的串口通讯类.doc_第4页
VC学习:Windows CE下的串口通讯类.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

VC学习:Windows CE下的串口通讯类 文章来源: 作者:zhenxizhou/CSDN串行通讯是目前计算机、通信和控制领域最基本的通信方式。在CSDN的“嵌入式开发/WINCE”社区中,经常有人提问该到哪找串口通讯类,其实这个问题我自己也问过。:)而一般的回答是给你提供一个Pocket PC 2002的SDK例子程序。但到底SDK的程序和MFC的结构有很大的不同,对于想用MFC编写通信程序的人来说也不是很便利。另一方面,由于Windows CE是一个基于Unicode的操作系统,并且Windows CE不支持Windows下常用的串行通信重叠I/O方式(OVERLAPPED),因此编写Windows CE下的串口通讯类有一些与桌面Windows不同的地方。以下是我从SDK程序改写而来的MFC类,希望能和致力于WINCE开发的朋友多多交流,由于本人才疏学浅,程序中有许多不完善的地方,请大家指正。我的程序是基于“主动发送请求,被动接收响应”的假设,因此我只设置了一个接收数据的线程。如果有朋友能提供有独立发送数据和接收数据线程的类,我将十分感激。我的E_mail:。感谢“嵌入式开发/WINCE”社区为我提供SDK例子的朋友,感谢CSDN上所有热心的朋友,祝愿中国的软硬件水平能早日挤身世界一流。头文件Serial.h/ Serial.h: interface for the CSerial class./#if !defined(AFX_SERIAL_H_59575586_AAA9_4FEF_B2A7_E089553698EF_INCLUDED_)#define AFX_SERIAL_H_59575586_AAA9_4FEF_B2A7_E089553698EF_INCLUDED_#if _MSC_VER 1000#pragma once#endif / _MSC_VER 1000DWORD WINAPI ReadPortThread(LPVOID lpvoid); /读数据线程class CSerialpublic:BOOL InitCommTimeouts(); /设置超时参数BOOL InitDCB(); /配置串口BOOL m_bConnected;BOOL ClosePort(HANDLE hCommPort); /关闭串口DWORD WritePort(TCHAR *buf,DWORD dwBytesToWrite); /写数据BOOL OpenPort(LPTSTR lpszPortName); /打开串口CSerial();HANDLE hReadThread;virtual CSerial(); ;#endif / !defined(AFX_SERIAL_H_59575586_AAA9_4FEF_B2A7_E089553698EF_INCLUDED_)源文件:Serial.cpp/ Serial.cpp: implementation of the CSerial class./#include stdafx.h#include Serial.h#ifdef _DEBUG#undef THIS_FILEstatic char THIS_FILE=_FILE_;#define new DEBUG_NEW#endifHANDLE hPort;CString strInChar;/ Construction/Destruction/CSerial:CSerial()CSerial:CSerial()if(hPort != INVALID_HANDLE_VALUE)ClosePort(hPort);BOOL CSerial:OpenPort(LPTSTR lpszPortName)DWORD dwError,dwThreadID;if(hPort)return FALSE;/打开串口hPort = CreateFile (lpszPortName, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING,0, NULL);/如果打开端口出错, 返回FALSEif ( hPort = INVALID_HANDLE_VALUE ) /不能打开端口CString strError;strError.Format(_T(Unable to open %s, Error No.=%d), lpszPortName, GetLastError();MessageBox (NULL, strError,TEXT(Error), MB_OK);return FALSE;/指定端口监测的事件集SetCommMask (hPort, EV_RXCHAR);/分配设备缓冲区SetupComm(hPort,512,512);/初始化缓冲区中的信息PurgeComm(hPort,PURGE_TXCLEAR|PURGE_RXCLEAR);/配置串行端口if(!InitDCB()return FALSE;/设置端口超时值if(!InitCommTimeouts()return FALSE;/设置端口上指定信号的状态/ SETDTR: 发送DTR (data-terminal-ready)信号/ SETRTS: 发送RTS (request-to-send)信号EscapeCommFunction (hPort, SETDTR);EscapeCommFunction (hPort, SETRTS);/创建一个从串口读取数据的线程if (hReadThread = CreateThread (NULL, 0, ReadPortThread, 0, 0, &dwThreadID)else/不能创建线程MessageBox (NULL, TEXT(Unable to create the read thread), TEXT(Error), MB_OK);dwError = GetLastError ();return FALSE;m_bConnected=TRUE;return TRUE;DWORD CSerial:WritePort(TCHAR *buf,DWORD dwCharToWrite)BOOL fWriteState;DWORD dwBytesWritten;/写入数据fWriteState=WriteFile(hPort,buf,dwCharToWrite*sizeof(TCHAR),&dwBytesWritten,NULL);if(!fWriteState)/不能写数据MessageBox(NULL,TEXT(Cant Write String to Comm),TEXT(Error),MB_OK);dwBytesWritten=0;return dwBytesWritten;DWORD WINAPI ReadPortThread(LPVOID lpvoid)BOOL fReadState;DWORD dwCommModemStatus;DWORD dwLength;COMSTAT ComStat;DWORD dwErrorFlags;while (hPort != INVALID_HANDLE_VALUE) /等待串口的事件发生WaitCommEvent (hPort, &dwCommModemStatus, 0);if (dwCommModemStatus & EV_RXCHAR) ClearCommError(hPort,&dwErrorFlags,&ComStat);/cbInQue返回在串行驱动程序输入队列中的字符数dwLength=ComStat.cbInQue;if(dwLength0)/从串口读取数据TCHAR* buf=new TCHAR256;fReadState=ReadFile(hPort,buf,dwLength,&dwLength,NULL);if(!fReadState)/不能从串口读取数据MessageBox(NULL,TEXT(Error in read from serial port),TEXT(Read Error),MB_OK);else/把数据赋值给全局变量strInChar=buf;delete buf; GetCommModemStatus (hPort, &dwCommModemStatus);return 0;BOOL CSerial:ClosePort(HANDLE hCommPort)if (hCommPort != INVALID_HANDLE_VALUE)/设置连接属性为FALSEm_bConnected=FALSE;/结束线程中WaitCommEvent的等待SetCommMask(hPort,0);/阻塞至线程停止if(hReadThread)TerminateThread(hReadThread,0);CloseHandle(hReadThread);/清除端口上指定信号的状态EscapeCommFunction(hPort,CLRDTR);EscapeCommFunction(hPort,CLRRTS);/清除驱动程序内部的发送和接收队列PurgeComm(hPort,PURGE_TXCLEAR|PURGE_RXCLEAR);/关闭串口CloseHandle (hCommPort);hCommPort = INVALID_HANDLE_VALUE;return TRUE;elsereturn TRUE;BOOL CSerial:InitDCB()DCB PortDCB;DWORD dwError;PortDCB.DCBlength = sizeof (DCB); /得到端口的默认设置信息GetCommState (hPort, &PortDCB);/改变DCB结构设置PortDCB.BaudRate = 19200; /波特率 PortDCB.fBinary = TRUE; /Win32不支持非二进制串行传输模式,必须为TRUE PortDCB.fParity = TRUE; /启用奇偶校验 PortDCB.fOutxCtsFlow = TRUE; /串行端口的输出由CTS线控制PortDCB.fOutxDsrFlow = FALSE;/关闭串行端口的DSR流控制 PortDCB.fDtrControl = DTR_CONTROL_ENABLE; /启用DTR线PortDCB.fDsrSensitivity = FALSE; /如果设为TRUE将忽略任何输入的字节,除非DSR线被启用 /PortDCB.fTXContinueOnXoff = TRUE;/当为TRUE时,如果接收缓冲区已满且驱动程序已传送XOFF字符,将使驱动程序停止传输字符PortDCB.fTXContinueOnXoff = FALSE;PortDCB.fOutX = FALSE;/设为TRUE指定XON/XOFF控制被用于控制串行输出 PortDCB.fInX = FALSE; /设为TRUE指定XON/XOFF控制被用于控制串行输入 PortDCB.fErrorChar = FALSE;/WINCE串行驱动程序的默认执行将忽略这个字段 PortDCB.fNull = FALSE;/设为TRUE将使串行驱动程序忽略收到的空字节 PortDCB.fRtsControl = RTS_CONTROL_ENABLE; /启用RTS线 PortDCB.fAbortOnError = FALSE; /WINCE串行驱动程序的默认执行将忽略这个字段PortDCB.ByteSize = 8; /每字节的位数 PortDCB.Parity = NOPARITY;/无奇偶校验 PortDCB.StopBits = ONESTOPBIT; /每字节一位停止位 /根据DCB结构配置端口 if (!SetCommState (hPort, &PortDCB)/不能配置串行端口MessageBox (NULL, TEXT(Unable to configure the serial port), TEXT(Error), MB_OK);dwError = GetLastError ();return FALSE;return TRUE;BOOL CSerial:InitCommTimeouts()COMMTIMEOUTS CommTimeouts;DWORD dwError;/得到超时参数GetCommTimeouts (hPort, &CommTimeouts);/改变COMMTIMEOUTS结构设置CommTimeouts.ReadIntervalTimeout = MAXDWORD;CommTimeouts.ReadTotalTimeoutMultiplier = 0;CommTimeouts.ReadTotalTimeoutConstant = 0;CommTimeouts.WriteTotalTimeoutMultiplier = 10;CommTimeouts.WriteTotalTim

温馨提示

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

评论

0/150

提交评论