精华内容
下载资源
问答
  • Qt寻找可用串口

    2020-11-18 23:15:50
    foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts()) { QSerialPort tempSer; tempSer.setPort(info); if(tempSer.open(QIODevice::ReadWrite)) { ui->comboBox->...
        foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
           {
               QSerialPort tempSer;
               tempSer.setPort(info);
               if(tempSer.open(QIODevice::ReadWrite))
               {
                   ui->comboBox->addItem(tempSer.portName());
                   tempSer.close();
               }
           }
    
    展开全文
  • QT 自动获取可用串口

    2020-12-31 14:54:45
    QT 自动获取可用串口 MainWindow.h头文件中添加依赖的头文件 #include <QSettings> #include <qt_windows.h> 2.类MainWindow中定义变量,声明函数 public: //定义变量 HKEY hKey; LPCWSTR subkey;...

    QT 自动获取可用串口

    1. MainWindow.h头文件中添加依赖的头文件
    #include <QSettings>
    #include <qt_windows.h>
    

    2.类MainWindow中定义变量,声明函数

    public:
       //定义变量
        HKEY hKey;
        LPCWSTR subkey;
        wchar_t keyname[256]; //键名数组
        char keyvalue[256];  //键值数组
        DWORD keysize,type,valuesize;
        int indexnum;
     
       //声明函数
        QString getcomm(int index, QString keyorvalue);
        void init_comm();
    
    1. MainWindow.cpp源文件中实现
    QString MainWindow::getcomm(int index, QString keyorvalue)
    {
        QString commResult;//返回
        QString keyMessage;
        QString valueMessage;
        QString message;
    
        //打开注册表
        if(::RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("HARDWARE\\DEVICEMAP\\SERIALCOMM"), 0, KEY_READ, &hKey) != 0)
        {
            qDebug("Cannot open reg!");
            return "Error";
        }
    
        indexnum = index;
        keysize = sizeof(keyname);
        valuesize = sizeof(keyvalue);
    
        if (RegEnumValue(hKey, indexnum, keyname, &keysize, 0, &type, (BYTE*)keyvalue, &valuesize) == 0)
        {
            //列举键名和值
            for (int i=0; i<(int)keysize; i++)
            {
                message = keyname[i];
                keyMessage.append(message);
            }
    
            for (int j = 0; j < (int)valuesize; j++)
            {
                if (keyvalue[j] != 0x00)
                {
                    valueMessage.append(keyvalue[j]);
                }
            }
    
            if (keyorvalue == "key")
            {
                commResult = keyMessage;
            }
    
            if (keyorvalue == "value")
            {
                commResult = valueMessage;
            }
        }
        else
        {
            commResult = "nokey";
        }
    
        RegCloseKey(hKey);//关闭注册表
    
        return commResult;
    }
    
    void MainWindow::init_comm()
    {
        QString path = "HKEY_LOCAL_MACHINE\\HARDWARE\\DEVICEMAP\\SERIALCOMM";
        QSettings *settings = new QSettings(path, QSettings::NativeFormat);
        QStringList keylist = settings->allKeys();
        QStringList comlist;
        comlist.clear();
    
        /* 获取串口名 */
        for (int i = 0; i < keylist.size(); i++)
        {
            if(getcomm(i, "value") != "Error" &&  getcomm(i, "value") != "nokey")
            {
                 comlist << getcomm(i, "value");
            }
        }
        ui->portNameComboBox->addItems(comlist);
    }
    
    

    4.在构造函数中进行调用init_comm()即可。

    展开全文
  • Qt5串口通信,自己编的。测试过可以用。上传资源。本想免费提供给小伙伴们,一起交流@我啊。发布时资源分数至少要1及以上...我并不想收费
  • qt第三方串口类编写的串口接发,编译运行测试通过
  • qt串口可用

    2015-07-31 12:47:34
    qt串口,已经用了好长时间了,还是这个稳定
  • Qt串口通信

    2021-01-25 12:38:46
    Qt写串口通信 前言:如果用qt写程序作为上位机,然后通过和usb和下位机通信的时候,就需要用到qt中的串口通信了。 使用qt中的串口通信的时候需要用到的两个...同时可以使用自动寻找可用串口的方法,直接自动设置了 fore

    Qt写串口通信

    前言:如果用qt写程序作为上位机,然后通过和usb和下位机通信的时候,就需要用到qt中的串口通信了。

    使用qt中的串口通信的时候需要用到的两个头文件分别为:

    官方文档使用串口需要包含的库文件
    在这里插入图片描述
    一般来讲qt串口通信需要经过7步:
    1、设置串口名(如COM1):

    serial = new QSerialPort;
     serial->setPortName(ui->PortBox->currentText());
    

    同时可以使用自动寻找可用串口的方法,直接自动设置了

    foreach (const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
        {
            QSerialPort serial;
            serial.setPort(info);
            if(serial.open(QIODevice::ReadWrite))
            {
                ui->PortBox->addItem(serial.portName());
                serial.close();
            }
        }
    

    2、打开串口

    serial->open(QIODevice::ReadWrite);
    

    3、设置波特率(如115200)

    serial->setBaudRate(QSerialPort::Baud115200);//设置波特率为115200
    

    4、设置数据位(如8)

    serial->setDataBits(QSerialPort::Data8);//设置数据位8
    

    5、设置校验位(如0)

    serial->setParity(QSerialPort::NoParity); //校验位设置为0
    

    6、设置停止位(如1)

    serial->setStopBits(QSerialPort::OneStop);//停止位设置为1
    

    7、设置流控制

    serial->setFlowControl(QSerialPort::NoFlowControl);//设置为无流控制
    

    到这里串口通信的设置就完成了,下面我们需要实现对数据的发送和接收

    1、连接数据接收槽函数,下位机中一有数据发送过来的时候就会响应这个槽函数

    QObject::connect(serial,&QSerialPort::readyRead,this,&MainWindow::ReadData);
    

    2、从上位机发送数据到下位机

    serial->write(ui->textEdit_2->toPlainText().toLatin1());
    

    注意事项:
    使用串口通信的时候是按字节发送的,所以如果你定义一个char buff[10],而且你想这样定义buff[0] = '255’发送255这个字符给下位机的时候,下位机是接收不完整的,经过测试发现发送大于或等于10的字符是会被截断的,只会留下最后一个字符,比如说发送10字符的时候,下位机很有可能只能接收到0这个字符,当然如果想要完整的发送过去的话可以定义成字符串形式。比如char buff[] =“255”,这样就可以发送一个完整的255过去了,但是需要注意的是这是一个字符串不是一个字符,所以如果你在下位机如果要根据上位机发送的数据来处理一些事情的时候一定要清楚你发送的是字符还是字符串。

    展开全文
  • 每一个包都加一个包头,里面包括数据类型(图片/温湿度),节点号(哪一个模块的数据),数据包的序号,数据包有效长度等信息,辅助解析串口数据。每一个包分两两部分读取,包头+有效数据。从包头获取有效数据长度,...

    每一个包都加一个包头,里面包括数据类型(图片/温湿度),节点号(哪一个模块的数据),数据包的序号,数据包有效长度等信息,辅助解析串口数据。

    每一个包分两两部分读取,包头+有效数据。

    从包头获取有效数据长度,让串口只读取有效长度的字节数即可得到一个完整的数据包。在切换为包头读取状态!!!!

    void MainWindow::serialRead()
    {
        int cnt_tmp;
    
        static unsigned int seq_old = 0;
    
        static unsigned int pkt_cnt = 0;
    
    
        QByteArray tmp_data;
        //char ACK[1] = {1};
    
        if(serial.bytesAvailable() >= 1)
        {
            switch(serial_state)
            {
    
            case READ_HDR:
                cnt_need = HDR_LEN - cnt_read;
    
                tmp_data = serial.read(cnt_need);
                if(tmp_data.isEmpty())
                    return ;
    
                cnt_tmp = tmp_data.length();
    //            //qDebug()<<"0:"<<cnt_tmp;
                cnt_read +=  cnt_tmp;
                read_data += tmp_data;
                if(HDR_LEN == cnt_read)
                {
                    cnt_read = 0;
                    cnt_need = 0;
                    serial_state = READ_DATA;
                    node_type = bytesToInt(read_data.mid(0,1));
                    node_id = bytesToInt(read_data.mid(1,1));
                    data_need = bytesToInt(read_data.mid(7,1));
                    seqnb = bytesToInt(read_data.mid(6,1))*256 + bytesToInt(read_data.mid(5,1));
                    if(seqnb == seq_old)
                    {
                        FAIL_FLAG = true;
                        qDebug()<<"seqnb err..********************************";
                    }
                    else if(seqnb - seq_old > 1)
                    {
                        FAIL_FLAG = false;
                        int need_pkt = seqnb - seq_old;
                        QByteArray errData(64*(need_pkt-1),0);
                        //qDebug()<<"diushide: "<<64*(need_pkt-1);
                        my_stream += errData;
                        dst.write(my_stream);
                        my_stream.clear();
                        pkt_cnt = 0;
    
                    }
                    else {
                        FAIL_FLAG = false;
                    }
                    seq_old = seqnb;
    
    
    
    
                    //操作头部数据
                    QString str_display;
                    QString str = read_data.toHex().data();
    
                    str = str.toUpper();
    
                    str_display.clear();
                    for(int i = 0;i < str.length();i+= 2)
                    {
                        QString st = str.mid(i,2);
                        str_display += st;
                        str_display += " ";
                    }
    
                    //显示数据
                    ui->textEdit->insertPlainText(str_display);
    
    
                    read_data.clear();
    
                }
                break;
    
            case READ_DATA:
                if(node_type == 1)
                {
                    cnt_need = data_need - cnt_read;
     //               //qDebug()<<"2:"<<cnt_need;
                    tmp_data = serial.read(cnt_need);
                    if(tmp_data.isEmpty())
                        return ;
    
                    cnt_tmp = tmp_data.length();
    
                    cnt_read +=  cnt_tmp;
                    read_data += tmp_data;
                    //qDebug()<<"3:"<<cnt_read;
    
                    cnt += cnt_tmp;
    
                    if(data_need == cnt_read)
                    {
                        cnt_read = 0;
                        cnt_need = 0;
    
    
                        serial_state = READ_HDR;
    
    
    
    
                        //if(photo_state == END && strcmp("end\r\n",str_tmp) == 0)
                        //if(strcmp("end",str_tmp) == 0)
                        if(read_data.contains("end"))
                        {
                            dst.close();
                            qDebug()<<"end";
                            qDebug()<<cnt;
                            read_data.clear();
                            my_stream.clear();
                            photo_state = BEGIN;
                            //serial.write(ACK);
                            data_need = 0;
                            cnt = 0;
    
                            return ;
                        }
    
                        //if(photo_state == BEGIN && strcmp("begin\r\n",str_tmp) == 0)
                        //if(strcmp("begin\r\n",str_tmp) == 0)
                        if(read_data.contains("begin"))
                        {
                            QDateTime time = QDateTime::currentDateTime();//获取系统现在的时间
    
                            //设置显示格式,注意QFile的文件名不能有:(冒号)等特殊字符
                            QString str = time.toString("yyyy-MM-dd-hh-mm-ss");
                            str += ".jpg";
    
                            qDebug()<<str;
    
                            dst.setFileName(str);//将时间作为文件名
                            //QDir::currentPath()
                            bool isOK = dst.open(QIODevice::WriteOnly|QIODevice::Append);
                            if(isOK == false)
                            {
                                qDebug()<<"dst.open err";
                                this->close();
                            }
                            //my_stream.setDevice(&dst);
                            read_data.clear();
                            photo_state = READING;
                            //serial.write(ACK);
                            data_need = 0;
    
                            return ;
                        }
                        //if(photo_state == READING)
                        {
                            if(FAIL_FLAG == true)
                            {
                                //serial.write(ACK);
                                read_data.clear();
                                data_need = 0;
                                return;
                            }
     //                       //qDebug()<<"==========>"<<seqnb;
                            pkt_cnt++;
                            my_stream += read_data;
                            if(data_need < REAL_LEN)
                            {
                                photo_state = END;
                                dst.write(my_stream);
                                my_stream.clear();
                                pkt_cnt = 0;
                            }
    
                            if(pkt_cnt == 32)
                            {
                                pkt_cnt = 0;
                                dst.write(my_stream);
                                my_stream.clear();
                            }
    
    
                            //serial.write(ACK);
                            read_data.clear();
                            data_need = 0;
                        }
                    }
                }
    
                break;
            default:
                break;
    
            }
        }
    
    
    
    }
    
    
    展开全文
  • 实现结果:点击串口选择下拉框,重新扫描可用串口,并且显示端口硬件信息。 1. 新建类,继承 QComboBox,重写鼠标点击事件 代码中,对一些方法和属性的说明: scanActivePort:扫描可用...
  • Qt实现串口调试工具

    2020-09-20 15:52:08
    一、效果图 二、重要方法和函数 ①模块和头文件:Qt中要调试串口...②获取可用串口Qt下获取可用串口非常简单,QSerialPortInfo类有一个静态成员函数:availablePorts(),一句话就可以获取到所有的可以使用的串口对象
  • QT串口助手实现实时更新可用串口
  • QT5串口编程

    千次阅读 2016-04-29 18:10:53
    你可以使用QSerialPoartInfo帮助类获取可用串口资源,(将会列举出系统中所有的口 对获取正确的串口号是很有帮助的,   使用 setPort()or setPortName() 设置参数来设置所需的串口,设置完后使用 只读 只写或...
  • 一、导入库 1、在项目.pro文件中加入serialport QT += core gui QT += serialport 2、引入qt中串口通信需要的头文件 ...通过创建一个comobox,将可用串口的列表展示出来,并用于配置时选择要连接的串口
  • QT串口通信

    2020-09-11 13:41:05
    //查找可用串口 QList<QSerialPortInfo> localAvailablePorts = QSerialPortInfo::availablePorts(); serial = new QSerialPort;//创建串口通信类 serial->setPortName(ui->PortBox->currentText...
  • 关于Qt5 QtSerialPort串口通信

    万次阅读 2015-10-30 19:56:06
    最近用Qt5重写了以前用MFC做的串口通信程序,从中提取了基础的部分, 做了一个简单的程序完成了一些功能: 串口基本的收,发数据 串口是否可用判定,串口状态与按钮状态之间联系 串口发送:字符和16进制发送的选择 ...
  • QT串口类QSerialPort

    2018-04-03 09:34:05
    一、串口类简介当前的Qt... QSerialPortInfo 是一个辅助类,可以提供计算机中可用串口的各种信息。使用方法 先介绍 QSerialPortInfo 的使用。下面是一个简单的例子,用来列举出电脑上全部的串口设备。 ...
  • QT5 串口收发实例代码

    2016-12-05 09:10:00
    自动检测可用串口 在xp上测试没问题 有些usb转串口会出现波特率不准的问题,CH340的usb转232使用完全正常 以下为收发的线程.h 和.cpp两个文件 最后附上转sacii显示的代码 如果要参考的话,源代码已上传:...
  • Qt下由两种方式获得计算机可用串口:一是通过读取注册表获取,当然这只适用于Windows系统;二是利用QSerialPort和QSerialPortInfo类来获取。本文代码使用Qt5.9.6版本测试。 方法一 获取windows注册表中的串口...
  • 本博文主要是介绍如何使用QT的串口类(QSerialPort)来实现串口的开发,使用这个类来实现串口的基本功能,比如如何查询本机可用串口(com),打开串口、设置串口波特率、设置数据位、设置校验位、停止位等窗口属性...
  • 功能作为串口助手来说还算完善,五个发送槽,一个接收槽,可以检测可用串口并加上相关标志,串口设置,记数功能,还有菜单栏上的文件操作和一些选择功能。 下面说一说这个项目: 做这个串口助手分为两步,第一步是...
  • 一、QT串口通讯

    2020-06-10 11:22:13
    一、前言 最近用QT制作一个界面,需要实现一个简单的串口通讯,网上也有很多这方面的资料,这里就总结下。 ...这里用了一个关键字foreach,它能查找容器中可用串口端口号。 5、打开串口 6、
  • QT实现串口打开和关闭

    千次阅读 2018-11-08 19:31:20
    info,QSerialPortInfo::availablePorts()) //不确定有多少串口可用,也就不知道循环多少次,所以用foreach(不知道用的就百度) { QSerialPort serial; //在循环语句内部实例化类,因为可用...
  • 该程序为上位机界面的基本收发模块,可以当作串口助手使用,功能还算完善,五个发送槽,一个接收槽,可以检测可用串口并加上相关标志,串口设置,记数功能,还有菜单栏上的文件操作和一些选择功能。源代码都在里面。...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 124
精华内容 49
关键字:

qt可用串口