?? commdevicedriver.cpp
字號:
#ifndef __CDEBUGTOOL_H_INCLUDE
//#include "CDebugTool.h"
#endif
#include "CommDevLinkLayer.h"
//******************************************************************************
// SetupConnection()
//
// 描述:
// 建立DCB塊。通訊采用8位數據位、1位停止位,軟、硬件流控制不啟用。
// 設備出錯時,中斷讀寫操作。
//
// 參數:
// HANDLE hComm 通訊口句柄
// DWORD BaudRate 通訊波特率
//******************************************************************************
static BOOL __fastcall SetupConnection( HANDLE hComm, DWORD BaudRate, BYTE parity )
{
BOOL fRetVal ;
DCB dcb ;
COMMTIMEOUTS CommTimeOuts ;
// setup device buffers
SetupComm( hComm, 4096, 4096 );
// set up for overlapped I/O
CommTimeOuts.ReadIntervalTimeout = MAXDWORD;
CommTimeOuts.ReadTotalTimeoutMultiplier = MAXDWORD;
CommTimeOuts.ReadTotalTimeoutConstant = 700;
// CBR_9600 is approximately 1byte/ms. For our purposes, allow
// double the expected time per character for a fudge factor.
CommTimeOuts.WriteTotalTimeoutMultiplier = 1;
CommTimeOuts.WriteTotalTimeoutConstant = 5 ;
SetCommTimeouts( hComm, &CommTimeOuts ) ;
// setup DCB
dcb.DCBlength = sizeof( DCB ) ;
GetCommState( hComm, &dcb ) ;
dcb.BaudRate = BaudRate ;
dcb.ByteSize = 8;
dcb.Parity = parity ;
dcb.StopBits = ONESTOPBIT;
// hardware flow control,不激活。
dcb.fOutxDsrFlow = 0 ;
dcb.fOutxCtsFlow = 0 ;
dcb.fDtrControl = DTR_CONTROL_ENABLE ;
dcb.fRtsControl = RTS_CONTROL_ENABLE ;
dcb.fDsrSensitivity = 0 ;
// software flow control,關閉。
dcb.fInX = dcb.fOutX = 0 ;
//dcb.XonChar = ASCII_XON ;
//dcb.XoffChar = ASCII_XOFF ;
//dcb.XonLim = 100 ;
//dcb.XoffLim = 100 ;
// other various settings
dcb.fBinary = TRUE ;
dcb.fParity = (parity == EVENPARITY || parity == ODDPARITY);
dcb.fNull = 0;
dcb.fAbortOnError = 1;
fRetVal = SetCommState( hComm, &dcb ) ;
// purge any information in the buffer
PurgeComm( hComm, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
return ( fRetVal ) ;
} // end of SetupConnection()
//******************************************************************************
// CommDev::OpenCommDev()
//
// 描述:
// 打開串行通訊口,同步方式。
//
// 參數:
// char *szPort //串口名稱
// DWORD BaudRate //通訊波特率
//
// 備注:
// 返回“假”時,可能是由于系統不存在該名稱的通訊口,或該通訊口
// 已被占用,或波特率不被系統承認,或一些必要的同步對象不能被生成。
//******************************************************************************
CommDev *CommDev::OpenCommDev(const char* szPort, DWORD BaudRate)
{
HANDLE com_dev_handle;
if (( com_dev_handle = CreateFile( szPort, // open com port
GENERIC_READ | GENERIC_WRITE,
0, NULL, // exclusive access, no security attrs
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, // synchronous I/O
NULL )) == INVALID_HANDLE_VALUE )
return NULL;
if (SetupConnection (com_dev_handle, BaudRate, NOPARITY)) {
//if( !SetCommMask( com_dev_handle, EV_ERR | EV_TXEMPTY ))
// goto _0;
CommDev *aNewCommDev = new CommDev ();
aNewCommDev->itsHandle = com_dev_handle;
aNewCommDev->itsBaudRate = BaudRate;
return aNewCommDev;
}
_0:
//abnormal return
CloseHandle( com_dev_handle );
return NULL;
} // end of OpenCommDev()
//******************************************************************************
// CommDev::CloseCommDev()
//
// 描述:
// 關閉串行通訊口。取消通訊口的事件掩碼。
//******************************************************************************
void CommDev::closeCommDev()
{
if( itsHandle != INVALID_HANDLE_VALUE ) {
CloseHandle (itsHandle);
itsHandle = INVALID_HANDLE_VALUE;
}
} // end of CloseCommDev()
//******************************************************************************
// CommDev::reopenWithParity()
//
// 描述:
// 改變串行通訊口的校驗模式。
//******************************************************************************
bool CommDev::changeParityScheme(BYTE parity)
{
return SetupConnection(itsHandle, itsBaudRate, parity);
} // end of reopenWithParity()
//******************************************************************************
// CommDev::readRaw()
//
// 描述:
// 同步方式讀出。超時設置參見 SetpuConnection 。
//******************************************************************************
DWORD CommDev::readRaw(LPVOID lpBuf, DWORD BufSize)
{
BOOL fWriteStat ;
COMSTAT ComStat ;
DWORD dwErrorFlags;
DWORD dwLength;
DWORD dwReads = 0;
BYTE *buf = (BYTE*)lpBuf;
while (BufSize > 0) {
ClearCommError( itsHandle, &dwErrorFlags, &ComStat );
fWriteStat = ReadFile( itsHandle, buf, BufSize, &dwLength, NULL );
if( fWriteStat ) {
if (dwLength == 0)
break;
dwReads += dwLength;
BufSize -= dwLength;
buf += dwLength;
}
else
break;
}
return dwReads;
} // end of readRaw()
bool CommDev::writeRaw(LPCVOID lpBuf, DWORD sizeToWrite)
{
BOOL fWriteStat ;
DWORD dwBytesWritten ;
DWORD dwErrorFlags;
COMSTAT ComStat;
ClearCommError( itsHandle, &dwErrorFlags, &ComStat );
fWriteStat = WriteFile( itsHandle, lpBuf, sizeToWrite, &dwBytesWritten, NULL );
return (fWriteStat && sizeToWrite == dwBytesWritten);
} // end of writeRaw()
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -