我想在串行设备上写入。不幸的是,我感觉 QSerialPort 在 linux 下没有正确实现。与其他方法 (python) 相比,我得到 !sometimes! 当我尝试调用时程序挂起:
serial.open(QIODevice::ReadWrite)
Run Code Online (Sandbox Code Playgroud)
我正在使用http://qt-project.org/wiki/QtSerialPort 中的示例(见下文)。QSerialPortInfo 工作正常,因此我可以在打开它之前搜索我的设备。该问题出现在所有 Qt 5.* 系列中。我目前正在使用 OpenSuse 存储库中的 5.3 测试版。其他工具或方法证明设备正在工作(Windows 或 Python)。
// Example use QSerialPortInfo
foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
qDebug() << "Name : " << info.portName();
qDebug() << "Description : " << info.description();
qDebug() << "Manufacturer: " << info.manufacturer();
// Example use QSerialPort
QSerialPort serial;
serial.setPort(info);
if (serial.open(QIODevice::ReadWrite)) // Hang of the program
serial.close();
}
Run Code Online (Sandbox Code Playgroud)
工作python脚本:
com_port = 4
baud_rate = '9600'
pySerial = serial.Serial(com_port, …
Run Code Online (Sandbox Code Playgroud) 这是我在这个网站上的第一个问题!
我在从COM端口读取数据时遇到一些麻烦,我从另一个COM端口发送完整的消息,当我用Qt接收它时,它总是被切成多个子消息.
void SerialPortReader::init()
{
connect(m_serialPort, SIGNAL(readyRead()), this, SLOT(readData()));
}
void SerialPortReader::readData()
{
// m_serialPort->waitForReadyRead(200);
QByteArray byteArray = m_serialPort->readAll();
qDebug() << byteArray;
if(byteArray.startsWith(SOF) && byteArray.endsWith(EOF_LS)
&& byteArray.size() >= MIN_SIZE_DATA) {
decodeData(byteArray.constData());
} else {
qDebug() << "LIB SWCom : Unvalid trame !";
}
}
Run Code Online (Sandbox Code Playgroud)
发送的消息长度为25或27字节,如果我使用Putty或Hyperterminal来读取它们,我没有遇到麻烦.此外,如果我使用2个模拟串口COM进行通信,我没有这个问题...它只发生在Qt读取系统和2个物理COM端口...
我认为在准确发出readyRead信号时我没有得到...
我很困惑,提前谢谢你的帮助!
我正在尝试读取通过USB通过设备插头发送的数据。首先我通过此命令读取数据
数据是这样的
TGPHI_s -0,24 =
MESURES2 BT 4 SUP36 A
PTCOUR2 HPH /
Run Code Online (Sandbox Code Playgroud)
现在我想通过Qt5.3程序读取数据
QSerialPort serial;
serial.setPortName("ttyUSB0");
if(!serial.setBaudRate(QSerialPort::Baud1200 , QSerialPort::Input))
qDebug() << serial.errorString();
if(!serial.setDataBits(QSerialPort::Data7))
qDebug() << serial.errorString();
if(!serial.setParity(QSerialPort::EvenParity))
qDebug() << serial.errorString();
if(!serial.setFlowControl(QSerialPort::HardwareControl))
qDebug() << serial.errorString();
if(!serial.setStopBits(QSerialPort::OneStop))
qDebug() << serial.errorString();
if(!serial.open(QIODevice::ReadOnly))
qDebug() << serial.errorString();
qDebug() << serial.bytesAvailable();
while(true)
{
if (serial.isOpen()) {
qDebug() << "Serial port is open...";
QByteArray datas = serial.readAll();
if (datas.size() == …
Run Code Online (Sandbox Code Playgroud) 我是 Qt 的新手,需要准备一个项目来从 rs232 发送十六进制命令。QString 行包含 64 位二进制数据,我必须将其转换为十六进制并通过 rs232 发送。
QString a=ui->comboBox->currentText();
QString s1;
s1="./calc "+a;
QProcess p1;
p1.start(s1);
p1.waitForFinished(-1);
QString line ;
//read
QFile file("TeleOutput.txt");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return;
QTextStream in (&file);
line = in.readAll();
ui->plainTextEdit->setPlainText(line);
Run Code Online (Sandbox Code Playgroud)
那么,如何将 QString 行中的 64 位二进制数据转换为十六进制值并通过 rs232 传输呢?
我试图使用新的信号和插槽语法,但我在连接函数时遇到编译错误.在这种情况下如何使用新语法?
// Qt 5.4.1, Apple LLVM version 6.1.0 and qmake 3.0
private slots:
void onError(QSerialPort::SerialPortError code);
private:
QSerialPort *m_port;
Link::Link(QObject *parent) : QObject(parent) {
m_port = new QSerialPort(parent);
connect(m_port, &QSerialPort::error, this, &Link::onError);
}
Run Code Online (Sandbox Code Playgroud)
完整的错误消息:
error: no matching member function for call to 'connect'
connect(m_port, &QSerialPort::error, this, &Link::onError);
^~~~~~~
candidate function not viable: no overload of 'error' matching 'const char *' for 2nd argument
static QMetaObject::Connection connect(const QObject *sender, const char *signal,
^
Run Code Online (Sandbox Code Playgroud)