2016-11-20 2 views
0

J'utilise le SerialClass.h et Serial.cpp dans ce lien: http://playground.arduino.cc/Interfacing/CPPWindowsArduino et C de synchronisation de communication série

Mon main.cpp:

#include <stdio.h> 
#include <tchar.h> 
#include "SerialClass.h" // Library described above 
#include <string> 

// application reads from the specified serial port and reports the collected data 
int main(int argc, _TCHAR* argv[]) 
{ 

    printf("Welcome to the serial test app!\n\n"); 

    Serial* SP = new Serial("COM4"); // adjust as needed 

    if (SP->IsConnected()) 
     printf("We're connected\n"); 

    char incomingData[256] = "hello"; 
    int dataLength = 255; 
    int readResult = 0; 

    while(SP->IsConnected()) 
    { 
     readResult = SP->ReadData(incomingData,dataLength); 
     incomingData[readResult] = 0; 

     if(readResult != 0){ 
      printf("%s",incomingData); 
      printf("---> %d\n",readResult); 
     } 
     Sleep(500); 
    } 
    return 0; 
} 

Mon code arduino:

int mySize = 5; 
char incomingData[256] = "hello"; 

void setup(){ 
    Serial.begin(9600); // Seri haberleşmeyi kullanacağımızı bildirdik 
    pinMode(LedPin, OUTPUT); //LedPini çıkış olarak tanımlıyoruz. 
} 

void loop(){ 

    incomingData[mySize] = 't'; 
    ++mySize; 

    Serial.write(incomingData); 

    delay(500); 
} 

Arduino écrit un tableau de caractères et C++ le lit. Le problème est parfois cpp manque les données. Ma sortie:

output

Ma première question est ce que je peux faire pour cela? Comment faire la synchronisation entre Arduino et C++? C++ devrait attendre, jusqu'à Arduino pour terminer l'écriture. Je pense que je devrais utiliser un système de verrouillage ou quelque chose comme ça.

Et autre question. Je veux que mon programme Arduino et C++ communique constamment. Je veux faire que: "Arduino écrit" Après "C++ lit" après "C++ écrit" après "Arduino lit" après encore "Arduino écrit". Donc, je n'utilise pas le sommeil et le retard. Ma deuxième question est comment puis-je faire pour cette synchronisation? Je pense que la réponse est la même que la réponse à la première question.

Répondre

1

La classe C++ que vous utilisez n'implémente pas les propres tampons internes, elle repose sur le tampon matériel et le tampon du pilote du système d'exploitation. OS tampon pilote pourrait être augmentée (Gestionnaire de périphériques -> Ports -> Propriétés du pilote -> Paramètres du port)

enter image description here

Il y a retard Sleep(500) dans votre code de réception. Maintenant, imaginez que pendant un délai de 500 ms, les tampons de pilotes matériels et logiciels UART sont remplis. Mais votre code "dort" et n'a pas lu les données mises en mémoire tampon. Toute donnée reçue pendant cette période sera rejetée. Étant donné que Windows n'est pas un système d'exploitation en temps réel, votre processus Windows n'obtient pas suffisamment de temps (car il existe de nombreux autres processus) et, lors d'une telle inactivité, des données risquent d'être perdues. Alors, retirez le Sleep(500).

Pour garantir une communication fiable, la partie réceptrice doit mettre les données en mémoire tampon dès qu'elles détectent de nouvelles données (généralement dans un fil séparé, elles peuvent avoir une priorité plus élevée). La logique de traitement principale doit fonctionner avec ces données mises en mémoire tampon.

Aussi, vous mettrez en oeuvre une sorte de protocole, avec au moins 2 suivant:

  • format de message (démarrage, fin, taille, etc.)
  • intégrité des messages (données sont reçues sans corruption, pourrait être simple checksum)

De plus, une sorte de contrôle de transmission serait agréable (timeout, réponse/acquittement le cas échéant). UPD: dans le code Arduino Serial.write (incomingData);

assurez-vous que incomingData est correctement terminé par zéro. Et ajoutez le contrôle de borne supérieure pour mySize ...