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