Si vous envoyez manuellement les données, je vous recommande d'ajouter un délimiteur de début de trame et un délimiteur de fin de trame et une somme de contrôle de préférence. Il suffit de déclarer l'endroit où vous déclarez le numéro de série.
QByteArray packet_storage;
StartOfMessage and EndOfMessage
dépendra de votre appareil. Je ne sais pas ce que vous transmettez. J'espère que vous pouvez comprendre à partir de la documentation de votre appareil ce que vous envoyez.
comme pour moi, je suis en utilisant
enum Constants
{
StartOfMessage = '\x02', /* Value of byte that marks the start of a message */
EndOfMessage = '\x03', /* Value of byte that marks the end of a message */
CarridgeReturn = '\x0D', /* Carridge return is first byte of end of line */
LineFeed = '\x0A', /* Line feed is second byte of end of line */
NullChar = '\0' /* Null Character */
};
void MainWindow::readData()
{
// read all
QByteArray data = serial->readAll();
// store all read data packet_storage is a QByteArray
packet_storage.append(data);
int start_index = 0;
int end_index = 0;
// process packet if not empty
if(!packet_storage.isEmpty())
{
if(packet_storage.contains(StartOfMessage) && packet_storage.contains(EndOfMessage))
{
start_index = packet_storage.indexOf(StartOfMessage,0);
end_index = packet_storage.indexOf(EndOfMessage,0);
int length = 0;
for (int i=start_index; i <= end_index; i++)
{
length++;
}
// get data
QByteArray dt = packet_storage.mid(start_index,length);
// do your processing here.
// store in vector write to file etc.
processpacket(dt);
packet_storage.remove(start_index,dt.size());
}
}
}
Est-ce synchrone ou asynchrone? quel est le format de vos paquets? –
Est asynchrone et les paquets sont de type int. –
Qu'est-ce qui détermine le début et la fin de votre transmission? utilisez-vous une somme de contrôle? –