2016-07-26 4 views
0

Ich versuche, einen einfachen Integer-Wert von einem Arduino Mega 2560 in eine Qt-Anwendung zu schreiben. Baudrate ist auf 9600 eingestellt und Serial.read() funktioniert gut, wenn ich Daten über einen offenen Port mit serial->write(some_data); von Qt Application sende.Serial.print() schneidet Daten beim Lesen mit QSerialPort ab

digitalWrite(SS, LOW); 
if (Serial.available() == 2) { 
    response1 = SPI.transfer(Serial.read()); 
    response2 = SPI.transfer(Serial.read()); 
} 
digitalWrite(SS, HIGH); 

Der obige Code funktioniert gut. Ich las ein anderes vorher und musste delay(3) hinzufügen, um diese Arbeit zu machen. Jetzt möchte ich die Antwort zurücksenden

Serial.print((response2 << 8) | (response1 & 0xFF)); 

Aber es gibt immer abgeschnittene Ziffern. Ich weiß aus dem Logikanalysator, dass die Antwort z.B. 8193 so mit QByteArray b = serial->readAll(); Ich bekomme Ergebnisse wie 8, 81, 819, und manchmal 8193. Das heißt, immer werden die letzten Ziffern zufällig abgeschnitten. Ich nehme an, dass dies auch ein Timing-Problem ist, aber ich konnte keine Lösung dafür finden.

+0

readAll() gibt nur die Bytes zurück, die bisher empfangen wurden. Auf einem schnellen PC ist das normalerweise nur 1 oder 2 Bytes. Das Erhöhen der Baudrate ist keine Lösung, Sie erhalten mehr Bytes, aber genau wie viele sind niemals eine Garantie. Um dies zu erreichen, schicken Sie auch ein '\ n', so dass Sie readLine() in Ihrem Qt-Code verwenden können. Jetzt funktioniert es genauso wie in Ihrem Arduino und geht nie falsch. –

+0

Ich begann mit 'readLine()' im Qt-Code und 'Serial.println()' im Arduino-Code und erlebte das gleiche Verhalten. Ich werde überprüfen, ob ich nicht versehentlich etwas übersehen habe. – tobilocker

Antwort

0

Nur für den Fall, dass jemand mit dem gleichen Problem konfrontiert: Ändern der Baudrate von 9600 auf 112500 behoben.

Verwandte Themen