Qt串口通信教程:Windows与Linux实现详解

需积分: 50 18 下载量 28 浏览量 更新于2024-07-19 收藏 749KB PDF 举报
本篇教程是关于使用Qt进行串口通信的专业指南,主要针对的是Windows和Linux平台。作者首先回顾了自己之前发布的Qt编写串口通信程序教程,重点在于Windows环境下的实现,但因未涉及Linux,收到了许多关于如何在Linux环境下实现串口通信的询问。在网友hqwfreefly的帮助下,作者开发了名为Lincom的Linux串口调试程序,并将其更新为一个跨平台的解决方案,包括Windows下的Wincom。 教程分为三个部分: 1. Qextserialport类介绍:Qt本身并未提供内置的串口控制类,大部分开发者会选择使用第三方的qextserialport库。作者会详细讲解这个类的基本概念和使用方法,包括下载链接和文件内容的概述。文件可以从SourceForge项目或作者的网盘获取,包含了库的下载以及对文件结构和功能的简要介绍。 2. Windows下的串口通信:这部分涵盖两种不同的方法,旨在帮助读者掌握在Windows环境中利用qextserialport进行串口通信的具体步骤。由于更侧重于技术细节,界面设计和应用层面的问题将引导读者参考之前的教程或Wincom软件的源码。 3. Linux下的串口通信:这是教程的新篇章,介绍了如何在Linux平台上使用qextserialport进行串口通信。这部分内容填补了先前教程的空白,对于那些需要在Linux环境中工作的开发者来说具有很高的实用价值。 这篇教程不仅提供了技术实现的深度剖析,还考虑到了跨平台的需求,为Qt用户在Windows和Linux上进行串口通信提供了一套完整的教程和资源。通过学习,读者不仅能掌握qextserialport的使用,还能了解如何处理不同操作系统下的串口通信问题。
2015-11-15 上传
void Widget::Select() //查询 { QString name = ui->lineEdit->text(); model->setFilter(QObject::tr("id = '%1'").arg(name)); //根据姓名进行筛选 model->select(); //显示结果 } void Widget::Delect() //删除当前行 { int curRow = ui->tableView->currentIndex().row(); //获取选中的行 model->removeRow(curRow); //删除该行 int ok = QMessageBox::warning(this,tr("删除当前行!"),tr("你确定" "删除当前行吗?"), QMessageBox::Yes,QMessageBox::No); if(ok == QMessageBox::No) { model->revertAll(); //如果不删除,则撤销 } else model->submitAll(); //否则提交,在数据库中删除该行 } void Widget::Add() //插入记录 { int rowNum = model->rowCount(); //获得表的行数 int id = 10; model->insertRow(rowNum); //添加一行 model->setData(model->index(rowNum,0),id); //model->submitAll(); //可以直接提交 } void Widget::Back() //返回全表 { model->setTable("student"); //重新关联表 model->setHeaderData(0, Qt::Horizontal, "Time"); model->setHeaderData(1, Qt::Horizontal, "Temperature"); model->select(); //这样才能再次显示整个表的内容 } void Widget::Amend() //提交修改 { model->database().transaction(); //开始事务操作 if (model->submitAll()) { model->database().commit(); //提交 } else { model->database().rollback(); //回滚 QMessageBox::warning(this, tr("tableModel"), tr("数据库错误: %1").arg(model->lastError().text())); } } void Widget::Get_time() { QString string; QTime current_time = QTime::currentTime(); int hour = current_time.hour(); int minute = current_time.minute(); int second = current_time.second(); // int msec = current_time.msec(); string=QString("%1").arg(hour)+":"+QString("%1").arg(minute) +":"+QString("%1").arg(second); ui->Receive->append(string); //qDebug() <rowCount(); //获得表的行数 // int id = 10; model->insertRow(rowNum); //添加一行 model->setData(model->index(rowNum,0),string); model->submitAll(); } void Widget::readMyCom() { QByteArray temp = myCom->readAll(); if(temp.size()!=0) { QString string; QTime current_time = QTime::currentTime(); int hour = current_time.hour(); int minute = current_time.minute(); int second = current_time.second(); // int msec = current_time.msec(); string=QString("%1").arg(hour)+":"+QString("%1").arg(minute) +":"+QString("%1").arg(second); ui->Receive->append(string); //qDebug() <rowCount(); //获得表的行数 // int id = 10; model->insertRow(rowNum); //添加一行 model->setData(model->index(rowNum,0),string); model->setData(model->index(rowNum,1),temp); model->submitAll(); data_light=temp.toInt(); } ui->Receive->append(temp); } void Widget::openCom() { QString portName = ui->portNameComboBox->currentText(); myCom = new Win_QextSerialPort(portName,QextSerialBase::EventDriven); myCom ->open(QIODevice::ReadWrite); if(ui->baudRateComboBox->currentText()==tr("9600")) myCom->setBaudRate(BAUD9600); else if(ui->baudRateComboBox->currentText()==tr("115200")) myCom->setBaudRate(BAUD115200); myCom->setFlowControl(FLOW_OFF); myCom->setTimeout(500); connect(myCom,SIGNAL(readyRead()),this,SLOT(readMyCom())); ui->openMyComBtn->setEnabled(false); ui->closeMyComBtn->setEnabled(true); ui->baudRateComboBox->setEnabled(false); ui->portNameComboBox->setEnabled(false); }