解决qt串口通信数据发送成功但无法接收的问题

2023年7月8日 09:33 ry 1429

最近一直在弄qt的一个项目,遇到一个需求,就是需要实现发送一个串口实现控制灯光开关的需求,硬件方面搞好了,接收到字符串"a"表示关灯,接收到字符串"b"表示开灯,话不多说,直接用qt代码实现,代码如下所示

void MainWindow::send(QByteArray data)
{
    // 端口号,根据自己实际情况输入,可以在设备管理器查看
    QSerialPort serial;
    QString serialPortName = "COM2";
    qint32 baudRate = 115200;
    serial.setPortName(serialPortName);
    serial.setBaudRate(baudRate);
    serial.setDataBits(QSerialPort::Data8);
    serial.setParity(QSerialPort::NoParity);
    serial.setStopBits(QSerialPort::OneStop);
    serial.setFlowControl(QSerialPort::NoFlowControl);
    if (serial.open(QIODevice::ReadWrite))
    {
        qDebug() << "Serial port opened successfully.";
    }
    else
    {
        qDebug() << "Failed to open serial port!";
    }

    qint64 bytesWritten = serial.write(data);
    qDebug() << "Bytes written:" << bytesWritten;

    serial.close();


}

这里我封装好了send方法,为了方便测试,我们用VSPD软件来创建2个虚拟串口,看看能不能实现收发数据,如图所示

我们创建了2个虚拟串口COM1和COM2,我们可以到设备管理器中查看是否存在这2个串口,如图所示

可以看到我们用软件创建出来的串口,接下来我们来进行收发数据测试,这里为了方便我下载了一个XCOM串口通信调试助手软件来辅助,如图所示

这个软件主要来测试我们代码发送给他的数据,实质就是接收作用,或不多说,我们执行上面代码来验证,我们调用send方法,如下所示

然后运行代码,结果如下所示

发送成功,我们来看调试助手有没有接收到,如图所示

为什么会这样呢,同样的代码我们转成python代码再来测试下,代码如下所示

import serial #导入模块
def send(value):
    # 端口号,根据自己实际情况输入,可以在设备管理器查看
    port = "COM2"
    # 串口波特率,根据自己实际情况输入
    bps = 115200

    # 打开串口,并返回串口对象
    uart = serial.Serial(port, bps)

    # 串口发送一个字符串
    len = uart.write(f"{value}".encode('utf-8'))


    # 关闭串口
    uart.close()

send('b')

执行代码如图所示

显示接收成功了,为啥qt就不行呢,开始我纠结是版本的原因,我的版本是qt5.7,后面我又下载了5.14的结果还是一样,后面大佬的提醒发现发送数据后再加个代码

serial.flush();

或者

serial.waitForBytesWritten(100);

上面代码是强制要求发送完数据再关闭串口,就是用于等待所有输出数据完成发送。哈哈,这是一个坑哈,花了我好久时间。

如果上述代码帮助您很多,可以打赏下以减少服务器的开支吗,万分感谢!

欢迎发表评论~

点击此处登录后即可评论


评论列表
2023年11月17日 14:36 ry: 回复
本人承接各种软件定制,数据采集,接口搭建,网站开发,环境配置的杂活,需要的可以联系我 qq:1449917271 微信:liuyoudyping


赣ICP备2021001574号-1

赣公网安备 36092402000079号