找回密码
 立即注册
收起左侧

物联网探步--工具篇之串口

6
回复
7127
查看
[复制链接]
累计签到:17 天
连续签到:1 天
来源: Qt教程 2015-4-30 23:05:58 显示全部楼层 |阅读模式
物联网探步--工具篇之串口


版权声明

该文章原创于Qter开源社区www.qter.org),作者lxdlbs371,转载请注明出处!


概述:
      这里介绍的是把第三方写的qextserialport类编译成共享库,然后直接调用相关类和成员函数。这样写的原因是在即将开始的物联网探索里,几乎所有的实验都是通过串口通信来分析相关物联网模块标准和协议的。
论坛里面已经有了两篇关于QT串口通信的专题,所以这里就不在详细介绍了,只要会用就可以。
特别说明:这里我引用了yafeilinux站长的“QCom跨平台串口调试助手软件”的界面程序。特此感谢。


环境及工具:
操作系统:win7

qt-opensource-windows-x86-mingw491_opengl-5.4.1

qextserialport-1.2rc


第一步:编译qextserialport共享库
1:把下载好的qextserialport-1.2rc.zip解压:


2:打开Qt Creator, 打开“文件”选项,选择“打开文件或项目”


在qextserialport-1.2rc文件夹下找到qextserialport.pro,打开。


3:编辑“qextserialport.pro”项目文件,在该文件内添加存放共享库的位置。


    在“qextserialport.pro”文件中,添加DESTDIR = ..\myLib 。路径可以自己随便命名。方便找到生成的共享库即可。



4:生成共享库文件

保存并运行

等一会,就可以在myLib文件夹下生成一堆库文件:


     有两个dll库文件,Qt5ExtSerialPortd1.dll包含了debug信息,Qt5ExtSerialPort1.dll,不包含debug信息,也就没有调试输出。所以选择了“Qt5ExtSerialPortd1.dll”,发行版可以选择“Qt5ExtSerialPort1.dll”,文件小很多。

第二步:测试共享库
1:新建一个项目,取名MyCom。



2:修改 MyCom.pro文件 添加下面三条语句:
1)把生成的MyCom程序和共享库文件放在一起。
#添加串口共享库的位置
DESTDIR = ..\myLib
2)要使用该库,需要包含#include"qextserialport.h" 官方原话:
* Using QextSerialPort in your code. Enjoy it!
           #include "qextserialport.h"
            ....
           QextSerialPort * port = new QextSerialPort();
            ....
qextserialport.h文件是放在src文件夹下的,所以加上下面一句:
#添加包含的串口类信息
INCLUDEPATH += ../src

3)添加使用的串口共享库文件。
LIBS += $$DESTDIR/Qt5ExtSerialPortd1.dll


* Using QextSerialPort in your code. Enjoy it!
           #include "qextserialport.h"
            ....
           QextSerialPort * port = new QextSerialPort();
            ....
qextserialport.h文件是放在src文件夹下的,所以加上下面一句:
#添加包含的串口类信息
INCLUDEPATH += ../src

3:添加界面文件并调用QextSerialPort,用以测试共享库是否正常被调用。


运行程序:



如果不知道是哪一个串口,可以查看 系统的“设备管理器”



说明:该第三方串口库在windows下使用的是“事件驱动”方式:



后语:
经过编译共享库,以后再使用串口,就只需在.pro文件添加调用语句即可,快捷方便。使用共享库的另一个思想就是对象化,以后很多模块都会抽象成共享库,最后在编写复杂的项目时,就可以直接调用这些库文件,而不是重写,或者“复制粘贴”了。

--------------------------------------------------------------------------------------------------------------------------------
有朋友在论坛提出QT5.4集成了串口模块,这里把集成串口模块的小例子贴一下;
自带模块只需要在 pro 文件加入 QT       += serialport




界面设置:

serial.h
  1. #ifndef SERIAL_H
  2. #define SERIAL_H

  3. #include <QWidget>
  4. #include <QtSerialPort/QSerialPort>
  5. #include <QtSerialPort/QSerialPortInfo>

  6. namespace Ui {
  7. class serial;
  8. }

  9. class serial : public QWidget
  10. {
  11.     Q_OBJECT

  12. public:
  13.     explicit serial(QWidget *parent = 0);
  14.     ~serial();

  15. private:
  16.     Ui::serial *ui;
  17.     QSerialPort *my_serialport;

  18. private slots:
  19.     void my_readuart();//串口接收数据槽函数
  20.     void on_pushButton_clicked();
  21.     void on_pushButton_2_clicked();
  22. };

  23. #endif // SERIAL_H
复制代码
serial.cpp
  1. #include "serial.h"
  2. #include "ui_serial.h"

  3. serial::serial(QWidget *parent) :
  4.     QWidget(parent),
  5.     ui(new Ui::serial)
  6. {
  7.     ui->setupUi(this);
  8.     ui->textBrowser->append(tr("检测到端口列表:"));
  9.     foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
  10.     {
  11.         QSerialPort serial;
  12.         serial.setPort(info);
  13.         if (serial.open(QIODevice::ReadWrite))
  14.         {
  15.             ui->comboBox->addItem(info.portName());
  16.             ui->textBrowser->append(info.portName());
  17.             ui->textBrowser->append(info.description());
  18.             ui->textBrowser->append(info.manufacturer());
  19.             serial.close();
  20.         }
  21.     }
  22.     ui->comboBox_2->setCurrentIndex(3);//默认9600
  23.     ui->pushButton->setText(tr("打开串口"));
  24.     ui->pushButton_2->setEnabled(false);
  25. }

  26. serial::~serial()
  27. {
  28.     delete ui;
  29. }

  30. void serial::my_readuart()
  31. {
  32.     QByteArray requestData;

  33.     requestData = my_serialport->readAll();
  34. //    if(requestData!= NULL)
  35. //    {
  36. //        ui->textEdit->append(requestData);
  37. //    }
  38. QString buf = requestData;
  39.     ui->textBrowser->setText(ui->textBrowser->document()->toPlainText() + buf);
  40. //    requestData.clear();
  41. }

  42. void serial::on_pushButton_clicked()
  43. {
  44.     if(ui->pushButton->text()==tr("打开串口")){
  45.         my_serialport= new QSerialPort();
  46.         my_serialport->setPortName(ui->comboBox->currentText());
  47.         my_serialport->open(QIODevice::ReadWrite);
  48.         my_serialport->setBaudRate(ui->comboBox_2->currentText().toInt());
  49.         switch(ui->comboBox_3->currentIndex()){
  50.         case 0: my_serialport->setParity(QSerialPort::NoParity);break;
  51.         case 1: my_serialport->setParity(QSerialPort::OddParity);break;
  52.         case 2: my_serialport->setParity(QSerialPort::EvenParity);break;
  53.         default: break;
  54.         }
  55.         switch(ui->comboBox_4->currentIndex()){
  56.         case 0: my_serialport->setDataBits(QSerialPort::Data8);break;
  57.         case 1: my_serialport->setDataBits(QSerialPort::Data7);break;
  58.         case 2: my_serialport->setDataBits(QSerialPort::Data6);break;
  59.         default: break;
  60.         }
  61.         switch(ui->comboBox_5->currentIndex()){
  62.         case 0: my_serialport->setStopBits(QSerialPort::OneStop);break;
  63.         case 1: my_serialport->setStopBits(QSerialPort::TwoStop);break;
  64.         default: break;
  65.         }
  66.         my_serialport->setFlowControl(QSerialPort::NoFlowControl);
  67.         connect(my_serialport,SIGNAL(readyRead()),this,SLOT(my_readuart()));
  68.         ui->comboBox->setEnabled(false);
  69.         ui->comboBox_2->setEnabled(false);
  70.         ui->comboBox_3->setEnabled(false);
  71.         ui->comboBox_4->setEnabled(false);
  72.         ui->comboBox_5->setEnabled(false);
  73.         ui->label_6->setStyleSheet("background-color:red");
  74.         ui->pushButton->setText(tr("关闭串口"));
  75.         ui->pushButton_2->setEnabled(true);
  76.     }
  77.     else {
  78.         my_serialport->clear();
  79.         my_serialport->deleteLater();
  80.         //  my_serialport->deleteLater();
  81.         ui->comboBox->setEnabled(true);
  82.         ui->comboBox_2->setEnabled(true);
  83.         ui->comboBox_3->setEnabled(true);
  84.         ui->comboBox_4->setEnabled(true);
  85.         ui->comboBox_5->setEnabled(true);
  86.      //   ui->label_6->setStyleSheet("background-color:none");
  87.         ui->label_6->setStyleSheet("background-color:rgb(130,130,130)");
  88.         ui->pushButton->setText(tr("打开串口"));
  89.         ui->pushButton_2->setEnabled(false);
  90.     }
  91. }

  92. void serial::on_pushButton_2_clicked()
  93. {
  94.     my_serialport->write(ui->lineEdit->text().toLatin1());
  95. }
复制代码
运行效果:

代码打包:




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:13 天
连续签到:1 天
2015-5-5 10:08:17 显示全部楼层
博主太棒啦 学习学习啦
回复 支持 反对

使用道具 举报

累计签到:3 天
连续签到:1 天
2015-6-18 13:34:52 显示全部楼层
请问,Qt从5.4.0开始就自带有串口库了,也支持串口编程,为何这里要使用第三方的库?
回复 支持 反对

使用道具 举报

累计签到:17 天
连续签到:1 天
2015-6-26 20:57:20 显示全部楼层
linhuikui 发表于 2015-6-18 13:34
请问,Qt从5.4.0开始就自带有串口库了,也支持串口编程,为何这里要使用第三方的库? ...

之前没注意,谢谢提醒,随后我把QT自带串口模块改写的例子放在一起。

点评

楼主,能不能把检测可用串口的那块代码写写注释?小弟想学习一下  详情 回复 发表于 2015-9-1 11:04
回复 支持 反对

使用道具 举报

累计签到:32 天
连续签到:1 天
2015-8-27 12:13:34 显示全部楼层
QT4.8下面也可以用官方的串口库,需要自己编译安装
回复 支持 反对

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-9-1 11:04:54 显示全部楼层
lxdlbs371 发表于 2015-6-26 20:57
之前没注意,谢谢提醒,随后我把QT自带串口模块改写的例子放在一起。

楼主,能不能把检测可用串口的那块代码写写注释?小弟想学习一下
回复 支持 反对

使用道具 举报

尚未签到

2016-3-13 15:23:46 显示全部楼层
这个可以回,这个真得回!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了