初学银河麒麟linux笔记 第七章 VMWare虚拟机内的qt程序连接串口和网口
QT程序可以正常在虚拟机里的麒麟系统里运行了,但是无法连接网口和串口,这里进行配置
网口连接
与硬件的TCP连接,在虚拟机上设置桥接
再重启就能连上了
串口连接
首先参考
https://blog.csdn.net/zxw1473474655/article/details/126102955
完成串口端口设置,但是QT程序里还是无法识别
这里下载cutecom工具进行测试
直接在终端输入
sudo apt-get install cutecom
进行下载
然后打开终端,用
sudo cutecom
命令来打开,打开界面如下。
在主机中配置了虚拟串口,并将其中一个串口配置给虚拟机,在尝试使用了ttyS0和ttyS1后,发现ttyS1可以接到主机串口助手发来的数据
然后开始调试QT程序
windows的串口是com1~com n
而linux的串口是tty*,因此搜索串口的程序需要改动
void XXXX::SerialPortInit()
{
QFile file(PORTFILENAME);
if(file.exists()) // 如果文件存在删除,或清空
{
file.remove();
} // 查看当前的串口,并保存到文件中
int ret = system("ls /dev/tty* > serialport.dat");
if(ret < 0)
{
QMessageBox::information(this, QString::fromUtf8("提示"), QString::fromUtf8("串口异常"));
} // 读取文件中的串口并添加到combobox中
if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
QMessageBox::information(this, QString::fromUtf8("提示"), QString::fromUtf8("串口异常"));
exit(0);
} // 读取当前的串口并添加到combobox中
while(!file.atEnd())
{
QByteArray line = file.readLine();
line.remove(0, 5);
ui->cmbPortName->addItem(QString::fromLocal8Bit(line).trimmed());
} file.close();
file.remove();
}
可以看到有很多串口都能使用,这里首先查看是否有ttyUSB前缀的串口,有的话直接打开连接。如果没有的话,这时需要在终端输入
dmesg | grep ttyS*
此时会显示
说明ttyS0和ttyS1可用,则可以选择对应的串口打开。
但麒麟系统的串口默认是ROOT权限,每次打开都需要终端手动开权限,因此这里采用
sudo usermod -a -G dialout $USER
改成普通用户都可使用,重启之后可正常使用串口。
程序优化
在权限更改完后,重新简化了串口选择程序,用QserialPort来筛选串口。
可参考
https://blog.csdn.net/weixin_42103688/article/details/121226704
将前面的程序替换为:
void XXXX::SerialPortInit() {
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
ui->cmbPortName->addItem(info.portName());
}
}
然后就可以只留下能使用的串口了
但是在使用过程中,发现用虚拟串口能正常发送、接收数据,用实际串口不行,猜测是波特率的原因。
程序里是通过QserialPort设置的波特率
my_serialport_read->clear();
my_serialport_read->setPortName(ui->cmbPortName->currentText());//当前串口 if(my_serialport_read->open(QIODevice::ReadWrite))//打开串口
{
//设置波特率
my_serialport_read->setBaudRate(ui->cmbBaudRate->currentText().toInt());
//设置数据位
my_serialport_read->setDataBits(QSerialPort::Data8);
//设置校验位
my_serialport_read->setParity(QSerialPort::NoParity)
//设置流控制
my_serialport_read->setFlowControl(QSerialPort::NoFlowControl);
//设置停止位
my_serialport_read->setStopBits(QSerialPort::OneStop);
}
程序能正常运行,但是设置的波特率却没有保留在串口上,经过终端查询
stty -a -F /dev/ttyS1
speed 也就是波特率没有被程序修改。这里查了不少资料也没发现是什么问题,由于时间紧迫,只好采取其他办法
通过下载以下LINUX下的QT串口助手源代码
https://codeload.github.com/wuhui2356/SerialPort/zip/refs/heads/master
发现其没有使用QserialPort,而是用的自带函数。但经验证可以修改linux串口的波特率。因此在串口打开函数中采用了这个方法修改波特率
QString serialPortStr = ui->cmbPortName->currentText().isEmpty() ? "" : ui->cmbPortName->currentText();
QString rateStr = ui->cmbBaudRate->currentText().isEmpty() ? "" : ui->cmbBaudRate->currentText();
QString checkBitStr ="NONE";
QString dataBirStr ="8";
QString stopBbitStr ="1"; if(serialPortStr == "")
{
QMessageBox::information(this, QString::fromUtf8("提示"), QString::fromUtf8("未找到串口"));
return;
}
if(!rateStr.isNull() && !checkBitStr.isNull() && !dataBirStr.isNull() && !stopBbitStr.isNull())
{
bool rateOK = false;
bool dataOK = false;
bool stopOK = false;
serialPortStr = "/dev/" + serialPortStr; //设置串口
seriport->initSet(serialPortStr.toStdString(), rateStr.toInt(&rateOK), dataBirStr.toInt(&dataOK), stopBbitStr.toInt(&stopOK), checkBitStr.toStdString()[0]); if(!rateOK || !dataOK || !stopOK) { QMessageBox::information(this, QString::fromUtf8("提示"), QString::fromUtf8("串口异常")); exit(0); } } else { QMessageBox::information(this, QString::fromUtf8("提示"), QString::fromUtf8("串口异常")); exit(0); } int ret = seriport->openSerialPort();//打开串口
if(!rateOK || !dataOK || !stopOK)
{
QMessageBox::information(this, QString::fromUtf8("提示"), QString::fromUtf8("串口异常"));
exit(0);
}
}
else
{
QMessageBox::information(this, QString::fromUtf8("提示"), QString::fromUtf8("串口异常"));
exit(0);
}
//打开串口
int ret = seriport->openSerialPort();
if(ret!=-1)
{
seriport->SetSpeed();//修改波特率
}
seriport->closeSerialPort();//关闭串口 my_serialport_read->clear();
my_serialport_read->setPortName(ui->cmbPortName->currentText());//当前串口 if(my_serialport_read->open(QIODevice::ReadWrite))//再打开串口
{
my_serialport_read->setBaudRate(ui->cmbBaudRate->currentText().toInt());
//my_serialport_read->setBaudRate(QSerialPort::Baud4800,QSerialPort::AllDirections);//设置波特率和读写方向 //设置数据位
my_serialport_read->setDataBits(QSerialPort::Data8);
//设置校验位
my_serialport_read->setParity(QSerialPort::NoParity);
//设置流控制
my_serialport_read->setFlowControl(QSerialPort::NoFlowControl);
//设置停止位
my_serialport_read->setStopBits(QSerialPort::OneStop);
}
这里调用了例程里的两个cpp文件,为了尽量减少改动,修改完波特率后关闭串口,后续还是采用用QserialPort调用串口。
经验证,可以与实际串口正常通信
//设置数据位
初学银河麒麟linux笔记 第七章 VMWare虚拟机内的qt程序连接串口和网口的更多相关文章
- Linux 笔记 - 第七章 Vi 和 Vim 编辑器
博客地址:http://www.moonxy.com 一.前言 Vi 与 Vim 都是多模式编辑器,是 Linux 中必不可少的工具.不同的是 Vim 是 Vi 的升级版本,它不仅兼容 Vi 的所有命 ...
- Android群英传笔记——第七章:Android动画机制和使用技巧
Android群英传笔记--第七章:Android动画机制和使用技巧 想来,最 近忙的不可开交,都把看书给冷落了,还有好几本没有看完呢,速度得加快了 今天看了第七章,Android动画效果一直是人家中 ...
- JVM学习笔记-第七章-虚拟机类加载机制
JVM学习笔记-第七章-虚拟机类加载机制 7.1 概述 Java虚拟机描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被 ...
- Linux(二):VMware虚拟机中Ubuntu安装详细过程
Linux(二):VMware虚拟机中Ubuntu安装详细过程 目录 1 准备 2 安装 2.1 虚拟机的建立 2.2 虚拟机安装Ubuntu系统 2.3 虚拟机设置 3 完成 1 准备 1.操作系统 ...
- Getting Started With Hazelcast 读书笔记(第七章)
第七章 部署策略 Hazelcast具有适应性,能根据不同的架构和应用进行特定的部署配置,每个应用可以根据具体情况选择最优的配置: 数据与应用紧密结合的模式(重点,of就是这种) 胖客户端模式(最好用 ...
- [Python学习笔记][第七章Python文件操作]
2016/1/30学习内容 第七章 Python文件操作 文本文件 文本文件存储的是常规字符串,通常每行以换行符'\n'结尾. 二进制文件 二进制文件把对象内容以字节串(bytes)进行存储,无法用笔 ...
- o'Reill的SVG精髓(第二版)学习笔记——第七章
第七章:路径 所有描述轮廓的数据都放在<path>元素的d属性中(d是data的缩写).路径数据包括单个字符的命令,比如M表示moveto,L表示lineto.接着是该命令的坐标信息. 7 ...
- 《图解HTTP》阅读笔记--第七章---确保WEB安全的HTTPS
第七章.确保WEB安全的HTTPSHTTP的缺点:通信使用明文(不加密),内容可能会被窃听 解决---加密处理: //将通信加密 :通过SSL(安全套接层)---HTTPS(超文本传输安全协议)--- ...
- Linux学习笔记(第七章)
目录相关操作 pwd -P 显示出实际工作目录,pwd 显示链接路径 mkdir -m 配置新建文件的权限 例:mkdir -m 711 testmkdir -p 建立多层目录,无需一层一层建立 rm ...
- Linux 笔记 - 第十一章 正则表达式
博客地址:http://www.moonxy.com 一.前言 正则表达式(英语为 Regular Expression,在代码中常简写为 regex.regexp 或 RE),是使用单个字符串来描述 ...
随机推荐
- SqlServer Express 自动备份数据库(没有sql代理服务的情况下)
一.由于Express版本的SQLServer没有SQL代理服务(SQLSERVERAGENT),所以就不能通过SQLServer作业来进行自动备份了,那么我们可以用Windows计划任务来定时处理 ...
- freeRTOS检测栈溢出
将FreeRTOSConfig.h里面的configCHECK_FOR_STACK_OVERFLOW设置为2. 随便一个文件里,加入 #include "task.h" void ...
- 数据对接:从Notion Database到低代码平台
前言 Notion简介 近几年,有一款叫Notion的产品异常火爆,它是集笔记.任务管理.Wiki.数据管理为一体的产品,他主打两个理念「模块化」和「All-in-one」,Notion最有魅力的还是 ...
- flutter系列之:在flutter中使用导航Navigator
目录 简介 flutter中的Navigator Navigator的使用 总结 简介 一个APP如果没有页面跳转那么是没有灵魂的,页面跳转的一个常用说法就是Navigator,flutter作为一个 ...
- 字符串(str)内置方法补充、列表(list)内置方法、可变类型与不可变类型、队列和栈
目录 一.字符串(str)的内置方法(补充) 了解方法 二.列表(list)的内置方法 三.可变类型与不可变类型 四.队列和栈 一.字符串(str)的内置方法(补充) # upper()把当前字符串中 ...
- Struts2文件配置介绍
Struts2文件配置介绍 struts2 structs.xml文件配置 标签 package标签 <?xml version="1.0" encoding="U ...
- chatGPT帮助开发实战解答问题和反思
问题来自.Net开发群友 问题 我想做一个自动生成单据号的功能,但是在EFCORE里没有行级锁,请有什么等价方案吗? ChatGPT回答 在 EF Core 中确实没有提供行级锁(row-level ...
- .Net 获取URL中指定参数值
有时候我们调用第三方接口,返回的并不是完整的链接带参数,而我们只需要获取指定的一些参数 例如:code=200&msg=success×tamp=1657539&no ...
- PostgreSQL的10进制与16进制互转
1.10进制转16进制Postgres里面有一个内置的10进制转16进制的函数:to_hex(int)/to_hex(bigint) [postgres@localhost ~]$ psql Pass ...
- Java中的static关键字作用及其应用
java中的static关键字主要用于内存管理.我们可以应用java static关键字在变量,方法,块和嵌套类中. static关键字属于类,而不是类的实例. static可以是: 1.变量 ...