2016-09-01 4 views
0

Ich möchte über die serielle Schnittstelle mit einem Hardwaregerät kommunizieren. Entsprechend der Dokumentation sieht eine Nachricht so aus: enter image description hereSenden von Daten über die serielle Schnittstelle mit QSerialPort

Ich möchte QSerialPort für die Kommunikation verwenden. Hier ist, was ich versuche:

QByteArray bytes; 
bytes.append((char) 0x6E); 
bytes.append((char) 0x00); 
bytes.append((char) 0x00); 
bytes.append((char) 0x0B); 
bytes.append((char) 0x00); 
bytes.append((char) 0x00); 
bytes.append((char) 0x2F); 
bytes.append((char) 0x4A); 
bytes.append((char) 0x00); 
bytes.append((char) 0x00); 
bytes.append((char) 0x00); 

int transmitted = qSerialPort->write(bytes); //returns no error, transmitted = 11 

QSerialPort ist konfiguriert wie folgt aus:

qSerialPort = new QSerialPort(path); 
qSerialPort->setBaudRate(QSerialPort::Baud9600); 
qSerialPort->setDataBits(QSerialPort::Data8); 
qSerialPort->setParity(QSerialPort::NoParity); 
qSerialPort->setStopBits(QSerialPort::OneStop); 
qSerialPort->setFlowControl(QSerialPort::NoFlowControl); 
qSerialPort->open(QIODevice::ReadWrite); 

Ich habe keine richtige Antwort aus der HW-Gerät. Gibt es etwas, das ich übersehen habe, um Hex-Werte über QSerialPort an eine serielle Schnittstelle zu senden? Vielen Dank.

+0

Ja. Sie haben übersehen, einen vollständigen Testfall zu veröffentlichen. Es gibt nämlich nichts in Ihrer Frage, das uns sagt, dass Sie die Daten vom Gerät richtig gelesen haben. –

+0

Randnotiz: Sie können das Paket als String schreiben: 'const char data [] =" \ x6E \ x00 \ x00 ... \ x00 "; gesendet = qSerialPort-> schreiben (Daten, Größe von (Daten) -1); ' –

+0

Der Inhalt Ihres Pakets ist wahrscheinlich falsch. Sie haben "\ x00" als Datenabschnitt eingegeben, aber Sie haben nicht den richtigen CRC für diesen Abschnitt berechnet. Sehen Sie in der Protokolldokumentation nach, welche CRC Sie verwenden sollen, und berechnen Sie dann den CRC, bevor Sie das Paket senden. –

Antwort

0

Sie sollten den Port vor "set" -Operationen öffnen. Zum Beispiel in Qt documantation für baudRate:

Hinweis: Wenn die Einstellung vor dem Öffnen des Port gesetzt ist, wird die tatsächliche serielle Port-Einstellung automatisch im QSerialPort :: open() -Methode gleich danach das getan Öffnen des Ports ist erfolgreich.

Code-Beispiel:

QList<QSerialPortInfo> portsInfo = QSerialPortInfo::availablePorts(); 
foreach(const QSerialPortInfo& portInfo, portsInfo){ 
    if (portInfo.portName().trimmed().toUpper() != /*your port name*/) 
     continue; 
    _port = new QSerialPort(portInfo, this); 
    if (!_port->open(QIODevice::ReadWrite)){ 
     QSerialPort::SerialPortError error = _port->error(); 
     delete _port; 
     _port = nullptr; 
    } 
    if (!_port->setBaudRate(/*your baudRate*/, /*your direction)*/){ 
     QSerialPort::SerialPortError error = _port->error(); 
     _port->close(); 
     delete _port; 
     _port = nullptr; 
     return; 
    } 
    if (!_port->setParity(/*your parity*/)){ 
     QSerialPort::SerialPortError error = _port->error(); 
     _port->close(); 
     delete _port; 
     _port = nullptr; 
     return; 
    } 
    if (!_port->setDataBits(/*your dataBits*/)){ 
     QSerialPort::SerialPortError error = _port->error(); 
     _port->close(); 
     delete _port; 
     _port = nullptr; 
     return; 
    } 
    if (!_port->setStopBits(/*your stopBits */)){ 
     QSerialPort::SerialPortError error = _port->error(); 
     _port->close(); 
     delete _port; 
     _port = nullptr; 
     return; 
    } 
    if (!_port->setFlowControl(/* your flowControl*/)){ 
     QSerialPort::SerialPortError error = _port->error(); 
     _port->close(); 
     delete _port; 
     _port = nullptr; 
     return; 
    } 
} 
+0

Danke für den Tipp. Leider hatte das Öffnen des Ports zunächst keinen Effekt. – Androidicus

+0

Haben Sie versucht, Ihr HW-Gerät zu ändern? Oder vielleicht RS232-Sender für Testgerät verwenden. So etwas wie folgt: https://sourceforge.net/projects/rs232msgsender/ –

Verwandte Themen