使用QT在子线程中访问串口

  在开发过程中遇到个串口读取问题记录如下。

  

PlaneDataHandleThread::PlaneDataHandleThread(QObject *parent)
	: QThread(parent)
{

}

PlaneDataHandleThread::~PlaneDataHandleThread()
{
}
void PlaneDataHandleThread::run()
{
	qDebug() << "无人机线程"<<currentThreadId();
	m_ser.setBaudRate(QSerialPort::Baud57600);
	m_ser.setDataBits(QSerialPort::Data8);
	m_ser.setParity(QSerialPort::NoParity);
	m_ser.setStopBits(QSerialPort::OneStop);
	m_ser.setFlowControl(QSerialPort::NoFlowControl);
	m_ser.setPortName("com3");
	bool b = m_ser.open(QIODevice::ReadOnly);
	//connect(&m_ser, &QSerialPort::readyRead, this, &PlaneDataHandleThread::onDataReady);
	while (m_bRun)
	{
		qDebug() << m_ser.readAll();
	}
	
}
//void PlaneDataHandleThread::onDataReady()
//{
//	qDebug() << m_ser.bytesAvailable() << endl;
//}
void PlaneDataHandleThread::connPlane()
{
	m_bConnected = true;
}
void PlaneDataHandleThread::quit()
{
	m_bRun = false;
}

  按正常理解这个地方会调试输出串口内容,实际上啥也输出不了,修改如下即可。

	while (m_bRun)
	{
		m_ser.waitForReadyRead();//添加此代码后下面的代码就可以输出内容
		qDebug() << m_ser.readAll();
	}

  也可以使用信号方式读取数据

void PlaneDataHandleThread::run()
{
	qDebug() << "无人机线程"<<currentThreadId();
	m_ser.setBaudRate(QSerialPort::Baud57600);
	m_ser.setDataBits(QSerialPort::Data8);
	m_ser.setParity(QSerialPort::NoParity);
	m_ser.setStopBits(QSerialPort::OneStop);
	m_ser.setFlowControl(QSerialPort::NoFlowControl);
	m_ser.setPortName("com3");
	bool b = m_ser.open(QIODevice::ReadOnly);
	connect(&m_ser, &QSerialPort::readyRead, this, &PlaneDataHandleThread::onDataReady);
	while (m_bRun)
	{
		m_ser.waitForReadyRead();
	}
}
void PlaneDataHandleThread::onDataReady()
{
	qDebug() << m_ser.readAll() << endl;
}

  

posted on 2021-03-06 14:49  孤山独剑  阅读(580)  评论(0编辑  收藏  举报

导航