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

QT5.3.2如何自动获取可用的串口号

15
回复
24397
查看
[复制链接]
累计签到:344 天
连续签到:1 天
来源: 2014-12-5 16:11:01 显示全部楼层 |阅读模式
10Qter豆
电脑环境是win7,QT是5.3.2。想要请教下各位大哥如何自动获取电脑上可用的串口号。不要那种全部串口号然后一个一个去试的那种,这个太傻了。我想要的是比如读读电脑的注册表信息之类的或者其他方法。
请知道的大大写下可以通过编译的源码给我啊,谢谢。不要直接说,要代码,一定要代码。
另外如果高手些的话也请写下linux版的。万分感谢。

最佳答案

查看完整内容

是啊。Qt 5自带了串口类,有函数可以获取可用串口的。 其实咱们的串口助手也可以在Qt 5编译通过的。
回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2014-12-5 16:11:02 显示全部楼层
cai901022 发表于 2014-12-5 16:31
郁闷,最后还是自己解决了,QT5有自带的串口类。

是啊。Qt 5自带了串口类,有函数可以获取可用串口的。
其实咱们的串口助手也可以在Qt 5编译通过的。

点评

站长,,是哪个函数可以获得可用的串口啊?  详情 回复 发表于 2015-8-27 09:02
回复

使用道具 举报

累计签到:344 天
连续签到:1 天
2014-12-5 16:14:12 显示全部楼层
还有个忘记说了,我要QT5版本的,不要QT4或者以下的,最好要最新的。网上我知道百度文库有这个方法,不过那个有点小bug,我希望要最新的,没有bug那种
回复

使用道具 举报

累计签到:344 天
连续签到:1 天
2014-12-5 16:31:14 显示全部楼层
郁闷,最后还是自己解决了,QT5有自带的串口类。
回复

使用道具 举报

累计签到:344 天
连续签到:1 天
2014-12-8 09:16:38 显示全部楼层
串口通信在嵌入式设备开发中非常常用,在Qt5之前,要实现串口通信,需要借助第三方串口封装代码,QT5已经自带了类来完成这项工作。

代码如下:

//1. [代码]在pro文件中添加     
//QT       += serialport

///引入头文件
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>

//[代码]初始化     
    my_serialport->setPortName(ComName);
    my_serialport->setBaudRate(9600);
    my_serialport->setDataBits(QSerialPort:ata8);
    my_serialport->setParity(QSerialPort::NoParity);
    my_serialport->setStopBits(QSerialPort::OneStop);
    my_serialport->setFlowControl(QSerialPort::NoFlowControl);
附上一段完整的实例代码:

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}
widget.h widget.cpp

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QTimer>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private slots:
    void on_pushButton_cmopen_clicked();
    void updateAA();

    void on_pushButton_send_clicked();

private:
    Ui::Widget *ui;
    QSerialPort *my_serialport;
    QByteArray requestData;
    QTimer *timer;
};

#endif // WIDGET_H
#include "widget.h"
#include "ui_widget.h"
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QDebug>
#include <QTimer>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
        qDebug() << "Name        : " << info.portName();
        qDebug() << "Description : " << info.description();
        qDebug() << "Manufacturer: " << info.manufacturer();

        // Example use QSerialPort
        QSerialPort serial;
        serial.setPort(info);
        if (serial.open(QIODevice::ReadWrite))
        {
            ui->comboBox->addItem(info.portName());
            serial.close();
        }
    }
}

Widget::~Widget()
{
    delete ui;
}

void Widget:n_pushButton_cmopen_clicked()
{
    my_serialport= new QSerialPort();
    qDebug()<<ui->comboBox->currentText();
    my_serialport->setPortName(ui->comboBox->currentText());
    my_serialport->open(QIODevice::ReadWrite);
    qDebug()<<ui->lineEdit->text().toInt();
    my_serialport->setBaudRate(ui->lineEdit->text().toInt());
    my_serialport->setDataBits(QSerialPort:ata8);
    my_serialport->setParity(QSerialPort::NoParity);
    my_serialport->setStopBits(QSerialPort::OneStop);
    my_serialport->setFlowControl(QSerialPort::NoFlowControl);

    timer = new QTimer(this);
    connect(timer, SIGNAL(timeout()), this, SLOT(updateAA()));
    timer->start(1000);
}

void Widget::updateAA()
{
    requestData = my_serialport->readAll();
    if(requestData!= NULL)
    {
        ui->textEdit->append(requestData);
    }
    requestData.clear();
}

void Widget:n_pushButton_send_clicked()
{
    QByteArray TxData = "aaaa";
    my_serialport->write(TxData);
回复

使用道具 举报

累计签到:344 天
连续签到:1 天
2014-12-8 09:18:40 显示全部楼层
问题自己解决了,本来想应该有人随便回答下然后送他十分的,竟然没人要。难道还要我附上答案
回复

使用道具 举报

尚未签到

2014-12-9 21:37:31 显示全部楼层
楼主是个靠谱人,此篇我应该会用到!
回复

使用道具 举报

尚未签到

2015-1-27 13:40:35 显示全部楼层
感谢楼主!!这个我用得上!!谢谢
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-4-20 17:18:34 显示全部楼层
楼主能把你的这个全套程序发我一下吗 我现在也在做这个 用的QT5.3,很急很急!! 谢谢楼主了!
回复

使用道具 举报

累计签到:344 天
连续签到:1 天
2015-4-20 17:22:53 显示全部楼层
z55716368 发表于 2015-4-20 17:18
楼主能把你的这个全套程序发我一下吗 我现在也在做这个 用的QT5.3,很急很急!! 谢谢楼主了! ...

可以,我上传上去吧,你自己去下载,稍等我下
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-4-21 08:47:20 显示全部楼层
cai901022 发表于 2015-4-20 17:22
可以,我上传上去吧,你自己去下载,稍等我下

请问在哪里 没有找到、、、
回复

使用道具 举报

累计签到:256 天
连续签到:1 天
2015-6-19 17:41:21 显示全部楼层
cai901022 发表于 2015-4-20 17:22
可以,我上传上去吧,你自己去下载,稍等我下

老板 我又来啦~ 问个问题 Qt5自带的QSerialport可以跨线程吗
我现在做的东西在主线程里面new了一个port,然后在其他线程进行发送接收,貌似运行正常但是发布出去东西也收不到东西
回复

使用道具 举报

累计签到:615 天
连续签到:1 天
2015-8-27 09:02:03 显示全部楼层
yafeilinux 发表于 2014-12-5 16:11
是啊。Qt 5自带了串口类,有函数可以获取可用串口的。
其实咱们的串口助手也可以在Qt 5编译通过的。 ...

站长,,是哪个函数可以获得可用的串口啊?
回复

使用道具 举报

累计签到:1570 天
连续签到:1 天
2015-8-30 11:00:59 显示全部楼层
QSerialPortInfo类的availablePorts()
回复

使用道具 举报

累计签到:3 天
连续签到:1 天
2015-12-10 09:52:14 显示全部楼层
学习了
回复

使用道具 举报

累计签到:9 天
连续签到:1 天
2016-5-11 15:50:53 显示全部楼层
int number_of_port = my_serialportinfo->availablePorts().count();
QList<QSerialPortInfo> list = my_serialportinfo->availablePorts();
for (int i = 0; i < number_of_port; i++)
{
        ui.comboBox_portname->addItem(list.at(i).portName());
}
回复

使用道具 举报

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

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