1、WRITE,0,NULL,OPEN?EXISTING,FILE?ATTRIBUTE?NORMAL,NULL)=INVALID?HANDLE?VALUE) return FALSE;/设置超时控制 SetCommTimeouts(hComDev,timeouts);/设置接收缓冲区和输出缓冲区的大小 SetupComm(hComDev,1024,512);/获取缺省的DCB结构的值 GetCommState(hComDev,dcb);/设定波特率为9600 bps dcb.BaudRate=CBR?9600;/设定无奇偶校验 dcb.fParity=NOPARITY;/设定数据位为8 dcb.B
2、yteSize=8;/设定一个停止位 dcb.StopBits=ONESTOPBIT;/监视串口的错误和接收到字符两种事件 SetCommMask(hComDev,EV?ERR|EV?RXCHAR);/设置串行设备控制参数 SetCommState(hComDev,dcb);bOpen=TRUE;/创建人工重设、未发信号的事件 hEvent=CreateEvent(NULL,FALSE,FALSE, “WatchEvent”);/创建一个事件监视线程来监视串口事件 AfxBeginThread(CommWatchProc,pParam);在设置串口DCB结构的参数时,不必设置每一个值。首先读出
3、DCB缺省的参数设置,然后只修改必要的参数,其他参数都取缺省值。由于对串口进行的是同步I/O操作,所以除非指定进行监测的事件发生,否则WaitCommEvent()函数不会返回。在串行设备初始化的最后要建立一个单独的监视线程来监视串口事件,以免挂起当前调用线程,其中pParam可以是一个对事件进行处理的窗口类指针。如果要进行异步I/O操作,打开设备句柄时,CreateFile的第6个参数应增加FILE?FLAG?OVERLAPPED 标志。数据发送 数据发送利用WriteFile()函数实现。对于同步I/O操作,它的最后一个参数可为NULL;而对异步I/O操作,它的最后一个参数必需是一个指向O
4、VERLAPPED结构的指针,通过OVERLAPPED结构来获得当前的操作状态。BOOL WriteComm(LPCVOID lpSndBuffer,DWORD dwBytesToWrite) /lpSndBuffer为发送数据缓冲区指针, dwBytesToWrite为将要发送的字节长度 /设备已打开 BOOL bWriteState;/实际发送的字节数 DWORD dwBytesWritten;/设备未打开 if(!bOpen) return FALSE;bWriteState=WriteFile(hComDev,lpSndBuffer,dwBytesToWrite,dwBytesWrit
5、ten,NULL);bWriteState | dwBytesToWrite!=dwBytesWritten) /发送失败 return FALSE;else /发送成功 return TRUE; 数据接收 接收数据的任务由ReadFile函数完成。该函数从串口接收缓冲区中读取数据,读取数据前,先用ClearCommError函数获得接收缓冲区中的字节数。接收数据时,同步和异步读取的差别同发送数据是一样的。DWORD ReadComm(LPVOID lpInBuffer,DWORD dwBytesToRead) /lpInBuffer为接收数据的缓冲区指针, dwBytesToRead为准备读
6、取的数据长度(字节数) /串行设备状态结构 COMSTAT ComStat;DWORD dwBytesRead,dwErrorFlags;bOpen) return 0;/读取串行设备的当前状态 ClearCommError(hComDev,dwErrorFlags,ComStat);/应该读取的数据长度 dwBytesRead=min(dwBytesToRead,ComStat.cbInQue);if(dwBytesRead0) /读取数据 if(!ReadFile(hComDev,lpInBuffer,dwBytesRead,dwBytesRead,NULL) dwBytesRead=0;
7、return dwBytesRead;事件监视线程 事件监视线程对串口事件进行监视,当监视的事件发生时,监视线程可将这个事件发送(SendMessage)或登记(PostMessage)到对事件进行处理的窗口类(由pParam指定)中。UINT CommWatchProc(LPVOID pParam) DWORD dwEventMask=0; /发生的事件;while(bOpen) /等待监视的事件发生 WaitCommEvent(hComDev, dwEventMask,NULL);if (dwEventMask EV?RXCHAR)=EV?RXCHAR) /接收到字符事件后,可以将此消息登
8、记到由pParam有指定的窗口类中进行处理 if(dwEventMask EV?ERR)=EV?ERROR) /发生错误时的处理 SetEvent(hEvent);/发信号,指示监视线程结束 return 0;关闭串行设备 在整个应用程序结束或不再使用串行设备时,应将串行设备关闭,包括取消事件监视,将设备打开标志bOpen置为FALSE以使事件监视线程结束,清除发送/接收缓冲区和关闭设备句柄。void CloseSynComm() bOpen) return;/结束事件监视线程 bOpen=FALSE;SetCommMask(hComDev,0);/取消事件监视,此时监视线程中的WaitCom
9、mEvent将返回 WaitForSingleObject(hEvent,INFINITE);/等待监视线程结束 CloseHandle(hEvent); /关闭事件句柄 /停止发送和接收数据,并清除发送和接收缓冲区 PurgeComm(hComDev,PURGE?TXABORT| PURGE?RXABORT|PURGE?TXCLEAR|PURGE?RXCLEAR);/关闭设备句柄 CloseHandle(hComDev);二、编程步骤1、 启动Visual C+6.0,生成一个基于对话框的的应用程序,将该程序命名为“SerealCom”;2、 按照图一的界面设计对话框,具体设置参见代码部分;
10、3、 使用Class Wizard为对话框的按钮添加鼠标单击消息响应函数;4、 添加代码,编译运行程序。 三、程序代码/#if !defined(_COMM_ACCESS_FUNCTIONS_AND_DATA)#define _COMM_ACCESS_FUNCTIONS_AND_DATA#if _MSC_VER 1000#pragma once#endif / _MSC_VER #define EVENTCHAR 0x0d#define MAXBLOCKLENGTH 59extern BYTE XwCom;extern BYTE sCom15,sCom2MAXBLOCKLENGTH+12;ex
11、tern sCom3MAXBLOCKLENGTH+12;extern BYTE opation;extern short ComNum;#define FC_DTRDSR 0x01#define FC_RTSCTS 0x02#define FC_XONXOFF 0x04#define ASCII_BEL 0x07#define ASCII_BS 0x08#define ASCII_LF 0x0A#define ASCII_CR 0x0D#define ASCII_XON 0x11#define ASCII_XOFF 0x13class CComStatuspublic:HANDLE m_hCo
12、m;BYTE m_bComId;BYTE m_bByteSize;BYTE m_bStopBits;BYTE m_bParity;DWORD m_dwBaudRate;/WORD m_fChEvt;char m_bEvtChar;DWORD m_fBinary;BOOL m_bConnected;BOOL m_fXonXoff;BOOL m_bFlowCtrl;OVERLAPPED m_rdos;OVERLAPPED m_wtos;/functionsCComStatus();CComStatus(BYTE bComId,BYTE bByteSize,BYTE bStopBits,BYTE b
13、Parity,DWORD dwBaudRate,/*WORD fChEvt,*/char bEvtChar,DWORD fBinary);BOOL OpenConnection();BOOL CloseConnection();BOOL SetupConnection();BOOL IsConnected();UINT CommWatchProc( LPVOID lpData );BOOL WriteCommBlock( CComStatus& comDev, LPSTR lpByte , DWORD dwBytesToWrite);int ReadCommBlock(CComStatus&
14、comDev,LPSTR lpszBlock, int nMaxLength );int ReadCommBlockEx(CComStatus& comDev,LPSTR lpszBlock, int nMaxLength,DWORD dwTimeOut);#endif/#include stdafx.hcom232.hBYTE XwCom=0x40;BYTE sCom15,sCom2MAXBLOCKLENGTH+12,sCom3MAXBLOCKLENGTH+12;BYTE opation;short ComNum;CComStatus:CComStatus()m_hCom = NULL;m_
15、bComId = (char)ComNum;/COM1m_bByteSize=8;m_bStopBits=ONESTOPBIT;m_bParity=NOPARITY;m_dwBaudRate=9600;m_bEvtChar=EVENTCHAR;m_fBinary=1;m_bConnected = FALSE;m_bFlowCtrl = FC_XONXOFF ;m_fXonXoff = FALSE;CComStatus(BYTE bComId,BYTE bByteSize,BYTE bStopBits,BYTE bParity,DWORD dwBaudRate,/*WORD fChEvt,*/c
16、har bEvtChar,DWORD fBinary)m_bComId = bComId;m_bByteSize=bByteSize;m_bStopBits=bStopBits;m_bParity=bParity;m_dwBaudRate=dwBaudRate;m_bEvtChar=bEvtChar;m_fBinary=fBinary;BOOL CComStatus:OpenConnection()char csCom10;COMMTIMEOUTS CommTimeOuts ;if(m_bComId 4)/从COM1到COM4if(m_hCom)/if already open/OVERLAP
17、PED包含异步I/O信息m_rdos.Offset = 0;m_rdos.OffsetHigh = 0;m_rdos.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);if(m_rdos.hEvent = NULL)m_wtos.Offset = 0;m_wtos.OffsetHigh = 0;m_wtos.hEvent = CreateEvent(NULL,TRUE,FALSE,NULL);if(m_wtos.hEvent = NULL)CloseHandle(m_rdos.hEvent);wsprintf(csCom,COM%d,m_bComId);m_
18、hCom = CreateFile(csCom,GENERIC_READ | GENERIC_WRITE, 0,NULL, OPEN_EXISTING,ILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,NULL);if(m_hCom = INVALID_HANDLE_VALUE) /dwError = GetLastError();/ handle error elseSetCommMask( m_hCom, EV_RXCHAR ) ; / get any early notificationsSetupComm( m_hCom, 4096, 4096 )
19、 ; / setup device buffers/ purge any information in the bufferPurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT |PURGE_TXCLEAR | PURGE_RXCLEAR ) ;/ set up for overlapped I/ODWORD dwTemp = 1000 / (this-m_dwBaudRate / 8);CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;CommTimeOuts.ReadTotalTimeoutMultip
20、lier = 0;/(dwTemp 0) ? dwTemp : 1);CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;/ CBR_9600 is approximately 1byte/ms. For our purposes, allow/ double the expected time per character for a fudge factor.CommTimeOuts.WriteTotalTimeoutMultiplier =2*CBR_9600/this-m_dwBaudRate;/( npTTYInfo ) ;CommTimeOut
21、s.WriteTotalTimeoutConstant = 0;/1000 ;SetCommTimeouts( m_hCom, &CommTimeOuts ) ;SetupConnection()CloseConnection();EscapeCommFunction( m_hCom, SETDTR );m_bConnected = TRUE;return TRUE;CloseConnection()if (NULL = m_hCom)return ( TRUE ) ;/ set connected flag to FALSE/ disable event notification and w
22、ait for thread/ to haltSetCommMask( m_hCom, 0 ) ;EscapeCommFunction( m_hCom, CLRDTR ) ;/ purge any outstanding reads/writes and close device handlePurgeComm( m_hCom, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;CloseHandle( m_hCom ) ;/ change the selectable items in the menuClose
23、Handle(m_rdos.hEvent);CloseHandle(m_wtos.hEvent);return ( TRUE ) ;SetupConnection()BOOL fRetVal ;BYTE bSet ;DCB dcb ;if(m_hCom = NULL)dcb.DCBlength = sizeof( DCB ) ;GetCommState( m_hCom, &dcb ) ;dcb.BaudRate = this-dcb.ByteSize = this-m_bByteSize;dcb.Parity = this-m_bParity;dcb.StopBits = this-m_bStopBits ;dcb.EvtChar = this-m_bEvtChar ;/ setup hardware flow controlbSet = (BYTE) (m_bFlowCtrl & FC_DTRDSR) != 0) ;dcb.fOutxDsrFlow = bSet ;if (bSet)dcb.fDtrControl = DTR_CONTROL_HANDSHAKE ;dcb.fDtrControl = DTR_CONTROL_ENABLE ; FC_RTSCTS) !dcb.fOutxCtsFlow = bSet ;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1