2013-10-19 57 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