【问题标题】:Send data over serial port using QSerialPort使用 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。

标签: c++ qt serial-port


【解决方案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
猜你喜欢
  • 2017-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-13
  • 2013-08-16
相关资源
最近更新 更多