2013-10-19 80 views
0

我需要在RS232端口(串行)上与指纹对话。我有一个Python代码,就像一个魅力:串行十六进制对话框(Python代码到C++/Qt 5.0)

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。

+0

什么是RS323?另外,不要使用QextSerialPort。它正在获得更新,但速度很慢,而且只有很小的一部分。我会建议使用我们写的qtserialport。 – lpapp

+0

感谢您的帮助,但我的问题更多地是在hexa和字符之间进行转换,以便在python脚本中重现对话框。 –

+0

错误:它不是RS323,但RS232 :) –

回答

0

很久以前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 *serialPort = new Serial(); 

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

感谢您的回答,我编辑了我的问题。 –

0

finaly使用此代码:

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(); 
+0

嗯,这是有点奇怪的代码没有适当的错误检查,但我很高兴,如果它适合你今天。 – lpapp

+0

是的,你是对的我的代码是非常丑陋的(没有错误检查,阻止等)......但它只是为了测试和是我的工作,所以,谢谢你的帮助和你的真棒lib: –

+0

伟大的,它也适用于Python吗?您的原始问题中有一些Python笔记。 – lpapp