首页 新闻 工控搜 论坛 厂商论坛 产品 方案 厂商 人才 文摘 下载 展览
中华工控网首页
  P L C | 变频器与传动 | 传感器 | 现场检测仪表 | 工控软件 | 人机界面 | 运动控制
  D C S | 工业以太网 | 现场总线 | 显示调节仪表 | 数据采集 | 数传测控 | 工业安全
  电 源 | 嵌入式系统 | PC based | 机柜箱体壳体 | 低压电器 | 机器视觉
用 VC 在win95下编写用于串行通讯的程序
中华工控网
收藏本文     查看收藏
用 VC 在win95下编写用于串行通讯的程序 </P><P> <BR> 源自<img align=absmiddle src=pic/url.gif border=0><a target=_blank href=http://www.sixthnet.com/netech/articles/195.htm>http://www.sixthnet.com/netech/articles/195.htm<;/a></P><P> 头文件(.H) </P><P> #include "StdAfx.h" </P><P> #define GWL_PGPSINFO 0 <BR> #define GPSEXTRABYTES sizeof( LONG ) </P><P> #define MAXPORTS 4 </P><P> #define CN_SEND WM_USER+100 </P><P> #define RXQUEUE 4096 <BR> #define TXQUEUE 4096 </P><P> // cursor states </P><P> #define CS_HIDE 0x00 <BR> #define CS_SHOW 0x01 </P><P> // Flow control flags </P><P> #define FC_DTRDSR 0x01 <BR> #define FC_RTSCTS 0x02 <BR> #define FC_XONXOFF 0x04 </P><P> // ascii definitions </P><P> #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 </P><P> // data structures </P><P> typedef struct tagGPSINFO <BR> { <BR> HANDLE idComDev; <BR> BYTE bPort; <BR> BOOL fConnected; <BR> BYTE bByteSize,bParity,bStopBits; <BR> DWORD dwBaudRate; </P><P> HANDLE hPostEvent,hWatchThread,hWatchEvent; <BR> HWND hTermWnd; <BR> DWORD dwThreadID; <BR> OVERLAPPED osWrite,osRead; <BR> } GPSINFO, *PGPSINFO ; </P><P> #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) </P><P> #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) </P><P> // function prototypes (private) </P><P> LRESULT NEAR CreateGPSInfo(HWND,BYTE nPort=1); <BR> BOOL NEAR DestroyGPSInfo(); </P><P> int NEAR ReadCommBlock(LPSTR,int); <BR> BOOL NEAR WriteCommBlock(LPSTR,DWORD); <BR> BOOL NEAR OpenConnection(); <BR> BOOL NEAR SetupConnection(); <BR> BOOL NEAR CloseConnection(); </P><P> // function prototypes (public) </P><P> DWORD FAR PASCAL CommWatchProc(LPSTR); <BR> CPP实现部分: </P><P> #include "StdAfx.h" <BR> #include "Com.h" </P><P> HWND hGPSWnd=NULL; <BR> PGPSINFO npGPSInfo=NULL; </P><P> LRESULT NEAR CreateGPSInfo(HWND hWnd,BYTE nPort) <BR> { <BR> if (NULL==(npGPSInfo=(PGPSINFO)LocalAlloc(LPTR,sizeof(GPSINFO)))) <BR> return ((LRESULT)-1) ; </P><P> hGPSWnd=hWnd; </P><P> 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; </P><P> WRITE_OS(npGPSInfo).Offset=0; <BR> WRITE_OS(npGPSInfo).OffsetHigh=0; <BR> READ_OS(npGPSInfo).Offset=0; <BR> READ_OS(npGPSInfo).OffsetHigh=0; </P><P> // create I/O event used for overlapped reads / writes </P><P> 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> } </P><P> return ( (LRESULT) TRUE ) ; <BR> } </P><P> BOOL NEAR DestroyGPSInfo() <BR> { <BR> if (!npGPSInfo) return (FALSE); </P><P> if (CONNECTED(npGPSInfo)) CloseConnection(); </P><P> CloseHandle(READ_OS(npGPSInfo).hEvent); <BR> CloseHandle(WRITE_OS(npGPSInfo).hEvent); <BR> CloseHandle(POSTEVENT(npGPSInfo)); </P><P> LocalFree(npGPSInfo); <BR> return (TRUE); <BR> } </P><P> BOOL NEAR OpenConnection() <BR> { <BR> char szPort[15]; <BR> BOOL fRetVal; <BR> HCURSOR hOldCursor,hWaitCursor; </P><P> HANDLE hCommWatchThread; <BR> DWORD dwThreadID; <BR> COMMTIMEOUTS CommTimeOuts; </P><P> if (!npGPSInfo) return (FALSE); </P><P> hWaitCursor=LoadCursor(NULL,IDC_WAIT) ; <BR> hOldCursor=SetCursor(hWaitCursor) ; </P><P> wsprintf(szPort,"COM%d",PORT(npGPSInfo)); </P><P> if ((COMDEV(npGPSInfo)=CreateFile(szPort,GENERIC_READ|GENERIC_WRITE, <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> PurgeComm(COMDEV(npGPSInfo),PURGE_TXABORT|PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR); <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> } </P><P> fRetVal=SetupConnection(); </P><P> if (fRetVal) <BR> { CONNECTED(npGPSInfo)=TRUE; <BR> if (NULL==(hCommWatchThread=CreateThread((LPSECURITY_ATTRIBUTES)NULL, <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> } </P><P> SetCursor(hOldCursor); <BR> return (fRetVal); <BR> } </P><P> BOOL NEAR SetupConnection() <BR> { BOOL fRetVal; <BR> DCB dcb; </P><P> if (!npGPSInfo) return(FALSE); </P><P> dcb.DCBlength=sizeof(DCB); </P><P> GetCommState(COMDEV(npGPSInfo),&dcb); </P><P> dcb.BaudRate=BAUDRATE(npGPSInfo); <BR> dcb.ByteSize=BYTESIZE(npGPSInfo); <BR> dcb.Parity=PARITY(npGPSInfo); <BR> dcb.StopBits=STOPBITS(npGPSInfo); </P><P> dcb.fOutxDsrFlow=FALSE; <BR> dcb.fDtrControl=DTR_CONTROL_ENABLE; </P><P> dcb.fOutxCtsFlow=FALSE; <BR> dcb.fRtsControl=RTS_CONTROL_ENABLE; <BR> dcb.fInX=dcb.fOutX=FALSE; <BR> dcb.fBinary=TRUE; <BR> dcb.fParity=TRUE; </P><P> fRetVal=SetCommState(COMDEV(npGPSInfo),&dcb); <BR> return (fRetVal); <BR> } </P><P> BOOL NEAR CloseConnection() <BR> { <BR> if (!npGPSInfo) return(FALSE); </P><P> CONNECTED(npGPSInfo)=FALSE; </P><P> SetCommMask(COMDEV(npGPSInfo),0); <BR> while(THREADID(npGPSInfo)!=0); </P><P> EscapeCommFunction(COMDEV(npGPSInfo),CLRDTR); <BR> PurgeComm(COMDEV(npGPSInfo),PURGE_TXABORT|PURGE_RXABORT| <BR> PURGE_TXCLEAR|PURGE_RXCLEAR); <BR> CloseHandle(COMDEV(npGPSInfo)); </P><P> return (TRUE); <BR> } </P><P> int NEAR ReadCommBlock(LPSTR lpszBlock,int nMaxLength) <BR> { <BR> BOOL fReadStat ; <BR> COMSTAT ComStat ; <BR> DWORD dwErrorFlags; <BR> DWORD dwLength; <BR> DWORD dwError; </P><P> if (!npGPSInfo) return(FALSE); </P><P> ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat); <BR> dwLength=min((DWORD)nMaxLength,ComStat.cbInQue); </P><P> if (dwLength>0) <BR> { fReadStat=ReadFile(COMDEV(npGPSInfo),lpszBlock, <BR> dwLength,&dwLength,&READ_OS(npGPSInfo)); <BR> if (!fReadStat) <BR> { if (GetLastError()==ERROR_IO_PENDING) <BR> { OutputDebugString("\n\rIO Pending"); <BR> while(!GetOverlappedResult(COMDEV(npGPSInfo),&READ_OS(npGPSInfo),&dwLength,TRUE)) <BR> { dwError=GetLastError(); <BR> if(dwError == ERROR_IO_INCOMPLETE) continue; <BR> } </P><P> } <BR> else <BR> { dwLength=0; <BR> ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat); <BR> } <BR> } <BR> } <BR> return ( dwLength ) ; <BR> } </P><P> BOOL NEAR WriteCommBlock(LPSTR lpByte,DWORD dwBytesToWrite) <BR> { BOOL fWriteStat; <BR> DWORD dwBytesWritten; <BR> DWORD dwErrorFlags; <BR> DWORD dwError; <BR> COMSTAT ComStat; </P><P> if (!npGPSInfo) return(FALSE); </P><P> fWriteStat=WriteFile(COMDEV(npGPSInfo),lpByte,dwBytesToWrite, <BR> &dwBytesWritten,&WRITE_OS(npGPSInfo)); </P><P> 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) continue; <BR> else <BR> { ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat); <BR> break; <BR> } <BR> } <BR> } <BR> else <BR> { ClearCommError(COMDEV(npGPSInfo),&dwErrorFlags,&ComStat); <BR> return ( FALSE ); <BR> } <BR> } <BR> return ( TRUE ) ; </P><P> } </P><P> DWORD FAR PASCAL CommWatchProc(LPSTR) <BR> { DWORD dwEvtMask; <BR> OVERLAPPED os; <BR> int nLength; <BR> BYTE abIn[1024]; </P><P> memset(&os,0,sizeof(OVERLAPPED)); </P><P> // create I/O event used for overlapped read </P><P> os.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); <BR> if (os.hEvent==NULL) <BR> { MessageBox(NULL,"Failed to create event for thread!","GPS Error!",MB_ICONEXCLAMATION|MB_OK); <BR> return ( FALSE ) ; <BR> } </P><P> if (!SetCommMask(COMDEV(npGPSInfo),EV_RXCHAR)) return (FALSE); </P><P> while (CONNECTED( npGPSInfo)) <BR> { dwEvtMask=0 ; <BR> WaitCommEvent(COMDEV(npGPSInfo),&dwEvtMask,NULL); </P><P> if ((dwEvtMask&EV_RXCHAR)==EV_RXCHAR) <BR> { do <BR> { if (nLength=ReadCommBlock((LPSTR)abIn,1024)) <BR> { //WriteCommBlock((LPSTR)abIn,nLength ); <BR> *(abIn+nLength)=0; <BR> ::SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn); <BR> } <BR> } <BR> while ((nLength>0)&&(CONNECTED( npGPSInfo))); <BR> } <BR> } </P><P> CloseHandle(os.hEvent); <BR> THREADID(npGPSInfo)=0; <BR> HTHREAD(npGPSInfo)=NULL; <BR> return(TRUE); <BR> } <BR> 一般使用的顺序是: <BR> CreateGPSInfo(被通知的窗口句柄,串口端口号1或2); <BR> OpenConnection();//建立联结它会调用SetupConnection <BR> DestroyGPSInfo();//解除联结它会调用CloseConnection </P><P> 可以用ReadCommBlock/WriteCommBlock来读/写串口 <BR> CommWatchProc是监视串口的线程,由OpenConnection建立 </P><P> 当串口有数据来的时侯,它会通知'被通知的窗口句柄'的窗口数据传到的消息(自定义的) <BR> ∶:SendMessage(hGPSWnd,CN_SEND,nLength,(LONG)(LPSTR)abIn); </P><P> <BR>
 

状 态: 离线

公司简介
产品目录

公司名称: 中华工控网
联 系 人: 客服中心
电  话: 0755-26546361
传  真: 0755-26585268
地  址: 深圳市南山区创业路现代城华庭1栋6A
邮  编: 518054
主  页:
 
该厂商相关技术文摘:
智能仪器仪表的发展特点与前景分析
电动机性能虚拟仪器测试系统设计与实现
视频监控护航高铁安全运营
基于PLC,触摸屏及变频器对吹膜机的改造
永宏PLC应用于自助图书借还终端机
基于永宏PLC的GSM通讯原理及其应用
改善汽车生态学、安全性和舒适性,四大测试分析是关键
改善汽车生态学、安全性和舒适性,四大测试分析是关键
数控技术的发展趋势及产业化
数控技术发展战略与发展途径的思考
用Energid 的软件进行机器人的抓取和操作
如何借助RFID技术升级企业信息管理水平
更多文摘...
立即发送询问信息在线联系该技术文摘厂商:
用户名: 密码: 免费注册为中华工控网会员
请留下您的有效联系方式,以方便我们及时与您联络

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 不良信息举报
工控网客服热线:0755-86369299
版权所有 中华工控网 Copyright©2022 Gkong.com, All Rights Reserved