精华内容
下载资源
问答
  • QSerialPort

    2019-09-23 20:24:44
    (草稿) qt5提供QSerialPort类,封装了串口的api, 可以用这个类写串口通信程序。 转载于:https://www.cnblogs.com/iois/p/4667982.html

    (草稿)

    qt5提供QSerialPort类,封装了串口的api,
    可以用这个类写串口通信程序。

    转载于:https://www.cnblogs.com/iois/p/4667982.html

    展开全文
  • QSerialport

    2019-01-12 17:22:25
    大部分就做了几个功能,串口的正常读写已经不用说了,主要是通过自动连接,以及USB断开的时候提醒以及再次插上的时候的提醒 自动连接主要是通过开机获取所有的端口名
  • Qt 串口通信(QSerialPort)

    万次阅读 多人点赞 2018-08-14 16:55:50
    QSerialPort https://doc.qt.io/qt-5.9/qserialport.html //小伙伴们具体去看文档 使用的时候在 pro 添加这句导入模块 QT += serialport 1.连接串口 第一步就是 要先获取到 可连接的所有的串口的名字 ...

    前言:

    本文讲述的 QSerialPort 是在qt5 + 版本以上才有

    qt 4.x + linux 环境 请看这篇

    正文

    与下位机,单片机通信少不了使用串口进行通信,Qt 也提供了串口通信的类

    QSerialPort

    https://doc.qt.io/qt-5.9/qserialport.html //小伙伴们具体去看文档
    

    使用的时候在 pro 添加这句导入模块 QT += serialport
    1.连接串口 第一步就是 要先获取到 可连接的所有的串口的名字

    QSerialPortInfo::availablePorts()
    [static] QList<QSerialPortInfo> QSerialPortInfo::availablePorts()
    Returns a list of available serial ports on the system.
    返回系统上可用串行端口的列表
     
    

    QSerialPortInfo

    Provides information about existing serial ports.
    Use the static functions to generate a list of QSerialPortInfo objects. Each QSerialPortInfo object in the list represents a single serial port and can be queried for the port name, system location, description, and manufacturer. The QSerialPortInfo class can also be used as an input parameter for the setPort() method of the QSerialPort class.
    See also QSerialPort.
    
    提供关于现有串行端口的信息。
    使用静态函数生成QSerialPortInfo对象列表。列表中的每个QSerialPortInfo对象表示一个串行端口,可以查询端口名称、系统位置、描述和制造商。QSerialPortInfo类还可以用作QSerialPort类的setPort()方法的输入参数。
    
    
    
    //这样我们就获取到 可用的串口名字了
    
    QStringList m_serialPortName;
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {
    	m_serialPortName << info.portName();
    	qDebug()<<"serialPortName:"<<info.portName();
    }
    

    获取到串口名字列表以后,我们需要选择一个需要连接的 (自行根据选择)

    2.根据串口名字 打开串口

    #include<QSerialPort>
    
    QSerialPort *m_serialPort = new QSerialPort();//实例化串口类一个对象
    
    if(m_serialPort->isOpen())//如果串口已经打开了 先给他关闭了
    {
    	m_serialPort->clear();
    	m_serialPort->close();
    }
    
    //设置串口名字 假设我们上面已经成功获取到了 并且使用第一个
    m_serialPort->setPortName(m_serialPortName[0]);
    
    if(!m_serialPort->open(QIODevice::ReadWrite))//用ReadWrite 的模式尝试打开串口
    {
    	qDebug()<<m_serialPortName[0]<<"打开失败!";
    	return;
    }
    //打开成功
    	
        m_serialPort->setBaudRate(QSerialPort::Baud115200,QSerialPort::AllDirections);//设置波特率和读写方向
        m_serialPort->setDataBits(QSerialPort::Data8);		//数据位为8位
        m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//无流控制
        m_serialPort->setParity(QSerialPort::NoParity);	//无校验位
        m_serialPort->setStopBits(QSerialPort::OneStop); //一位停止位
    
    	//连接信号槽 当下位机发送数据QSerialPortInfo 会发送个 readyRead 信号,我们定义个槽void receiveInfo()解析数据
    	connect(m_serialPort,SIGNAL(readyRead()),this,SLOT(receiveInfo()));
    	
    
    

    3.下位机(单片机) ,上位机(Qt程序) 发送交互数据

    	//接收单片机的数据
    	void receiveInfo()
    	{
    		QByteArray info = m_serialPort->readAll();
    		QByteArray hexData = info.toHex();
    		//这里面的协议 你们自己定义就行  单片机发什么 代表什么 我们这里简单模拟一下
    		if(hexData == "0x10000")
    		{
    			//do something
    		}
    		else if(hexData  == "0x100001")	
    		{
    			//do something
    		}
    		
    	}
    	//向单片机发送数据
    	
    	//基本和单片机交互 数据 都是16进制的 我们这里自己写一个 Qstring 转为 16进制的函数	
    	void convertStringToHex(const QString &str, QByteArray &byteData)
    	{
    		int hexdata,lowhexdata;
    	    int hexdatalen = 0;
    	    int len = str.length();
    	    byteData.resize(len/2);
    	    char lstr,hstr;
    	    for(int i=0; i<len; )
    	    {
    	        //char lstr,
    	        hstr=str[i].toLatin1();
    	        if(hstr == ' ')
    	        {
    	            i++;
    	            continue;
    	        }
    	        i++;
    	        if(i >= len)
    	            break;
    	        lstr = str[i].toLatin1();
    	        hexdata = convertCharToHex(hstr);
    	        lowhexdata = convertCharToHex(lstr);
    	        if((hexdata == 16) || (lowhexdata == 16))
    	            break;
    	        else
    	            hexdata = hexdata*16+lowhexdata;
    	        i++;
    	        byteData[hexdatalen] = (char)hexdata;
    	        hexdatalen++;
    	    }
    	    byteData.resize(hexdatalen);
    	}
    	
    	//另一个 函数 char 转为 16进制
    	char SerialPort::convertCharToHex(char ch)
    	{
    	    /*
    	    0x30等于十进制的48,48也是0的ASCII值,,
    	    1-9的ASCII值是49-57,,所以某一个值-0x30,,
    	    就是将字符0-9转换为0-9
    	
    	    */
    	    if((ch >= '0') && (ch <= '9'))
    	         return ch-0x30;
    	     else if((ch >= 'A') && (ch <= 'F'))
    	         return ch-'A'+10;
    	     else if((ch >= 'a') && (ch <= 'f'))
    	         return ch-'a'+10;
    	     else return (-1);
    	}
    
    
    	//写两个函数 向单片机发送数据 
    	void sendInfo(char* info,int len){
    	
    		for(int i=0; i<len; ++i)
    	    {
    	        printf("0x%x\n", info[i]);
    	    }
    	    m_serialPort->write(info,len);//这句是真正的给单片机发数据 用到的是QIODevice::write 具体可以看文档 
    	}
    	
    	void sendInfo(const QString &info){
    	
    		QByteArray sendBuf;
    	    if (info.contains(" "))
    	    {
    	        info.replace(QString(" "),QString(""));//我这里是把空格去掉,根据你们定的协议来
    	    }
    	    qDebug()<<"Write to serial: "<<info;
    	    convertStringToHex(info, sendBuf); //把QString 转换 为 hex 
    	    
    	    m_serialPort->write(sendBuf);这句是真正的给单片机发数据 用到的是QIODevice::write 具体可以看文档
    
    	}
    

    4.析构的时候 关闭串口

        if (m_serialPort->isOpen())
        {
            m_serialPort->close();
        }
        delete m_serialPort;
    

    ##源码:

    widget.h

    #ifndef WIDGET_H
    #define WIDGET_H
    
    #include <QWidget>
    #include <QSerialPort>
    #include <QSerialPortInfo>
    #include <QComboBox>
    #include <QPushButton>
    namespace Ui {
    class Widget;
    }
    
    class Widget : public QWidget
    {
        Q_OBJECT
    
    public:
        explicit Widget(QWidget *parent = 0);
        ~Widget();
    
        void initUI();
    
        QStringList getPortNameList();//获取所有可用的串口列表
    
        void openPort();//打开串口
    public slots:
        void receiveInfo();
    private:
        Ui::Widget *ui;
        QSerialPort* m_serialPort; //串口类
        QStringList m_portNameList;
    
        QComboBox* m_PortNameComboBox;
        QPushButton* m_OpenPortButton;
    };
    
    #endif // WIDGET_H
    
    

    widget.cpp

    #include "widget.h"
    #include "ui_widget.h"
    #include <QLayout>
    
    #include <QDebug>
    
    Widget::Widget(QWidget *parent) :
        QWidget(parent),
        ui(new Ui::Widget)
    {
        ui->setupUi(this);
        m_serialPort = new QSerialPort();
    
        initUI();
    
        m_portNameList = getPortNameList();
    
        m_PortNameComboBox->addItems(m_portNameList);
    
        connect(m_OpenPortButton,&QPushButton::clicked,this,&Widget::openPort);
    
    }
    
    Widget::~Widget()
    {
        if (m_serialPort->isOpen())
        {
            m_serialPort->close();
        }
        delete m_serialPort;
    
        delete ui;
    }
    
    void Widget::initUI()
    {
        this->setWindowTitle("码农小明 test QSerialPort");
    
    
        m_OpenPortButton = new QPushButton();
        m_OpenPortButton->setText("打开串口");
    
        m_PortNameComboBox  = new QComboBox();
    
        QHBoxLayout *m_layout = new QHBoxLayout();
    
        m_layout->addWidget(m_PortNameComboBox);
        m_layout->addWidget(m_OpenPortButton);
    
        this->setLayout(m_layout);
    }
    
    QStringList Widget::getPortNameList()
    {
        QStringList m_serialPortName;
        foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
        {
            m_serialPortName << info.portName();
            qDebug()<<"serialPortName:"<<info.portName();
        }
        return m_serialPortName;
    }
    
    void Widget::openPort()
    {
        if(m_serialPort->isOpen())//如果串口已经打开了 先给他关闭了
        {
            m_serialPort->clear();
            m_serialPort->close();
        }
    
    
        m_serialPort->setPortName(m_PortNameComboBox->currentText());//当前选择的串口名字
    
        if(!m_serialPort->open(QIODevice::ReadWrite))//用ReadWrite 的模式尝试打开串口
        {
            qDebug()<<"打开失败!";
            return;
        }
        qDebug()<<"串口打开成功!";
    
        m_serialPort->setBaudRate(QSerialPort::Baud115200,QSerialPort::AllDirections);//设置波特率和读写方向
        m_serialPort->setDataBits(QSerialPort::Data8);      //数据位为8位
        m_serialPort->setFlowControl(QSerialPort::NoFlowControl);//无流控制
        m_serialPort->setParity(QSerialPort::NoParity); //无校验位
        m_serialPort->setStopBits(QSerialPort::OneStop); //一位停止位
    
        connect(m_serialPort,SIGNAL(readyRead()),this,SLOT(receiveInfo()));
    }
    
    //接收到单片机发送的数据进行解析
    void Widget::receiveInfo()
    {
        QByteArray info = m_serialPort->readAll();
    
        qDebug()<<"receive info:"<<info;
    
    }
    
    

    这里写图片描述
    这里写图片描述
    这里写图片描述

    下面处理数据的就不写了 简单的串口小demo 就完成了

    如果此文章对你有帮助请点个关注点个赞,这就是我最大的鼓励 谢谢

    展开全文
  • QSerialPort小示例

    2016-05-25 10:26:01
    QSerialPort小示例
  • QSerialPort 总结

    2020-09-21 12:40:44
    1QSerialPort能读多于512字节的数据吗? 答:可以,需要自己判断数据是否完整,或者根据数据是否有头和尾来判断,参考...

    1  QSerialPort能读多于512字节的数据吗

    答:可以,需要自己判断数据是否完整,或者根据数据是否有头和尾来判断,参考https://blog.csdn.net/Kelvin_Yan/article/details/78975147?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

      void MainWindow :: serialReceived()
     {
     receivedData.append(serialPort-> readAll()); 
     if(receivedData.size()> = 4000){
     //我们已满
    } 
    } 

    问题:QSerialPortreadyRead()信号,只要有数据就抛出,这就导致一条数据分多次抛出。由于正常的数据没有固定的开头和结尾,这就导致无法获取正常的一组数据

    答:增加接收延时功能,把多次读取的数据保存到缓冲区,延时结束,一次性读取数据  ,参考https://blog.csdn.net/jason_thinking/article/details/78455750

    3 串口内部的缓冲区大小可以通过:setReadBufferSize(qint64 size)实现。当设定缓冲区大小时,串口只能接收size大小的数据流,因此存在数据丢书的可能。当设置为0的时候,并不是指的缓冲区大小为0,而是无穷大,这样就可以保存数据的全部接收完整。这是缓冲区大小的默认属性。 一旦知道串口已经可以读或写,你可以调用read() 或者write()函数去读或者写串口。另外也可以方便的调用readLine() 和readAll()函数。若没有立即读取所有的数据,那么剩下的数据将会作为新传入的数据追加到QSerialPort类内部的读取缓冲区中。

    展开全文
  • QSerialPort

    2016-04-21 16:10:00
    一、简介 QSerialPort类是Qt5封装的串口类,可以与串口进行通信。QSerialPortInfo是一个辅助类,提供串口的一些信息,如可用的串口名称,描述,制造商,序列号,串口16位产品编号等。利用QSerialPortInfo提供的可用...
    一、简介
        QSerialPort类是Qt5封装的串口类,可以与串口进行通信。QSerialPortInfo是一个辅助类,提供串口的一些信息,如可用的串口名称,描述,制造商,序列号,串口16位产品编号等。利用QSerialPortInfo提供的可用串口信息,可设置串口波特率,并打开需要的串口进行通信。
    二、使用
    使用时要注意,通过找到计算机可用的串口,得到后,要调用setPortName或者setPortInfo使我们实例化的串口对象与我们想使用的可用串口进行映射。此时我们就可以使用QSerialPort对象对串口进行操作了

    a. 串口的初始化:

    QSerialPort *serial = new QSerialPort();
    QObject::connect(serial, this, SLOT(recSerialData())); // 连接串口收到数据事件与读取数据函数       
    serial->setBaudRate(QSerialPort::Baud9600);
    serial->setParity(QSerialPort::NoParity);
    serial->setDataBits(QSerialPort::Data8);
    serial->setStopBits(QSerialPort::OneStop);
    serial->setFlowControl(QSerialPort::NoFlowControl);
    if (serial->open(QIODevice::ReadWrite)) {
        qDebug()<<"open success";
    } else {
        qDebug()<<"open failed";
    }

    b. 向串口发送数据

    serial->write("test");

    c. 接收串口返回的数据

    void MySerial::recSerialData()
    {
        QByteArray ba;
       
        display(ba);
    }

    三、总结

    总的来说,使用Qt5进行串口通信是较为简单的。大致步骤为:配置串口参数->打开串口->收发数据。






    转载于:https://www.cnblogs.com/chengkeke/p/5417399.html

    展开全文
  • 接着写一下QserialPort的成员函数。 本文主要参考的是官方手册,力争写一个可信的,详尽可查的QserialPort类学习手册。 1、构造函数 QSerialPort的构造函数有三种形式,分别是: *1、QSerialPort::QSerialPort...
  • Qt 串口类QSerialPort

    2020-12-29 17:59:28
    Qt 串口类QSerialPort 使用笔记 Qt5.1 中提供了QtSerialPort模块,方便编程人员快速的开发应用串口的应用程序。 本文就简单的讲讲QtSerialPort模块的使用。 当前的QtSerialPort模块中提供了两个C++类,分别是...
  • QT写的c++ 客户端服务端串口通讯QSerialPortQSerialPort类是Qt5封装的串口类,可以与串口进行通信。QSerialPortInfo是一个辅助类,提供串口的一些信息,如可用的串口名称,描述,制造商,序列号,串口16位产品编号...
  • QT QSerialPort 的坑

    2021-02-10 10:30:18
    QSerialPort接收数据 因为数据量比较大,所以把串口接收数据的类放入了线程 结果程序莫名崩溃,一开始还以为哪里指针报错了 尝试了很久 然后我在 QSerialPort 的 readAll() 前后进行了qDebug() 发现 readAll() 后...
  • QT 串口通信 QSerialPort

    2020-07-29 10:16:06
    QSerialPort和QSerialPortInfo。 QSerialPort类提供了操作串口的各种接口; QSerialPortInfo是一个辅助类,主要提供了计算机中可用串口的各种信息; 使用方法 1、首先我们再使用串口之前,先在QT的工程文件...
  • Qserialport QT

    2019-02-28 16:13:33
    基于QT开发的一些C++串口助手的demo很全,幸苦收集不易。
  • 主要介绍了PyQt5 QSerialPort子线程操作的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  • Qt串口通信,QSerialPort的使用

    万次阅读 2019-02-16 17:11:12
    Qt写上位机时,串口通信是个常用功能,在Qt4的时候有第三方模块QextSerialPort,到了Qt5.1官方提供了QSerialPort模块。 目录 前言 获取串口信息:QSerialPortInfo 串口IO操作:QSerialPort 实例操作 补充:16...
  • QSerialport多线程方法

    千次阅读 2019-05-20 07:19:42
    QSerialport多线程方法 使用Qt也已经有一段时间了,虽然使用过继承QThread重写run函数,以及继承QObject然后使用MoveToThread两种方法实现多线程,但是在QSerialPort的使用过程中,两种方法都存在一定的问题。 ...
  • <div><p>No need to use ... QSerialPort Class (http://doc.qt.io/qt-5/qserialport.html) is now part of Qt <p>Not tested: windows build</p><p>该提问来源于开源项目:GENIVI/dlt-viewer</p></div>
  • QT5.51使用QSerialPort

    2018-01-08 15:58:09
    就和TCP差不多。初始化一下。连一个槽函数读数据 init() { _serialPort = new QSerialPort(this);//QSerialPort* _serialPort;... _serialPort->setBaudRate(19200);... _serialPort->setDataBits(QSerialPort::Dat
  • QSerialPort,QSerialPortInfo使用

    千次阅读 2017-12-23 20:46:02
    Qt操作串口的两个类便是QSerialPort和QSerialPortInfo 从类名可以知道QSerialPortInfo是用来获取串口信息的类,那么QSerialPort便是直接操作串口的类。QSerialPortInfo
  • QSerialPort开发一个串口通信的小程序来验证波特率与串口传输速度的关系
  • from PyQt5.QtSerialPort import QSerialPort,QSerialPortInfo #实例化一个对象 self.com = QSerialPort() #链接串口对象的接收函数 self.com.readyRead.connect(self.readSerialPortInfo) #定义一个函数作为串口...
  • 使用Qt5的QSerialPort类,编写串口助手程序。 可以实现串口选择、打开、发送、接收等功能。 想实现qt串口通信,可以参考。
  • 当前的QtSerialPort模块中提供了两个C++类,分别是QSerialPort 和QSerialPortInfo。 QSerialPort 类提供了操作串口的各种接口。 QSerialPortInfo 是一个辅助类,可以提供计算机中可用串口的各种信息。 一: .pro中...
  • 我的这篇文章中提到了Qt中QSerialPort的内存泄漏问题。在云台随动的头瞄系统中,还要求云台高速实时的随动,这一点在上一篇文章中并没有解决。 当时的原因,主要是QTimer定时器对串口读取线程的影响(具体如何影响的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 633
精华内容 253
关键字:

qserialport