C++通用串口连接方式(QT版)

C++串口通用连接方式
commport.h

#ifndef COMMPORT_H
#define COMMPORT_H

#include <QObject>
#include <Windows.h>

class QCommPort : public QObject
{
	Q_OBJECT

public:
	QCommPort(QObject *parent = NULL);
	~QCommPort();

	bool open(const QString &port, int BaudRate, unsigned char DataBit = 8, unsigned char Parity = NOPARITY, unsigned char StopBits = ONESTOPBIT);
	void close();

	bool read(QByteArray &ar);
	bool write(const QByteArray &ar);

private:
	HANDLE m_hCom;
};

#endif // COMMPORT_H

commport.cpp

#include "CommPort.h"
#include <qdebug.h>
#include <qthread.h>

QCommPort::QCommPort(QObject *parent)
	: QObject(parent),m_hCom(INVALID_HANDLE_VALUE)
{

}

QCommPort::~QCommPort()
{

}

bool QCommPort::open(const QString &port,int BaudRate, unsigned char DataBit, unsigned char Parity, unsigned char StopBits)
{
	m_hCom = CreateFileA(port.toStdString().c_str(),
		GENERIC_READ|GENERIC_WRITE,               
		FILE_SHARE_READ,                          
		NULL,
		OPEN_EXISTING,                             
		FILE_ATTRIBUTE_NORMAL,                    
		NULL);
	if (INVALID_HANDLE_VALUE == m_hCom)
	{
		//qDebug() << "barcode OpenDev Error!";
		return false;
	}

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

	/*if(!GetCommState(m_hCom, &dcb))
	{
		qDebug() << "GetCommState Error";
		return false;
	}*/

	dcb.BaudRate= BaudRate;       
	dcb.ByteSize= DataBit;
	dcb.Parity= Parity;
	dcb.StopBits= StopBits;
	if(!SetCommState(m_hCom, &dcb))
	{
		//qDebug() << "SetCommState Error";
		return false;
	}

	COMMTIMEOUTS timeOutis;
	GetCommTimeouts(m_hCom,&timeOutis);
	timeOutis.ReadIntervalTimeout = 500;
	timeOutis.ReadTotalTimeoutConstant = 500;
	timeOutis.ReadTotalTimeoutMultiplier = 0;
	timeOutis.WriteTotalTimeoutConstant = 500;
	timeOutis.WriteTotalTimeoutMultiplier = 0;
	SetCommTimeouts(m_hCom,&timeOutis);

	DWORD dwErrorFlags;
	COMSTAT ComStat;
	ClearCommError(m_hCom, &dwErrorFlags, &ComStat);

	SetupComm(m_hCom, 1024, 1024); 
	PurgeComm(m_hCom, PURGE_TXCLEAR|PURGE_RXCLEAR);
	return true;
}

void QCommPort::close()
{
	if(INVALID_HANDLE_VALUE == m_hCom)return;

	CloseHandle(m_hCom);
	m_hCom = INVALID_HANDLE_VALUE;
}


bool QCommPort::read(QByteArray &ar)
{
	if(INVALID_HANDLE_VALUE == m_hCom)return false;

	char readBuffer[512];
	memset(readBuffer, 0, 512);
	DWORD wCount= 500;
	BOOL bReadStat;

	bReadStat = ReadFile(m_hCom, readBuffer, wCount, &wCount, NULL);
	if(wCount > 0)
	{
		ar.append(readBuffer,wCount);

		return true;
	}

	return false;

}

bool QCommPort::write(const QByteArray &ar)
{
	if(INVALID_HANDLE_VALUE == m_hCom)return false;

	unsigned long dwBytesWrite;
	COMSTAT ComStat;
	DWORD dwErrorFlags;
	BOOL bWriteStat;
	ClearCommError(m_hCom, &dwErrorFlags, &ComStat);

	dwBytesWrite = 0;
	bWriteStat = WriteFile(m_hCom, ar.data(), ar.size(), &dwBytesWrite, NULL);
	if(!bWriteStat)
	{
		return false;
	}

	return true;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员吴同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值