1

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 で hex に文字を送信します。

4

2 に答える 2

1

最終的にこのコードで作業します:

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();
于 2013-10-21T04:16:38.587 に答える
1

QextSerialPort はずっと前に更新がありませんでした。QSerialPortを使用します。

シリアル.h

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

}

シリアル.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";
            };
于 2013-10-20T00:12:38.280 に答える