QT使用串口QSerialPort总结,及正确的读写方式
我想挺简单,然而这么麻烦……
- 列出所有串口
QString portName;
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
portName = info.portName();
qDebug() << "Name : " << info.portName();
qDebug() << "Description : " << info.description();
qDebug() << "Manufacturer: " << info.manufacturer();
qDebug() << "Serial Number: " << info.serialNumber();
qDebug() << "System Location: " << info.systemLocation();
}
- 初始化
这个简单。注意不要在线程中处理。
serialPort = new QSerialPort();
//设置COM口
serialPort->setPortName(portName);
//设置波特率和读写方向
serialPort->setBaudRate(QSerialPort::Baud4800, QSerialPort::AllDirections);
//数据位为8位
serialPort->setDataBits(QSerialPort::Data8);
//无流控制
serialPort->setFlowControl(QSerialPort::NoFlowControl);
//无校验位
serialPort->setParity(QSerialPort::NoParity);
//2位停止位
serialPort->setStopBits(QSerialPort::TwoStop);
//先关串口,再打开,可以保证串口不被其它函数占用。
serialPort->close();
//以可读写的方式打开串口
if (serialPort->open(QIODevice::ReadWrite))
{
serialPort->setDataTerminalReady(true);
connect(pLighter->serialPort, &QIODevice::readyRead, pLighter, &AlertLighter::do_com_readyRead);
canWriteCmd = true;
}
- 写数据
因为要多次写入,所以加了个队列。
SendCmd(uint8_t* pCmd)
{
QMutexLocker locker(&m_lock);
if (canWriteCmd)
{
canWriteCmd = false;
serialPort->write((const char*)pCmd, CMD_SIZE);
}
else
{
uint8_t* cmd = (uint8_t*)malloc(CMD_SIZE);
memcpy(cmd, pCmd, CMD_SIZE);
cmdList.append(cmd);
}
}
- 读数据
必须这样写。
do_com_readyRead()
{
QByteArray all = serialPort->readAll();
//check data
QMutexLocker locker(&m_lock);
if (cmdList.size() > 0)
{
canWriteCmd = false;
uint8_t* cmd = cmdList.at(0);
serialPort->write((const char*)cmd, CMD_SIZE);
cmdList.remove(0);
delete cmd;
}
else
{
canWriteCmd = true;
}
}
原文地址:https://blog.csdn.net/quantum7/article/details/142462625
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!