串口通信例程.rtf

上传人:赵** 文档编号:46686160 上传时间:2022-09-27 格式:RTF 页数:9 大小:34.82KB
返回 下载 相关 举报
串口通信例程.rtf_第1页
第1页 / 共9页
串口通信例程.rtf_第2页
第2页 / 共9页
点击查看更多>>
资源描述

《串口通信例程.rtf》由会员分享,可在线阅读,更多相关《串口通信例程.rtf(9页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、Window 95 串口通讯函数集合(只适用于 32 位)需要说明的是:这是我程序的一部分,因此有一些与具体应用无关的部分。但我觉得关键是原理,而不是程序本身.后面有些使用介绍,帮助理解这长的程序。头文件(.H)#include StdAfx.h#define GWL_PGPSINFO 0#define GPSEXTRABYTES sizeof(LONG)#define MAXPORTS 4#define CN_SEND WM_USER+100#define RXQUEUE 4096#define TXQUEUE 4096/cursor states#define CS_HIDE 0 x00#

2、define CS_SHOW 0 x01/Flow control flags#define FC_DTRDSR 0 x01#define FC_RTSCTS 0 x02#define FC_XONXOFF 0 x04/ascii definitions#define ASCII_BEL 0 x07#define ASCII_BS 0 x08#define ASCII_LF 0 x0A#define ASCII_CR 0 x0D#define ASCII_XON 0 x11#define ASCII_XOFF 0 x13/data structurestypedef struct tagGPS

3、INFO HANDLE idComDev;BYTE bPort;BOOL fConnected;BYTE bByteSize,bParity,bStopBits;DWORD dwBaudRate;HANDLE hPostEvent,hWatchThread,hWatchEvent;HWND hTermWnd;DWORD dwThreadID;OVERLAPPED osWrite,osRead;GPSINFO,*PGPSINFO;#define COMDEV(x)(x-idComDev)#define PORT(x)(x-bPort)#define CONNECTED(x)(x-fConnect

4、ed)#define BYTESIZE(x)(x-bByteSize)#define PARITY(x)(x-bParity)#define STOPBITS(x)(x-bStopBits)#define BAUDRATE(x)(x-dwBaudRate)#define POSTEVENT(x)(x-hPostEvent)#define HTHREAD(x)(x-hWatchThread)#define THREADID(x)(x-dwThreadID)#define WRITE_OS(x)(x-osWrite)#define READ_OS(x)(x-osRead)/function pro

5、totypes(private)LRESULT NEAR CreateGPSInfo(HWND,BYTE nPort=1);BOOL NEAR DestroyGPSInfo();int NEAR ReadCommBlock(LPSTR,int);BOOL NEAR WriteCommBlock(LPSTR,DWORD);BOOL NEAR OpenConnection();BOOL NEAR SetupConnection();BOOL NEAR CloseConnection();/function prototypes(public)DWORD FAR PASCAL CommWatchPr

6、oc(LPSTR);具体实现请看下文(为了这文章,我都段线 2 次了)CPP 实现部分:#include StdAfx.h#include Com.hHWND hGPSWnd=NULL;PGPSINFO npGPSInfo=NULL;LRESULT NEAR CreateGPSInfo(HWND hWnd,BYTE nPort)if(NULL=(npGPSInfo=(PGPSINFO)LocalAlloc(LPTR,sizeof(GPSINFO)return(LRESULT)-1);hGPSWnd=hWnd;COMDEV(npGPSInfo)=0;CONNECTED(npGPSInfo)=FA

7、LSE;PORT(npGPSInfo)=nPort;BAUDRATE(npGPSInfo)=CBR_9600;BYTESIZE(npGPSInfo)=8;PARITY(npGPSInfo)=NOPARITY;STOPBITS(npGPSInfo)=ONESTOPBIT;WRITE_OS(npGPSInfo).Offset=0;WRITE_OS(npGPSInfo).OffsetHigh=0;READ_OS(npGPSInfo).Offset=0;READ_OS(npGPSInfo).OffsetHigh=0;/create I/O event used for overlapped reads

8、/writes READ_OS(npGPSInfo).hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);if(READ_OS(npGPSInfo).hEvent=NULL)LocalFree(npGPSInfo);return(-1);WRITE_OS(npGPSInfo).hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);if(NULL=WRITE_OS(npGPSInfo).hEvent)CloseHandle(READ_OS(npGPSInfo).hEvent);LocalFree(npGPSInfo);return(-1)

9、;return(LRESULT)TRUE);BOOL NEAR DestroyGPSInfo()if(!npGPSInfo)return(FALSE);if(CONNECTED(npGPSInfo)CloseConnection();CloseHandle(READ_OS(npGPSInfo).hEvent);CloseHandle(WRITE_OS(npGPSInfo).hEvent);CloseHandle(POSTEVENT(npGPSInfo);LocalFree(npGPSInfo);return(TRUE);BOOL NEAR OpenConnection()char szPort

10、15;BOOL fRetVal;HCURSOR hOldCursor,hWaitCursor;HANDLE hCommWatchThread;DWORD dwThreadID;COMMTIMEOUTS CommTimeOuts;if(!npGPSInfo)return(FALSE);hWaitCursor=LoadCursor(NULL,IDC_WAIT);hOldCursor=SetCursor(hWaitCursor);wsprintf(szPort,COM%d,PORT(npGPSInfo);if(COMDEV(npGPSInfo)=CreateFile(szPort,GENERIC_R

11、EAD|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL)=(HANDLE)-1)return(FALSE);else SetCommMask(COMDEV(npGPSInfo),EV_RXCHAR);SetupComm(COMDEV(npGPSInfo),4096,4096);PurgeComm(COMDEV(npGPSInfo),PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);CommTimeOuts.Read

12、IntervalTimeout=0 xFFFFFFFF;CommTimeOuts.ReadTotalTimeoutMultiplier=0;CommTimeOuts.ReadTotalTimeoutConstant=1000;CommTimeOuts.WriteTotalTimeoutMultiplier=0;CommTimeOuts.WriteTotalTimeoutConstant=1000;SetCommTimeouts(COMDEV(npGPSInfo),&CommTimeOuts);fRetVal=SetupConnection();if(fRetVal)CONNECTED(npGP

13、SInfo)=TRUE;if(NULL=(hCommWatchThread=CreateThread(LPSECURITY_ATTRIBUTES)NULL,0,(LPTHREAD_START_ROUTINE)CommWatchProc,(LPVOID)NULL,0,&dwThreadID)CONNECTED(npGPSInfo)=FALSE;CloseHandle(COMDEV(npGPSInfo);fRetVal=FALSE;else THREADID(npGPSInfo)=dwThreadID;HTHREAD(npGPSInfo)=hCommWatchThread;EscapeCommFu

14、nction(COMDEV(npGPSInfo),SETDTR);else CONNECTED(npGPSInfo)=FALSE;CloseHandle(COMDEV(npGPSInfo);SetCursor(hOldCursor);return(fRetVal);BOOL NEAR SetupConnection()BOOL fRetVal;DCB dcb;if(!npGPSInfo)return(FALSE);dcb.DCBlength=sizeof(DCB);GetCommState(COMDEV(npGPSInfo),&dcb);dcb.BaudRate=BAUDRATE(npGPSI

15、nfo);dcb.ByteSize=BYTESIZE(npGPSInfo);dcb.Parity=PARITY(npGPSInfo);dcb.StopBits=STOPBITS(npGPSInfo);dcb.fOutxDsrFlow=FALSE;dcb.fDtrControl=DTR_CONTROL_ENABLE;dcb.fOutxCtsFlow=FALSE;dcb.fRtsControl=RTS_CONTROL_ENABLE;dcb.fInX=dcb.fOutX=FALSE;dcb.fBinary=TRUE;dcb.fParity=TRUE;fRetVal=SetCommState(COMD

16、EV(npGPSInfo),&dcb);return(fRetVal);BOOL NEAR CloseConnection()if(!npGPSInfo)return(FALSE);CONNECTED(npGPSInfo)=FALSE;SetCommMask(COMDEV(npGPSInfo),0);while(THREADID(npGPSInfo)!=0);EscapeCommFunction(COMDEV(npGPSInfo),CLRDTR);PurgeComm(COMDEV(npGPSInfo),PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURG

17、E_RXCLEAR);CloseHandle(COMDEV(npGPSInfo);return(TRUE);int NEAR ReadCommBlock(LPSTR lpszBlock,int nMaxLength)BOOL fReadStat;COMSTAT ComStat;DWORD dwErrorFlags;DWORD dwLength;DWORD dwError;if(!npGPSInfo)return(FALSE);ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat);dwLength=min(DWORD)nMaxLengt

18、h,ComStat.cbInQue);if(dwLength0)fReadStat=ReadFile(COMDEV(npGPSInfo),lpszBlock,dwLength,&dwLength,&READ_OS(npGPSInfo);if(!fReadStat)if(GetLastError()=ERROR_IO_PENDING)OutputDebugString(nrIO Pending);while(!GetOverlappedResult(COMDEV(npGPSInfo),&READ_OS(npGPSInfo),&dwLength,TRUE)dwError=GetLastError(

19、);if(dwError=ERROR_IO_INCOMPLETE)continue;else dwLength=0;ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat);return(dwLength);BOOL NEAR WriteCommBlock(LPSTR lpByte,DWORD dwBytesToWrite)BOOL fWriteStat;DWORD dwBytesWritten;DWORD dwErrorFlags;DWORD dwError;COMSTAT ComStat;if(!npGPSInfo)return(FA

20、LSE);fWriteStat=WriteFile(COMDEV(npGPSInfo),lpByte,dwBytesToWrite,&dwBytesWritten,&WRITE_OS(npGPSInfo);if(!fWriteStat)if(GetLastError()=ERROR_IO_PENDING)while(!GetOverlappedResult(COMDEV(npGPSInfo),&WRITE_OS(npGPSInfo),&dwBytesWritten,TRUE)dwError=GetLastError();if(dwError=ERROR_IO_INCOMPLETE)contin

21、ue;else ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat);break;else ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat);return(FALSE);return(TRUE);DWORD FAR PASCAL CommWatchProc(LPSTR)DWORD dwEvtMask;OVERLAPPED os;int nLength;BYTE abIn1024;memset(&os,0,sizeof(OVERLAPPED);/create I/O eve

22、nt used for overlapped read os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);if(os.hEvent=NULL)MessageBox(NULL,Failed to create event for thread!,GPS Error!,MB_ICONEXCLAMATION|MB_OK);return(FALSE);if(!SetCommMask(COMDEV(npGPSInfo),EV_RXCHAR)return(FALSE);while(CONNECTED(npGPSInfo)dwEvtMask=0;WaitCommEven

23、t(COMDEV(npGPSInfo),&dwEvtMask,NULL);if(dwEvtMask&EV_RXCHAR)=EV_RXCHAR)do if(nLength=ReadCommBlock(LPSTR)abIn,1024)/WriteCommBlock(LPSTR)abIn,nLength);*(abIn+nLength)=0;:SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn);while(nLength0)&(CONNECTED(npGPSInfo);CloseHandle(os.hEvent);THREADID(npGPS

24、Info)=0;HTHREAD(npGPSInfo)=NULL;return(TRUE);就这些了,希望能对问这些问题的朋友有所帮助!一般使用的顺序是:CreateGPSInfo(被通知的窗口句柄,串口端口号 1 或 2);OpenConnection();/建立联结它会调用 SetupConnectionDestroyGPSInfo();/解除联结它会调用 CloseConnection可以用 ReadCommBlock/WriteCommBlock 来读/写串口CommWatchProc 是监视串口的线程,由 OpenConnection 建立当串口有数据来的时侯,它会通知被通知的窗口句柄的窗口数据传到的消息(自定义的):SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn);

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

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com