Windows 下串口類

//Windows 下串口類

//MySerialPort.h
/////////////////////////////////////////////

#ifndef __MY_SERIAL_PORT_H__
#define __MY_SERIAL_PORT_H__

/////////////////////////////////////////////

#include <windows.h>

/////////////////////////////////////////////

#define MAX_DEVICE_BUFFER_SIZE 0x100

/////////////////////////////////////////////

class CMySerialPort
{
public:
CMySerialPort();
virtual~CMySerialPort();

public:
//打開串口(串口名,波特率,數據位,校驗位,停止位)
BOOL _Open(const LPTSTR _lpszPortName,
   DWORD _dwBaudRate = 4800,BYTE _nByteSize = 8,
   BYTE _nParity = NOPARITY,BYTE _nStopBits = ONESTOPBIT);
//關閉串口
void _Close();

public:
//讀串口
DWORD _Read(void* _pvData,DWORD _dwMaxSize);
//寫串口
DWORD _Write(const void* _pvData,DWORD _dwSize);

private:
HANDLE m_hPort;

};

/////////////////////////////////////////////

#endif //__MY_SERIAL_PORT_H__

/////////////////////////////////////////////


//MySerialPort.cpp
/////////////////////////////////////////////

#include "stdafx.h"
#include "MySerialPort.h"

/////////////////////////////////////////////

CMySerialPort::CMySerialPort()
{
m_hPort = INVALID_HANDLE_VALUE;
}

CMySerialPort::~CMySerialPort()
{
_Close();
}

BOOL CMySerialPort::_Open(const LPTSTR _lpszPortName,
   DWORD _dwBaudRate,BYTE _nByteSize,BYTE _nParity,BYTE _nStopBits)
{
DCB dcb;
COMMTIMEOUTS TimeOuts;

m_hPort = CreateFile(_lpszPortName,//COM1口
   GENERIC_READ|GENERIC_WRITE, //允許讀和寫
   0, //獨佔方式
   NULL,
   OPEN_EXISTING, //打開而不是創建
   0, //同步方式
   NULL);
if(INVALID_HANDLE_VALUE == m_hPort)
{
   return FALSE;
}

SetupComm(m_hPort,MAX_DEVICE_BUFFER_SIZE,MAX_DEVICE_BUFFER_SIZE); //輸入緩衝區和輸出緩衝區的大小都是100

//設定讀超時
TimeOuts.ReadIntervalTimeout=MAXDWORD;
TimeOuts.ReadTotalTimeoutMultiplier=0;
TimeOuts.ReadTotalTimeoutConstant=0;
//在讀一次輸入緩衝區的內容後讀操作就立即返回,
//而不管是否讀入了要求的字符。

//設定寫超時
TimeOuts.WriteTotalTimeoutMultiplier=100;
TimeOuts.WriteTotalTimeoutConstant=500;
SetCommTimeouts(m_hPort,&TimeOuts); //設置超時

GetCommState(m_hPort,&dcb);
dcb.BaudRate=_dwBaudRate; //波特率
dcb.ByteSize=_nByteSize; //每個字節有幾位
dcb.Parity=_nParity; //奇偶校驗位
dcb.StopBits=_nStopBits; //停止位
SetCommState(m_hPort,&dcb);

return TRUE;
}

void CMySerialPort::_Close()
{
if(INVALID_HANDLE_VALUE != m_hPort)
{
   CloseHandle(m_hPort);
   m_hPort = INVALID_HANDLE_VALUE;
}
}

DWORD CMySerialPort::_Read(void* _pvData,DWORD _dwMaxSize)
{
DWORD dwReaded = 0;
BOOL bReadStat = FALSE;

if (INVALID_HANDLE_VALUE != m_hPort)
{
   bReadStat = ReadFile(m_hPort,_pvData,_dwMaxSize,&dwReaded,NULL);

   if (bReadStat)
   {
    return dwReaded;
   }
}

return -1;
}

DWORD CMySerialPort::_Write(const void* _pvData,DWORD _dwSize)
{
DWORD dwWrited = 0;
BOOL bReadStat = FALSE;

if (INVALID_HANDLE_VALUE != m_hPort)
{
   bReadStat = WriteFile(m_hPort,_pvData,_dwSize,&dwWrited,NULL);

   if (bReadStat)
   {
    return dwWrited;
   }
}

return -1;
}

/////////////////////////////////////////////

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章