使用 QSerialPort 通过串口发送数据

Posted

技术标签:

【中文标题】使用 QSerialPort 通过串口发送数据【英文标题】:Send data over serial port using QSerialPort 【发布时间】:2016-09-01 09:27:38 【问题描述】:

我想使用串行端口与硬件设备通信。根据文档,消息如下所示:

我想使用QSerialPort 进行交流。这是我正在尝试的:

QByteArray bytes;
bytes.append(( char) 0x6E);
bytes.append(( char) 0x00);
bytes.append(( char) 0x00);
bytes.append(( char) 0x0B);
bytes.append(( char) 0x00);
bytes.append(( char) 0x00);
bytes.append(( char) 0x2F);
bytes.append(( char) 0x4A);
bytes.append(( char) 0x00);
bytes.append(( char) 0x00);
bytes.append(( char) 0x00);

int transmitted = qSerialPort->write(bytes); //returns no error, transmitted = 11

QSerialPort 是这样配置的:

qSerialPort = new QSerialPort(path);
qSerialPort->setBaudRate(QSerialPort::Baud9600);
qSerialPort->setDataBits(QSerialPort::Data8);
qSerialPort->setParity(QSerialPort::NoParity);
qSerialPort->setStopBits(QSerialPort::OneStop);
qSerialPort->setFlowControl(QSerialPort::NoFlowControl);
qSerialPort->open(QIODevice::ReadWrite);

我没有从硬件设备得到正确的响应。使用QSerialPort 将十六进制值发送到串行端口有什么我忽略的吗?谢谢。

【问题讨论】:

是的。您忽略了发布完整的测试用例。也就是说,您的问题中没有任何内容可以告诉我们您正确读取了设备中的数据。 旁注:可以将数据包写成字符串:const char data[] = "\x6E\x00\x00...\x00"; transmitted = qSerialPort->write(data, sizeof(data)-1); 您的数据包内容可能有误。您将“\x00”作为数据部分,但您没有为该部分计算正确的 CRC。请参阅您应该使用哪种 CRC 的协议文档,然后在发送数据包之前计算 CRC。 【参考方案1】:

您应该在“设置”操作之前打开端口。例如,在 baudRate 的 Qt 文档中:

注意:如果设置是在打开端口之前设置的,实际串口 端口设置在 QSerialPort::open() 方法中自动完成 紧接着就是开港成功了。

代码示例:

QList<QSerialPortInfo> portsInfo = QSerialPortInfo::availablePorts();
foreach(const QSerialPortInfo& portInfo, portsInfo)
    if (portInfo.portName().trimmed().toUpper() != /*your port name*/)
        continue;
    _port = new QSerialPort(portInfo, this);
    if (!_port->open(QIODevice::ReadWrite))
        QSerialPort::SerialPortError error = _port->error();
        delete _port;
        _port = nullptr;
    
    if (!_port->setBaudRate(/*your baudRate*/, /*your direction)*/)
        QSerialPort::SerialPortError error = _port->error();
        _port->close();
        delete _port;
        _port = nullptr;
        return;
    
    if (!_port->setParity(/*your parity*/))
        QSerialPort::SerialPortError error = _port->error();
        _port->close();
        delete _port;
        _port = nullptr;
        return;
    
    if (!_port->setDataBits(/*your dataBits*/))
        QSerialPort::SerialPortError error = _port->error();
        _port->close();
        delete _port;
        _port = nullptr;
        return;
    
    if (!_port->setStopBits(/*your stopBits */))
        QSerialPort::SerialPortError error = _port->error();
        _port->close();
        delete _port;
        _port = nullptr;
        return;
    
    if (!_port->setFlowControl(/* your flowControl*/))
        QSerialPort::SerialPortError error = _port->error();
        _port->close();
        delete _port;
        _port = nullptr;
        return;
    

【讨论】:

感谢您的提示。不幸的是,先打开端口没有效果。 您是否尝试更改您的硬件设备?或者也许使用 rs232 发送器作为测试设备。像这样:sourceforge.net/projects/rs232msgsender

以上是关于使用 QSerialPort 通过串口发送数据的主要内容,如果未能解决你的问题,请参考以下文章

从另一个线程向 QSerialPort 发送数据

Qt串口通信开发之QSerialPort模块

Qt Widget 之简易串口助手(QSerialPort)

Qt Widget 之简易串口助手(QSerialPort)

QT5串口编程

QSerialPort 手动 RTS 开/关未与调用同步