串行 Hexa 对话框(C++/Qt 5.0 的 python 代码)

Posted

技术标签:

【中文标题】串行 Hexa 对话框(C++/Qt 5.0 的 python 代码)【英文标题】:Serial Hexa dialog (python code to C++/Qt 5.0) 【发布时间】:2013-10-19 23:31:25 【问题描述】:

我需要与 RS232 端口(串行)上的指纹对话。我有一个像魅力一样工作的python代码:

import serial
import time

ser = serial.Serial('/dev/ttyUSB0', 9600, parity='N', timeout=2)
print ser
ser.open()

ser.write(chr(0x00)) # channel 1 byte (alway the same)
ser.write(chr(0x05)) # command 1 byte

ser.write(chr(0x00)) # param1 2 bytes (byte low)
ser.write(chr(0x00)) # param1 2 bytes (byte hight)

ser.write(chr(0x00)) # param2 2 bytes (byte low)
ser.write(chr(0x00)) # param2 2 bytes (byte hight)

ser.write(chr(0x00)) # lwExtraData 2 bytes (byte low)
ser.write(chr(0x00)) # lwExtraData 2 bytes (byte hight)

ser.write(chr(0x00)) # hwExtraData 2 bytes (byte low)
ser.write(chr(0x00)) # hwExtraData 2 bytes (byte hight)

ser.write(chr(0x00)) # ErrorCode 1 byte

sum = 0x05 % 256

ser.write(chr(sum)) # Checksum (modulo 256) 1 byte

print "\nRespuesta Secugen :\n"

cadena = ser.read(12)

for i in range(12):
    print(hex(ord(cadena[i]))),


ser.close()

但我需要将此代码转换为 C++/Qt。我不明白我需要使用什么功能。

我试过这个:

serial = new QextSerialPort(serialPort);

    serial->setBaudRate(BAUD9600);
    serial->setFlowControl(FLOW_OFF);
    serial->setParity(PAR_NONE);
    serial->setDataBits(DATA_8);
    serial->setStopBits(STOP_1);
    serial->setTimeout(2);

res = serial->open(QIODevice::ReadWrite);

    if(res)
    

        QByteArray zero = QByteArray::fromHex("\x00");

       serial->write(zero);

        [...]

      qDebug() << "byte a lire : " << serial->bytesAvailable();
      QByteArray test = serial->readAll();
    

如果可能,我想使用 QextSerialPort 扩展。我试过了 但没有成功。我想我不明白我需要做什么转换。

-- 编辑--

我的问题并不是关于管理串口的类,抱歉我的问题不是很清楚。我不知道重现与 python 相同的代码的解决方案是什么:在 RS232 中将字符发送到 hexa。

【问题讨论】:

什么是RS323?另外,不要使用 QextSerialPort。它正在获得更新,但非常缓慢,而且很小。我建议使用我们编写的 qtserialport。 感谢您的帮助,但我的问题更多是关于在 python 脚本中重现对话框的十六进制和字符之间的转换。 错误:不是 RS323 而是 RS232 :) 感谢您修复它。不过,我仍然为您推荐 QtSerialPort。使用 QextSerialPort imo 几乎没有意义。 :-) 【参考方案1】:

QextSerialPort 很久以前没有更新。 我用QSerialPort。

Serial.h

class Serial : public QSerialPort
void openPort(const QString &, const int &, const DataBits &, const  Parity &, const StopBits &, const FlowControl &);


Serial.cpp

void Serial::openPort(const QString &serialPort, const int &baudRate, const DataBits &dataBits, const Parity &parity, const StopBits &stopBits, const FlowControl &flowControl) 

            this->serialPort = serialPort;
            this->baudRate = baudRate;
            this->dataBits = dataBits;
            this->parity = parity;
            this->stopBits = stopBits;
            this->flowControl = flowControl;

            this->setPortName(this->serialPort);

            if (this->open(QIODevice::ReadWrite)) 
             else 
                qDebug() << "\n Can't open port | " << this->errorString();
            

             if (
                    this->setBaudRate(this->baudRate)
                    && this->setDataBits(this->dataBits)
                    && this->setParity(this->parity)
                    && this->setStopBits(this->stopBits)
                    && this->setFlowControl(this->flowControl)) 
                qDebug() << "\n[ info ]        Port settings successfully";
             else 
                qDebug() << "\n[ error ]        Port settings failed";
            


您可以在其他类中使用 Serial 类:

Serial *serialPort = new Serial();

 if (serialPort->write(data)) 
                qDebug() << "\n[ info ]        data: " << data.toHex() << "         | wrote";
             else 
                qDebug() << "\n[ error ]        error write data";
            ;

【讨论】:

【参考方案2】:

最终使用此代码:

QSerialPort serial;
serial.setPortName(serialPort);

qDebug() << "port : " + serialPort;

if (!serial.open(QIODevice::ReadWrite)) 
    qDebug() << "error open : ";


serial.setParity(QSerialPort::NoParity);
serial.setBaudRate(QSerialPort::Baud9600);
serial.setDataBits(QSerialPort::Data8);
serial.setFlowControl(QSerialPort::NoFlowControl);

QByteArray text2 = QByteArray::fromHex("5");
QByteArray text1 = QByteArray::fromHex("0");

serial.write(text1.constData(),1);
serial.write(text2.constData(),1);
serial.write(text1.constData(),1);
serial.write(text1.constData(),1);
serial.write(text1.constData(),1);
serial.write(text1.constData(),1);
serial.write(text1.constData(),1);
serial.write(text1.constData(),1);
serial.write(text1.constData(),1);
serial.write(text1.constData(),1);
serial.write(text1.constData(),1);
serial.write(text2.constData(),1);

if (serial.waitForBytesWritten(1000)) 

    if(serial.waitForReadyRead(1000))
    
        QByteArray requestData = serial.readAll();
        qDebug() << "byte readed : " <<  requestData.size();

        qDebug() << QString::number(requestData[0], 16);
        qDebug() << QString::number(requestData[1], 16);
        qDebug() << QString::number(requestData[2], 16);
        qDebug() << QString::number(requestData[3], 16);
        qDebug() << QString::number(requestData[4], 16);
        qDebug() << QString::number(requestData[5], 16);
    


serial.close();

【讨论】:

嗯,这是一个没有适当错误检查的奇怪代码,但如果它今天对你有用,我很高兴。 是的,你是对的,我的代码非常丑陋(没有错误检查、阻塞等)......但这只是为了测试,是的,对我有用,所以,谢谢你的帮助和你的很棒的库:) 太好了,那么它也适用于 python 吗?您原来的问题中有一些 python 注释。 是的,这个答案中的代码完全模仿了 python 脚本,两者都按预期工作

以上是关于串行 Hexa 对话框(C++/Qt 5.0 的 python 代码)的主要内容,如果未能解决你的问题,请参考以下文章

编译Qt5.0连接MySql5.5数据库的驱动(5.0版本的编译,我记得5.2开始自带了)

QT 5.0, 代码中qt error C2001: 常量中有换行符, 怎么解决?

在 C 程序中使用 Qt 库

在第二个屏幕上显示对话框/帧全屏唱 QT/c++

QT串口不工作

时序问题:QT 写入串行端口,然后读取