使用 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 通过串口发送数据的主要内容,如果未能解决你的问题,请参考以下文章
Qt Widget 之简易串口助手(QSerialPort)