www.pudn.com > ReadTypeAB.rar > comm.cpp


#include "stdafx.h" 
#include "Comm.h" 
 
// 串口设备句柄 
//HANDLE hComm; 
 
// 打开串口 
// pPort: 串口名称或设备路径,可用"COM1"或"\\.\COM1"两种方式,建议用后者 
// nBaudRate: 波特率 
// nParity: 奇偶校验 
// nByteSize: 数据字节宽度 
// nStopBits: 停止位 
BOOL OpenComm(HANDLE& hComm,const char* pPort, int nBaudRate,BOOL bSetIOBuffer,int nParity, int nByteSize, int nStopBits) 
{ 
	BOOL ret; 
	DCB dcb;		// 串口控制块 
	COMMTIMEOUTS timeouts = {	// 串口超时控制参数 
		100,				// 读字符间隔超时时间: 100 ms 
		1,					// 读操作时每字符的时间: 1 ms (n个字符总共为n ms) 
		500,				// 基本的(额外的)读超时时间: 500 ms 
		1,					// 写操作时每字符的时间: 1 ms (n个字符总共为n ms) 
		100};				// 基本的(额外的)写超时时间: 100 ms 
 
	TCHAR PORT[50]; 
#ifdef _WIN32_WCE 
	MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,pPort,-1,PORT,50); 
#else 
	strcpy(PORT, pPort); 
#endif 
	_tcscat(PORT,_T(":")); 
	hComm = CreateFile(PORT,	// 串口名称或设备路径 
			GENERIC_READ | GENERIC_WRITE,	// 读写方式 
			0,				// 共享方式:独占 
			NULL,			// 默认的安全描述符 
			OPEN_EXISTING,	// 创建方式 
			0,				// 不需设置文件属性 
			NULL);			// 不需参照模板文件 
	 
	if(hComm == INVALID_HANDLE_VALUE) return FALSE;		// 打开串口失败 
 
	ret = GetCommState(hComm, &dcb);		// 取DCB 
	ASSERT(ret); 
 
	dcb.BaudRate = nBaudRate; 
	dcb.ByteSize = nByteSize; 
	dcb.Parity = nParity; 
	dcb.StopBits = nStopBits; 
 
	ret = SetCommState(hComm, &dcb);		// 设置DCB 
	ASSERT(ret); 
	if (!ret) 
	{ 
		CString str; 
		str.Format(_T("%d"),GetLastError()); 
		AfxMessageBox(str); 
	} 
 
	if(bSetIOBuffer) 
	{	 
		ret = SetupComm(hComm, 4096, 1024);	// 设置输入输出缓冲区大小 
		ASSERT(ret); 
	} 
 
	ret = ::SetCommTimeouts(hComm, &timeouts);	// 设置超时 
	ASSERT(ret); 
 
	return TRUE; 
} 
 
// 关闭串口 
BOOL CloseComm(HANDLE& hComm) 
{ 
	return CloseHandle(hComm); 
} 
 
// 写串口 
// pData: 待写的数据缓冲区指针 
// nLength: 待写的数据长度 
BOOL WriteComm(HANDLE hComm,void* pData, int nLength) 
{ 
	DWORD dwNumWrite;	// 串口发出的数据长度 
 
	BOOL ret = WriteFile(hComm, pData, (DWORD)nLength, &dwNumWrite, NULL); 
 
	return ret; 
} 
 
// 读串口 
// pData: 待读的数据缓冲区指针 
// nLength: 待读的最大数据长度 
// 返回: 实际读入的数据长度 
int ReadComm(HANDLE hComm,void* pData, int nLength) 
{ 
	DWORD dwNumRead;	// 串口收到的数据长度 
 
	BOOL ret = ReadFile(hComm, pData, (DWORD)nLength, &dwNumRead, NULL); 
	if (!ret) 
	{ 
		return -1; 
	} 
	 
	return (int)dwNumRead; 
}