📄 lc_bcb_60.html
字号:
<html>
<head>
<title>Window 95串口通讯函数集合</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<p align=center><b><font size="4">Window 95串口通讯函数集合(只适用于32位)</font> </b></p>
<p><br>
<br>
需要说明的是:这是程序的一部分,因此有一些与具体应用无关的部分。 <br>
关键是原理,而不是程序本身.后面有些使用介绍,帮助理解这长的程序。 <br>
<br>
头文件(.H) <br>
<br>
#include "StdAfx.h" <br>
<br>
#define GWL_PGPSINFO 0 <br>
#define GPSEXTRABYTES sizeof( LONG ) <br>
<br>
#define MAXPORTS 4 <br>
<br>
#define CN_SEND WM_USER+100 <br>
<br>
#define RXQUEUE 4096 <br>
#define TXQUEUE 4096 <br>
<br>
<br>
// cursor states <br>
<br>
#define CS_HIDE 0x00 <br>
#define CS_SHOW 0x01 <br>
<br>
// Flow control flags <br>
<br>
#define FC_DTRDSR 0x01 <br>
#define FC_RTSCTS 0x02 <br>
#define FC_XONXOFF 0x04 <br>
<br>
// ascii definitions <br>
<br>
#define ASCII_BEL 0x07 <br>
#define ASCII_BS 0x08 <br>
#define ASCII_LF 0x0A <br>
#define ASCII_CR 0x0D <br>
#define ASCII_XON 0x11 <br>
#define ASCII_XOFF 0x13 <br>
<br>
// data structures <br>
<br>
<br>
typedef struct tagGPSINFO <br>
{ <br>
HANDLE idComDev; <br>
BYTE bPort; <br>
BOOL fConnected; <br>
BYTE bByteSize,bParity,bStopBits; <br>
DWORD dwBaudRate; <br>
<br>
HANDLE hPostEvent,hWatchThread,hWatchEvent; <br>
HWND hTermWnd; <br>
DWORD dwThreadID; <br>
OVERLAPPED osWrite,osRead; <br>
} GPSINFO, *PGPSINFO ; <br>
<br>
#define COMDEV( x ) (x -> idComDev) <br>
#define PORT( x ) (x -> bPort) <br>
#define CONNECTED( x ) (x -> fConnected) <br>
#define BYTESIZE( x ) (x -> bByteSize) <br>
#define PARITY( x ) (x -> bParity) <br>
#define STOPBITS( x ) (x -> bStopBits) <br>
#define BAUDRATE( x ) (x -> dwBaudRate) <br>
<br>
<br>
#define POSTEVENT( x ) (x -> hPostEvent) <br>
#define HTHREAD( x ) (x -> hWatchThread) <br>
#define THREADID( x ) (x -> dwThreadID) <br>
#define WRITE_OS( x ) (x -> osWrite) <br>
#define READ_OS( x ) (x -> osRead) <br>
<br>
// function prototypes (private) <br>
<br>
LRESULT NEAR CreateGPSInfo(HWND,BYTE nPort=1); <br>
BOOL NEAR DestroyGPSInfo(); <br>
<br>
int NEAR ReadCommBlock(LPSTR,int); <br>
BOOL NEAR WriteCommBlock(LPSTR,DWORD); <br>
BOOL NEAR OpenConnection(); <br>
BOOL NEAR SetupConnection(); <br>
BOOL NEAR CloseConnection(); <br>
<br>
// function prototypes (public) <br>
<br>
DWORD FAR PASCAL CommWatchProc(LPSTR); <br>
<br>
<br>
<br>
具体实现请看下文(为了这文章,我都段线2次了) <br>
<br>
CPP实现部分: <br>
<br>
#include "StdAfx.h" <br>
#include "Com.h" <br>
<br>
HWND hGPSWnd=NULL; <br>
PGPSINFO npGPSInfo=NULL; <br>
<br>
LRESULT NEAR CreateGPSInfo(HWND hWnd,BYTE nPort) <br>
{ <br>
if (NULL==(npGPSInfo=(PGPSINFO)LocalAlloc(LPTR,sizeof(GPSINFO)))) <br>
return ((LRESULT)-1) ; <br>
<br>
hGPSWnd=hWnd; <br>
<br>
COMDEV(npGPSInfo)=0; <br>
CONNECTED(npGPSInfo)=FALSE; <br>
PORT(npGPSInfo)=nPort; <br>
BAUDRATE(npGPSInfo)=CBR_9600; <br>
BYTESIZE(npGPSInfo)=8; <br>
PARITY(npGPSInfo)=NOPARITY; <br>
STOPBITS(npGPSInfo)=ONESTOPBIT; <br>
<br>
WRITE_OS(npGPSInfo).Offset=0; <br>
WRITE_OS(npGPSInfo).OffsetHigh=0; <br>
READ_OS(npGPSInfo).Offset=0; <br>
READ_OS(npGPSInfo).OffsetHigh=0; <br>
<br>
// create I/O event used for overlapped reads / writes <br>
<br>
READ_OS(npGPSInfo).hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); <br>
if (READ_OS(npGPSInfo).hEvent==NULL) <br>
{ LocalFree( npGPSInfo ) ; <br>
return ( -1 ) ; <br>
} <br>
WRITE_OS(npGPSInfo).hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); <br>
if (NULL==WRITE_OS(npGPSInfo).hEvent) <br>
{ CloseHandle(READ_OS(npGPSInfo).hEvent); <br>
LocalFree(npGPSInfo) ; <br>
return (-1) ; <br>
} <br>
<br>
<br>
return ( (LRESULT) TRUE ) ; <br>
} <br>
<br>
BOOL NEAR DestroyGPSInfo() <br>
{ <br>
if (!npGPSInfo) return (FALSE); <br>
<br>
if (CONNECTED(npGPSInfo)) CloseConnection(); <br>
<br>
CloseHandle(READ_OS(npGPSInfo).hEvent); <br>
CloseHandle(WRITE_OS(npGPSInfo).hEvent); <br>
CloseHandle(POSTEVENT(npGPSInfo)); <br>
<br>
LocalFree(npGPSInfo); <br>
return (TRUE); <br>
} <br>
<br>
BOOL NEAR OpenConnection() <br>
{ <br>
char szPort[15]; <br>
BOOL fRetVal; <br>
HCURSOR hOldCursor,hWaitCursor; <br>
<br>
HANDLE hCommWatchThread; <br>
DWORD dwThreadID; <br>
COMMTIMEOUTS CommTimeOuts; <br>
<br>
if (!npGPSInfo) return (FALSE); <br>
<br>
hWaitCursor=LoadCursor(NULL,IDC_WAIT) ; <br>
hOldCursor=SetCursor(hWaitCursor) ; <br>
<br>
wsprintf(szPort,"COM%d",PORT(npGPSInfo)); <br>
<br>
if <br>
((COMDEV(npGPSInfo)=CreateFile(szPort,GENERIC_READ|GENERIC_WRITE, <br>
<br>
0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, <br>
NULL))==(HANDLE)-1) <br>
return ( FALSE ) ; <br>
else <br>
{ SetCommMask(COMDEV(npGPSInfo),EV_RXCHAR); <br>
SetupComm(COMDEV(npGPSInfo),4096,4096); <br>
<br>
<br>
PurgeComm(COMDEV(npGPSInfo),PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR| <br>
<br>
PURGE_R <br>
XCLEAR); <br>
CommTimeOuts.ReadIntervalTimeout=0xFFFFFFFF; <br>
CommTimeOuts.ReadTotalTimeoutMultiplier=0; <br>
CommTimeOuts.ReadTotalTimeoutConstant=1000; <br>
CommTimeOuts.WriteTotalTimeoutMultiplier=0; <br>
CommTimeOuts.WriteTotalTimeoutConstant=1000; <br>
SetCommTimeouts(COMDEV(npGPSInfo),&CommTimeOuts); <br>
} <br>
<br>
fRetVal=SetupConnection(); <br>
<br>
if (fRetVal) <br>
{ CONNECTED(npGPSInfo)=TRUE; <br>
if <br>
(NULL==(hCommWatchThread=CreateThread((LPSECURITY_ATTRIBUTES)NULL, <br>
<br>
0,(LPTHREAD_START_ROUTINE)CommWatchProc, <br>
(LPVOID)NULL,0,&dwThreadID))) <br>
{ CONNECTED(npGPSInfo)=FALSE; <br>
CloseHandle(COMDEV(npGPSInfo)); <br>
fRetVal=FALSE; <br>
} <br>
else <br>
{ THREADID(npGPSInfo)=dwThreadID; <br>
HTHREAD(npGPSInfo)=hCommWatchThread; <br>
EscapeCommFunction(COMDEV(npGPSInfo),SETDTR); <br>
} <br>
} <br>
else <br>
{ CONNECTED(npGPSInfo)=FALSE; <br>
CloseHandle(COMDEV(npGPSInfo)); <br>
} <br>
<br>
SetCursor(hOldCursor); <br>
return (fRetVal); <br>
} <br>
<br>
BOOL NEAR SetupConnection() <br>
{ BOOL fRetVal; <br>
DCB dcb; <br>
<br>
<br>
if (!npGPSInfo) return(FALSE); <br>
<br>
dcb.DCBlength=sizeof(DCB); <br>
<br>
GetCommState(COMDEV(npGPSInfo),&dcb); <br>
<br>
dcb.BaudRate=BAUDRATE(npGPSInfo); <br>
dcb.ByteSize=BYTESIZE(npGPSInfo); <br>
dcb.Parity=PARITY(npGPSInfo); <br>
dcb.StopBits=STOPBITS(npGPSInfo); <br>
<br>
dcb.fOutxDsrFlow=FALSE; <br>
dcb.fDtrControl=DTR_CONTROL_ENABLE; <br>
<br>
dcb.fOutxCtsFlow=FALSE; <br>
dcb.fRtsControl=RTS_CONTROL_ENABLE; <br>
dcb.fInX=dcb.fOutX=FALSE; <br>
dcb.fBinary=TRUE; <br>
dcb.fParity=TRUE; <br>
<br>
fRetVal=SetCommState(COMDEV(npGPSInfo),&dcb); <br>
return (fRetVal); <br>
} <br>
<br>
BOOL NEAR CloseConnection() <br>
{ <br>
if (!npGPSInfo) return(FALSE); <br>
<br>
CONNECTED(npGPSInfo)=FALSE; <br>
<br>
SetCommMask(COMDEV(npGPSInfo),0); <br>
while(THREADID(npGPSInfo)!=0); <br>
<br>
EscapeCommFunction(COMDEV(npGPSInfo),CLRDTR); <br>
PurgeComm(COMDEV(npGPSInfo),PURGE_TXABORT|PURGE_RXABORT| <br>
PURGE_TXCLEAR|PURGE_RXCLEAR); <br>
CloseHandle(COMDEV(npGPSInfo)); <br>
<br>
return (TRUE); <br>
} <br>
<br>
int NEAR ReadCommBlock(LPSTR lpszBlock,int nMaxLength) <br>
{ <br>
BOOL fReadStat ; <br>
COMSTAT ComStat ; <br>
DWORD dwErrorFlags; <br>
DWORD dwLength; <br>
DWORD dwError; <br>
<br>
if (!npGPSInfo) return(FALSE); <br>
<br>
ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat); <br>
dwLength=min((DWORD)nMaxLength,ComStat.cbInQue); <br>
<br>
if (dwLength>0) <br>
{ fReadStat=ReadFile(COMDEV(npGPSInfo),lpszBlock, <br>
<br>
dwLength,&dwLength,&READ_OS(npGPSInfo)); <br>
if (!fReadStat) <br>
{ if (GetLastError()==ERROR_IO_PENDING) <br>
{ OutputDebugString("\n\rIO Pending"); <br>
<br>
while(!GetOverlappedResult(COMDEV(npGPSInfo),&READ_OS(npGPSInfo),&dwLe
<br>
<br>
ngth,TR <br>
UE)) <br>
UE)) <br>
{ dwError=GetLastError(); <br>
if(dwError == ERROR_IO_INCOMPLETE) <br>
continue; <br>
} <br>
<br>
} <br>
else <br>
{ dwLength=0; <br>
<br>
ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat); <br>
} <br>
} <br>
} <br>
return ( dwLength ) ; <br>
} <br>
<br>
BOOL NEAR WriteCommBlock(LPSTR lpByte,DWORD dwBytesToWrite) <br>
{ BOOL fWriteStat; <br>
DWORD dwBytesWritten; <br>
DWORD dwErrorFlags; <br>
DWORD dwError; <br>
COMSTAT ComStat; <br>
<br>
if (!npGPSInfo) return(FALSE); <br>
<br>
fWriteStat=WriteFile(COMDEV(npGPSInfo),lpByte,dwBytesToWrite, <br>
&dwBytesWritten,&WRITE_OS(npGPSInfo)); <br>
<br>
if (!fWriteStat) <br>
{ if(GetLastError()==ERROR_IO_PENDING) <br>
{ while(!GetOverlappedResult(COMDEV(npGPSInfo), <br>
&WRITE_OS(npGPSInfo),&dwBytesWritten,TRUE)) <br>
{ dwError=GetLastError(); <br>
if(dwError == ERROR_IO_INCOMPLETE) <br>
continue; <br>
else <br>
{ <br>
ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat); <br>
break; <br>
} <br>
} <br>
} <br>
else <br>
{ <br>
{ <br>
ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat); <br>
return ( FALSE ); <br>
} <br>
} <br>
return ( TRUE ) ; <br>
<br>
} <br>
<br>
DWORD FAR PASCAL CommWatchProc(LPSTR) <br>
{ DWORD dwEvtMask; <br>
OVERLAPPED os; <br>
int nLength; <br>
BYTE abIn[1024]; <br>
<br>
memset(&os,0,sizeof(OVERLAPPED)); <br>
<br>
// create I/O event used for overlapped read <br>
<br>
os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); <br>
if (os.hEvent==NULL) <br>
{ MessageBox(NULL,"Failed to create event for thread!","GPS <br>
Error!",MB_ICONEXCLAMATION|MB_OK); <br>
return ( FALSE ) ; <br>
} <br>
<br>
if (!SetCommMask(COMDEV(npGPSInfo),EV_RXCHAR)) return (FALSE); <br>
<br>
while (CONNECTED( npGPSInfo)) <br>
{ dwEvtMask=0 ; <br>
WaitCommEvent(COMDEV(npGPSInfo),&dwEvtMask,NULL); <br>
<br>
if ((dwEvtMask&EV_RXCHAR)==EV_RXCHAR) <br>
{ do <br>
{ if <br>
(nLength=ReadCommBlock((LPSTR)abIn,1024)) <br>
{ <br>
//WriteCommBlock((LPSTR)abIn,nLength ); <br>
*(abIn+nLength)=0; <br>
<br>
::SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn); <br>
} <br>
} <br>
while ((nLength>0)&&(CONNECTED( npGPSInfo))); <br>
} <br>
} <br>
} <br>
<br>
CloseHandle(os.hEvent); <br>
THREADID(npGPSInfo)=0; <br>
HTHREAD(npGPSInfo)=NULL; <br>
return(TRUE); <br>
} <br>
<br>
<br>
就这些了,希望能对问这些问题的朋友有所帮助! <br>
<br>
一般使用的顺序是: <br>
CreateGPSInfo(被通知的窗口句柄,串口端口号1或2); <br>
OpenConnection();//建立联结它会调用SetupConnection <br>
DestroyGPSInfo();//解除联结它会调用CloseConnection <br>
<br>
可以用ReadCommBlock/WriteCommBlock来读/写串口 <br>
CommWatchProc是监视串口的线程,由OpenConnection建立 <br>
<br>
<br>
当串口有数据来的时侯,它会通知'被通知的窗口句柄'的窗口数据传到的消息(自 <br>
<br>
定义的) <br>
SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn); <br>
<br>
好了,文章结束了!希望能帮助你! <br>
<br>
</p>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -