异步串口通信 VC++.doc_第1页
异步串口通信 VC++.doc_第2页
异步串口通信 VC++.doc_第3页
异步串口通信 VC++.doc_第4页
异步串口通信 VC++.doc_第5页
全文预览已结束

下载本文档

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

文档简介

异步串口通信 VC+/MyComm.h 多机控制 异步串口通信class CMyCommpublic:CMyComm();virtual CMyComm();void PreOpenSetupQueue(DWORD dwInQueue, DWORD dwOutQueue);/ size of input buffer, size of output bufferBOOL Open(int nPort, int nBaud);/默认无校验,每个字节发送11个bit,异步方式。/若设置校验后,校验错则字节被替换为0x7EBOOL SetupQueue(DWORD dwInQueue, DWORD dwOutQueue);/ size of input buffer, size of output bufferBOOL ResetParity(char Parity);/parity = N, O, E, M, S 不区分大小写/分别表示 no, odd, even, mark, space /在Open()前设置无效。BOOL SendData(LPCVOID lpBuf, DWORD dwToWrite);DWORD ReadData(LPVOID lpBuf, DWORD dwToRead);void Close();protected:HANDLE m_hCom;BOOL m_bOpened;OVERLAPPED m_osReader;OVERLAPPED m_osWriter;DWORD m_dwInBuf;DWORD m_dwOutBuf;/MyComm.cpp#include stdafx.h#include MyComm.h/CMyComm:CMyComm()m_bOpened = FALSE;m_dwInBuf =512;m_dwOutBuf = 512;m_hCom = NULL;void CMyComm:PreOpenSetupQueue(DWORD dwInQueue, DWORD dwOutQueue)m_dwInBuf = dwInQueue;m_dwOutBuf = dwOutQueue;BOOL CMyComm:Open(int nPort, int nBaud)ASSERT(nPort 0 | nPort = 110 | nBaud = 128000);if( m_bOpened )return TRUE;char szPort15;char lpDef15;DCB dcb = 0;dcb.DCBlength = sizeof(dcb);wsprintf(szPort, COM%d, nPort);wsprintf(lpDef, %d,n,8,1, nBaud);m_hCom = CreateFile(szPort, GENERIC_READ | GENERIC_WRITE,0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL);if( m_hCom = INVALID_HANDLE_VALUE )return FALSE;FillMemory(&m_osReader, sizeof(OVERLAPPED), 0);FillMemory(&m_osWriter, sizeof(OVERLAPPED), 0);m_osReader.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);m_osWriter.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);int byteUsedTime = 14400 / nBaud +1;COMMTIMEOUTS timeouts = 20 + byteUsedTime, byteUsedTime, 1000, byteUsedTime , 20;dcb.fParity = TRUE;dcb.fErrorChar = TRUE;dcb.ErrorChar = ;if( m_osReader.hEvent = NULL | m_osWriter.hEvent = NULL| !SetCommTimeouts(m_hCom, &timeouts)| !BuildCommDCB(lpDef, &dcb) | !SetupComm(m_hCom, m_dwInBuf, m_dwOutBuf) if(m_osReader.hEvent != NULL )CloseHandle( m_osReader.hEvent );if( m_osWriter.hEvent != NULL )CloseHandle( m_osWriter.hEvent );CloseHandle( m_hCom );return FALSE;m_bOpened = TRUE;return m_bOpened;BOOL CMyComm:SetupQueue(DWORD dwInQueue, DWORD dwOutQueue)if (m_hCom = NULL) return FALSE;m_dwInBuf = dwInQueue;m_dwOutBuf = dwOutQueue;return SetupComm(m_hCom, m_dwInBuf, m_dwOutBuf);BOOL CMyComm:ResetParity(char Parity)if (m_hCom = NULL) return FALSE;DCB dcb;dcb.DCBlength = sizeof( DCB );if (!GetCommState(m_hCom, &dcb) return FALSE;BYTE cParity;Parity = tolower(Parity);switch (Parity) case o:cParity = 1;break;case e:cParity = 2;break;case m:cParity = 3;break;case s:cParity = 4;break;default:cParity = 0;break;dcb.Parity = cParity;return SetCommState(m_hCom, &dcb);BOOL CMyComm:SendData(LPCVOID lpBuf, DWORD dwToWrite)TRACE(SSSSSSSSSSSSS 00n);if( !m_bOpened | m_hCom = NULL ) return FALSE;DWORD dwWritten;if (WriteFile(m_hCom, lpBuf, dwToWrite, &dwWritten, &m_osWriter) return TRUE;if (GetLastError() != ERROR_IO_PENDING)return FALSE;GetOverlappedResult(m_hCom, &m_osWriter, &dwWritten, TRUE);TRACE(SSSSSSSSSSSSS 11n);return (dwToWrite = dwWritten);DWORD CMyComm:ReadData(LPVOID lpBuf, DWORD dwToRead)TRACE(RRRRRRRRRRRR 00n);if( !m_bOpened | m_hCom = NULL ) return 0;DWORD dwRead;if (ReadFile(m_hCom, lpBuf, dwToRead, &dwRead, &m_osReader) )return dwRead;if (GetLastError() != ERROR_IO_PENDING)return 0;if (WaitForSingleObject(m_osReader.hEvent, INFINITE) != WAIT_OBJECT_0 ) return 0;if (!GetOverlappedResult(m_hCom, &m_osReader, &dwRead, FALSE) )return 0;TRACE(RRRRRRRRRRRR 11n);return dwRead;void CMyComm:Close()if (m_osReader.hEvent != NULL)CloseHandle( m_osReader.hEvent );if (m_osWriter.hEvent != NULL)CloseHandle( m_osWriter.hEvent );if (m_hCom != NULL)CloseHandle( m_hCom );m_bOpened = FALSE;CMyComm:CMyComm()Close();/ main.cppchar Buf40;int nArray3;CMyComn myCom;UINT SendDataProc(LPVOID pParam);void OnCommSendReceive() myCom.PreOpenSetupQueue(12, 12);if (!myCom.Open(2, 4800) return;/如果想改变校验位,在此位置,如:myCom.ResetParity(m);FillMemory(Buf, 40, 0);nArray0 = 0;nArray1 = 17;nArray2 = 88888;AfxBeginThread(SendDataProc, (LPVOID)(12);TRACE

温馨提示

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

评论

0/150

提交评论