VS + Qt实现上位机串口通信:简单界面

在这里插入图片描述
先实现简单功能与界面结合。

在编写代码之前,首先要粗略了解页面的空间有哪些。
首先是固定信息如:串口号,这些可以用label设置,一共7个。
然后是显示框,接受和发送框,可以用textedit,一共2个。
其次是5个下拉选择框,控件combo box。
最后是2个pushbutton,一个控制串口的开闭,一个发送数据。

其次我们要了解大致的回调函数有哪些,什么动作会产生什么响应
首先是5个下拉选择框,5个trigger回调毋庸置疑。
发送按钮的按下回调。
打开关闭按钮的不同状态触发不同的槽函数。所以按钮有3个回调函数。

显示信息什么的我还没想好要不要专门写一个show();暂时搁置,练手之作吧。
在这里插入图片描述
一步一步来,第一当前所有可用串口列表。

串口信息获取要用到QSerialPortInfo类,上一篇博文已经测试了这一部分函数的主要功能,所以将这个设置成一个可调用的函数,get_portinfo()。

void serial_port::get_portinfo() 
{
    serialList = QSerialPortInfo::availablePorts();//给链表赋值为获取到的当前设备的所有串口信息的链表

    if (serialList.size() == 0) 
    {
        ui.comboBox->addItem("none");//无可用端口显示none
    }
    else 
    {
        for (int i = serialList.size() - 1; i >= 0; i--)
        {
            ui.comboBox->addItem(serialList[i].portName());//将可用的串口端口号传入串口号对应的comboBox
        }
    }
};

在这里插入图片描述
但这有一个缺陷,我在
在这里插入图片描述
这个之后直接调用的get_portinfo,这样无法实现实时更新可用端口状态。这感觉很不方便。我想到的方法有,第一循环检查端口。第二,设定一个定时器,隔一定时间检查更新一下,这个感觉不错,可以尝试下。第三,如果端口可用信息的改变会发出某个信号,将信号与更新函数绑定即可,优先级最高的做法,不过存不存在这个信号还是未知数。

循环方案
放在serial_port里面循环不行,会将程序卡死在这里。
放在外部主函数那里也不行,因为qt进入事件循环,没有东西来触发这个,理解错了,不是进入主函数循环,而是事件循环,乌龙了。
这里还有一个问题就是ui.comboBox设置了Item之后重新设置会不会一直在增加,所以如果真进入循环会不会不断重复添加呢?为了避免这个情况,在每一次进入get_portinfo()函数时,清除掉comboBox的显示。
在这里插入图片描述

循环方案失败。

定时器方案
创建定时器

 QTimer* pTimer = new QTimer(this);

启动定时器

pTimer->start(100);  

关联信号

connect(pTimer, &QTimer::timeout,this,&serial_port::get_portinfo);

结果:
可以实时更新可用串口信息,但是由于100ms更新一次信息,导致我完全无法选中其中某一个端口,这也就真的只能看了。

从结果上看,实时显示成功,但并不能满足实际应用的要求,失败。

从上面的两次测试可以得出,我想要的功能是当可用串口信息发生改变时才调用get_portinfo()。

这要如何去实现呢?除了上述的第三种方案外,还可以在类主体设置一个变量,其保存着当前窗口的数目,当定时器状态连接到get_portinfo时先判断端口信息有没有改变,从而使得这个变化稳定下来。

做法:

connect(pTimer, &QTimer::timeout,this, [=]() {
        serialList = QSerialPortInfo::availablePorts();
        if (serialList.size() != num_of_port) 
        {
            num_of_port = serialList.size();
            get_portinfo();
        }
        });

将定时器的信号加上一个判断语句并实时更新num_of_port,便可实现上述功能。

这个时候又有一个问题出现在脑海中,每一次更新信息,当前选择的端口号会被我重置掉,所以一旦电脑的可用端口数目发生改变,那么我当前选择的串口号就会发生变化,虽然发送接受的端口可能因为我之后写的代码而不会出现错误,但是显示连接的端口号与我当前连接的端口号不一致的情况可能会发生。

所以我需要一个变量用于保存我当前选择的端口号,由这个变量控制我连接与显示的一致性。这个变量的变化只有初始化时的定义和点击comboBox选择能实现。并且每次显示时,其内容显示在最上层。
在这里插入代码片
在这里插入图片描述
还有一些小问题,不过还有comboBox的触发函数更新它,所以不需要担心。

在后面加上了这一句,.h文件中设置了这个属性。

至此,定时器触发方案算是完成了任务,成功。

信号触发方案

QSerialPortInfo类中没有signal,所以咋触发呢??????有大神看到了,有其他更好的解决办法的话请评论留言或者私信我,提前谢过了。

以上就是程序初始化阶段的串口号更新了,程序的鲁棒性肯定没有那么好,有待提升,暂时先这样喽,下一篇博文实现comboBox的选择性判断。

QT5上位机中进行串口通信,首先需要下载QT并安装。你可以选择从国内镜像网站下载,也可以从官方网站下载。这里提供一些参考链接,你可以根据自己的需求选择合适的下载方式。同时,QT中提供了QSerialPortInfo类来获取串口信息。你可以使用get_portinfo()函数来获取当前设备的所有串口信息,并将可用的串口端口号添加到相应的下拉菜单中。在代码中,你需要包含<QtSerialPort/QtSerialPort>头文件来访问串口功能以及获取系统中存在的串口信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [QT上位机串口通信工具实现之概述篇](https://blog.csdn.net/qq_43614246/article/details/123064123)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [VS + Qt实现上位机串口通信简单界面](https://blog.csdn.net/qq_43104187/article/details/107675293)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值