&twelve 2024-10-08 11:06 采纳率: 0%
浏览 22
已结题

Qt Modbus 上位机无法通过 CH340 连接问题

1.遇到问题描述

使用QT开发Modbus上位机,用去读取及设置设备信息,两个蓝牙作为透传设备,电脑端使用USB转TTL(CH340)连接蓝牙HC05作主机,设备端使用四芯音频口连接HC05作从机,现在两个HC05已经调通,能够正常收发数据。
但是主机方面无法通过QT上位机的QModbusDevice类建立与USB转TTL的连接。其可以打开CP210x驱动的设备,但无法打开CH340驱动设备。若改为QSerialPort类则可以建立上位机与USB转TTL连接,但可能不太方便进行Modbus通讯。
请问现在应该如何处理?

2.问题相关代码&错误信息

QModbusDevice建立连接代码如下,手动写死可以正常使用CP210x驱动建立连接,但是无法使用CH340建立连接。使用该代码连接CH340驱动的设备,返回错误信息为: "系统找不到指定的文件。"

QString ComName=ui->comboBoxPort->currentText();
    QString Baud=ui->comboBoxBaud->currentText();
    QString DataBit=ui->comboBoxData->currentText();
    QString StopBit=ui->comboBoxStop->currentText();
    QString VerifyBit=ui->comboBoxVerify->currentText();

    //自动获取
    //Modbus 串口信息
    modbusDevice.setConnectionParameter(QModbusDevice::SerialPortNameParameter, ComName);
    modbusDevice.setConnectionParameter(QModbusDevice::SerialBaudRateParameter, Baud);
    modbusDevice.setConnectionParameter(QModbusDevice::SerialDataBitsParameter, DataBit);
    modbusDevice.setConnectionParameter(QModbusDevice::SerialStopBitsParameter, StopBit);
    modbusDevice.setConnectionParameter(QModbusDevice::SerialParityParameter, VerifyBit);

    //手动写死 可以打开CP210x驱动 
//    modbusDevice.setConnectionParameter(QModbusDevice::SerialPortNameParameter, QStringLiteral("COM1"));    //串口名:COM5
//    modbusDevice.setConnectionParameter(QModbusDevice::SerialBaudRateParameter, QSerialPort::Baud9600);     //波特率:9600
//    modbusDevice.setConnectionParameter(QModbusDevice::SerialDataBitsParameter, QSerialPort::Data8);        //数据位:8//    modbusDevice.setConnectionParameter(QModbusDevice::SerialStopBitsParameter, QSerialPort::OneStop);      //停止位:1//    modbusDevice.setConnectionParameter(QModbusDevice::SerialParityParameter, QSerialPort::NoParity);       //校验位:无校验

    //连接串口失败 并返回信息
    if (!modbusDevice.connectDevice())
    {
        //错误信息
        ui->plainTextEdit_3->insertPlainText("串口连接失败!\n");
        qDebug()<<"错误原因:"<<modbusDevice.errorString();  
        //连接CH340设备时返回:错误原因: "系统找不到指定的文件。"
        return;
    }

QSerialPort建立连接代码如下,其可以正常连接CH340驱动的设备,但可能不太方便进行Modbus通讯

QSerialPort::BaudRate baudrate_arr[] = {QSerialPort::Baud2400,QSerialPort::Baud4800,QSerialPort::Baud9600,QSerialPort::Baud19200,QSerialPort::Baud38400,QSerialPort::Baud57600,QSerialPort::Baud115200};
    QSerialPort::DataBits databits_arr[] = {QSerialPort::Data5,QSerialPort::Data6,QSerialPort::Data7,QSerialPort::Data8};
    QSerialPort::StopBits stopbits_arr[] = {QSerialPort::OneStop,QSerialPort::OneAndHalfStop,QSerialPort::TwoStop};
    QSerialPort::Parity   parity_arr[]   = {QSerialPort::NoParity,QSerialPort::EvenParity,QSerialPort::OddParity};
    QSerialPort::BaudRate baudrate;
    QSerialPort::DataBits databits;
    QSerialPort::StopBits stopbits;
    QSerialPort::Parity   parity;
    QString PortName1;

    baudrate = baudrate_arr[ui->comboBoxBaud->currentIndex()];        //获取窗口串口波特率
    databits = databits_arr[ui->comboBoxData->currentIndex()];        //获取数据位
    stopbits = stopbits_arr[ui->comboBoxStop->currentIndex()];        //获取停止位
    parity   = parity_arr[ui->comboBoxVerify->currentIndex()];        //获取奇偶校验位
    qDebug()<<"串口连接端口:"<<ui->comboBoxPort->currentText()<<endl;
    qDebug()<<"串口连接信息:"<<baudrate<<"-"<<databits<<"-"<<stopbits<<"-"<<parity<<endl;

    //自动获取 通过
    serialPort->setPortName(ui->comboBoxPort->currentText());         //获取串口号
    serialPort->setBaudRate(baudrate);                                //获取波特率
    serialPort->setDataBits(databits);                                //设置数据位
    serialPort->setStopBits(stopbits);                                //设置停止位
    serialPort->setParity(parity);                                    //设置奇偶校验位
    serialPort->setFlowControl(QSerialPort::NoFlowControl);           //直接设置为无流控制

3.系统信息&软件版本

Windows11
Qt 5.14.2 MSVC2017 64bit

  • 写回答

1条回答 默认 最新

  • 檀越@新空间 2024-10-08 11:08
    关注

    上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    对于第一个问题,你需要检查以下几点:

    1. 蓝牙是否被正确配置和连接到USB接口。
    2. Modbus通信参数(如波特率、数据位、停止位等)是否设置正确。

    对于第二个问题,你需要解决以下点:

    1. 如果使用的MQTT库中没有正确的SerialPort实现,那么需要添加相应的实现来完成串口通信。
    2. 对于CH340驱动,你需要检查是否有足够的权限来访问和操作设备。

    以下是一个简化的例子,展示了如何使用SerialPort来连接和调试一个成功的Modbus通道:

    #include <QSerialPort>
    #include <QModbusDevice>
    
    int main(int argc, char *argv[])
    {
        QSerialPort serialPort(2, 9600);
        QSerialPortDriver driver(serialPort);
    
        // 建立串口连接
        if (driver.connectDevice()) {
            SerialPort::DataBits dataBits = SerialPort::Data8;
            SerialPort::StopBits stopBits = SerialPort::OneStop;
            SerialPort::Parity parity = SerialPort::EvenParity;
            int baudRate = serialPort.baudRate();
            string commName = "COM1";
            string macAddress = "AA:BB:CC:DD:E6:F7:89";
            string portName = commName + ":" + macAddress + ":" + baudRate;
            String paramStrs = [portName, baudRate, dataBits, stopBits, parity]{"port_name", baudRate, dataBits, stopBits, parity};
    
            std::cout << "Starting Modbus Communication..." << std::endl;
            int result = driver.begin(paramStrs);
            if (result == 0)
                std::cout << "Modbus Communication success!" << std::endl;
            else
                std::cout << "Modbus Communication failed." << std::endl;
        } else {
            std::cout << "Error connecting to serial port!" << std::endl;
        }
    
        return 0;
    }
    

    请注意,这只是一个基础示例,并且可能不适用于所有情况。你应该根据实际的需求和条件来进行调整。

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月8日
  • 创建了问题 10月8日