c++ 串口通信实例

class CYSerial

{

public:

CYSerial():m_hFile(INVALID_HANDLE_VALUE)

{

}

~CYSerial()

{

}

 

__inline HANDLE GetHandle(){return m_hFile;}

//设置超时

void SetTimeout(

DWORD ReadIntervalTimeout=1,

DWORD ReadTotalTimeoutConstant=100,

DWORD ReadTotalTimeoutMultiplier=0,

DWORD WriteTotalTimeoutMultiplier=0, DWORD WriteTotalTimeoutConstant=0)

{

COMMTIMEOUTS timeout;

timeout.ReadIntervalTimeout=ReadIntervalTimeout;

timeout.ReadTotalTimeoutConstant=ReadTotalTimeoutConstant;

timeout.ReadTotalTimeoutMultiplier=ReadTotalTimeoutMultiplier;

timeout.WriteTotalTimeoutConstant=WriteTotalTimeoutConstant;

timeout.WriteTotalTimeoutMultiplier=WriteTotalTimeoutMultiplier;

SetCommTimeouts(m_hFile,&timeout);

}

//发送

bool Send(void * pData,int nLen)

{

DWORD nWritten;

if (m_hFile==INVALID_HANDLE_VALUE) return false;

WriteFile(m_hFile,pData,nLen,&nWritten,NULL);

return true;

}

bool Recv(void * pData,UINT * puLen,USHORT usTimeout,UINT nMaxbuf=1024)

{

SetTimeout(MAXDWORD,usTimeout,MAXDWORD,0,0);

if (m_hFile==INVALID_HANDLE_VALUE) return false;

ReadFile(m_hFile,pData,nMaxbuf,(LPDWORD)puLen,NULL);

if (*puLen<=0) return false;

return true;

}

//关闭串口

void Close()

{

if (m_hFile==INVALID_HANDLE_VALUE) return ;

::CloseHandle(m_hFile);

m_hFile = INVALID_HANDLE_VALUE;

}

bool Open (BYTE byPort,UINT nBaud=115200,BYTE byDataBits=8,

BYTE byParity=NOPARITY,BYTE byStopBits=ONESTOPBIT, DWORD dwInQueue=10240, DWORD dwOutQueue=10240)

{

if (m_hFile!=INVALID_HANDLE_VALUE) return false;

CString szDevie;

#ifdef _WIN32_WCE

szDevie.Format(_T("COM%d:"),byPort);

 

#else

szDevie.Format(_T("COM%d"),byPort);

#endif

m_hFile = ::CreateFile(szDevie,

GENERIC_READ|GENERIC_WRITE,

0,

0,

OPEN_EXISTING,

0,

0);

if (m_hFile==INVALID_HANDLE_VALUE) return false;

if (!::SetupComm(m_hFile,dwInQueue,dwOutQueue))

{

ASSERT(0);Close();

return false;

}

DCB dcb;

memset(&dcb,0,sizeof(DCB));

if (!::GetCommState(m_hFile,&dcb)) {ASSERT(0);return false;}

dcb.BaudRate = DWORD(nBaud);

dcb.ByteSize = BYTE(byDataBits);

dcb.Parity = BYTE(byParity);

dcb.StopBits = BYTE(byStopBits);

 

dcb.fParity = (byParity != NOPARITY);

 

if (!::SetCommState(m_hFile,&dcb)) return false;

SetTimeout();

return true;

}

bool Open(LPCTSTR szPort, LPCTSTR szDef=_T("115200,n,8,1"), DWORD dwInQueue=1024, DWORD dwOutQueue=1024)

{

m_hFile = ::CreateFile(szPort,

GENERIC_READ|GENERIC_WRITE,

0,

0,

OPEN_EXISTING,

0,

0);

if (m_hFile==INVALID_HANDLE_VALUE) return false;//直接打开失败

if (!::SetupComm(m_hFile,dwInQueue,dwOutQueue)){ASSERT(0);Close();return false;}

DCB dcb;

if (!::GetCommState(m_hFile,&dcb)) {ASSERT(0);return false;}

#ifndef _WIN32_WCE

BuildCommDCB(szDef,&dcb);

#endif

if (!::SetCommState(m_hFile,&dcb)){ASSERT(0);return false;}

SetTimeout();

return true;

}

void Clean()

{

PurgeComm(m_hFile,PURGE_RXCLEAR);

}

protected:

void SetHandle(HANDLE hHandle)

{

m_hFile=hHandle;

}

HANDLE m_hFile;

};

}

打开串口: 创建串口(CreateFile) -- 设置输入输出缓存区打消(SetupComm)-- 设置超时(SetCommTimeouts) -- 获取DCB结构体(GetComm) -- 给DCB结构体赋值 -- 设置DCB结构体(SetCommState) -- 清空输入输出缓存区(PurgeComm)。

发送数据:清空输出缓存(PurgeComm) -- 清除硬件的通信错误(ClearCommError) -- 写数据(WriteFile)

接收数据:清除硬件的通信错误并获取通信设备的当前状态(ClearCommError)-- 获取输出缓存区的字节数 (COMSTAT::cbInQue)-- 读取数据 (ReadFile)

关闭串口:CloseHandle

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zxz520zmg

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值