Communication Série Arduino - Visual Studio "PROJET"

Bonjour, je vous solicite car je débute dans la programmation, language C++ et j'aurais aimé avoir un petit peu d'aide de votre part pour mener à bien mon projet de fin d'année.

Je dois concevoir un genre de Question Pour Un Champion, ce qui signifie récupérer plusieurs signaux venant des LEDS et des Boutons.
Je ne sais pas comment m'y prendre pour effectuer une communication série entre ma carte Arduino Uno et un programme C++ sous Visual Studio pour ensuite récupérer les changements d'états.

Avez vous une petite idée?

Je vous remercie.

Bonjour,

Avec ou sans la librairie .net ?
Avec : SerialPort Classe (System.IO.Ports) | Microsoft Learn
Sans : Serial Communication in Windows - CodeProject

Bonjour,

Avec la librairie .Net.
J'ai regarder plusieurs Tuto, exemples sur le net mais à chaque fois c'est pour de la saisie de caractère, alors que moi c'est avec une impulsion sur un bouton poussoir.

Bah oui : si appuie sur le bouton, alors envoi d'un certain caractère ou d'une chaine de caractère ou d'un nombre.

Un appui sur un bouton côté arduino ou côté ordinateur ?

Oui effectivement, la traduction du signal envoyé par le Bouton en caractère [côté Arduino], et ensuite traiter le caractère côté Projet Visual et renvoyé un caractère de réponse à la carte qui elle traitera à nouveau le signal pour allumer la LED ou non.

Il faut que j'utilise la librairie SerialDumper, en réutilisant l'exemple "CmdMessengerExample.pde"?

Pour quelque chose d'aussi simple je vois pas l'utilité d'une librairie :

Arduino : Si appui sur un bouton => émission d'un caractère puis attente du caractère de réponse
PC : si caractère reçu sur le port série => caractère OK ? => Envoi du caractère de réponse
Arduino : caractère de réponse OK => allumage LED

Je suis d'accord sur ta Logique B@tto, mais pour quelqu'un qui débute, l'appliquer sous forme d'un Code Foncionnel ce n'est pas facile, surtout quand tu as du mal avec l'environnement de développement.

En plus l'IDE Arduino ne fonctionne plus ... Certaine la cause du à Java 7u15.

Je vois très bien ce qu'il faut faire, mais je n'arrive pas à l'exprimer sous forme de Code, avez vous une piste? ...

Il n'y a qu'à manipuler le port série :

  • Côté Arduino : Serial.print() pour envoyer et Serial.read() pour recevoir.
  • Côté PC : se servir de l'évènement DataReceived pour déclencher une lecture du port serie avec la méthode ReadChar (si on part du principe que tu envois un caractère depuis l'Arduino) et utiliser la méthode Write pour renvoyer un caractère en réponse. Si ça peut t'aider, un projet que j'avais fait sous VB.NET : http://arduino.cc/forum/index.php/topic,136009.0.html

La syntaxe n'est pas exactement la même mais comme ça utilise .NET donc les méthodes sont les mêmes.

Voici ce que j'ai fais du coté Arduino pour le moment.
Normalement le traitement est bon.

Mais coté Pc, je ne vois pas trop comment se Servir, ou du moins comment développer la Comm Série avec DataReceiver et ReadChar pour lire le caractère envoyé par l'Arduino.
Faut-il que je fasse une interface comme B@tto à fais dans son Projet Publier dans un Post précedent.

Merci pour votre aide.

Traitement_Signaux_Arduino.ino (4.22 KB)

Pour un tel besoin moi j'utiliserais ça:

Aucun code nécessaire côté Arduino (juste upload du sketch Firmata standard fourni avec l'IDE Arduino).

Mais bon si le but c'est d'apprendre à développer côté Arduino c'est pas vraiment la solution.
En tout cas je bénis tous les jours l'auteur de Firmata tellement ça m'a aidé à résoudre mes problèmes d'entrée/sortie sur mon projet actuel :grin:

Merci d'avoir répondu patg_, mais je ne sais pas si le sketch firmata standart m'aidera.

Car pour ce qu'il est du Sketch Arduino, je les déjà fais.
En pièce jointe post précédent.

Mon soucis est que je n'arrive pas à récupérer le caractère coté PC envoyé par l'Arduino.
Et l'Arduino envoie en permanence des caractère alors que j'ai besoin qu'il envoie un seul caractère.

Bonjour.

Côté Arduino, tu peux puiser des idées dans mon appli qui fait dialoguer Arduino avec Visual Basic :

http://arduino.cc/forum/index.php/topic,134797.0.html

Bonjour Micol, Merci pour ta réponse. Mais mon problème actuel, est que je n'arrive pas à traiter le caractère du côté Pc.

Car j'arrive bien à l'envoyer depuis l'Arduino, en ayant quand même un problème, c'est que sa m'envoie des caractère à la chaine, alors que j'aimerais simplement en envoyé un.

Voila ce que j'ai fais du coté arduino :

// Poste BOUTON/LED Utilisateur 1

const int BP1 = 2;

const int LED1 = 8;



// Poste BOUTON/LED Utilisateur 2

const int BP2 = 3;

const int LED2 = 9;


// Poste BOUTON/LED Utilisateur 3

const int BP3 = 4;

const int LED3 = 10;


// Poste BOUTON/LED Utilisateur 4

const int BP4 = 5;

const int LED4 = 11;


// Poste ANIMATEUR (Bouton 1 et 2)

const int BP5 = 6;  //Validation

const int BP6 = 7;  // RAZ

// 

Etat des contacts lors de l'appuie puis l'etat précédent avant le nouvelle appuie

int etatBP1 = 0;

int MemBP1 = 0;


int etatBP2 = 0;

int MemBP2 = 0;


int etatBP3 = 0;

int MemBP3 = 0;


int etatBP4 = 0;

int MemBP4 = 0;


int etatBP5 = 0;

int MemBP5 = 0;


int etatBP6 = 0;

int MemBP6 = 0;


int MIPC = 0;




void setup() {

Serial.begin(115200);


// Déclaration de l'état des contacts
  
pinMode(LED1, OUTPUT);
  
pinMode(BP1, INPUT);
  
  
pinMode(LED2, OUTPUT);
  
pinMode(BP2, INPUT);
  
  
pinMode(LED3, OUTPUT);
  
pinMode(BP3, INPUT);
  
  
pinMode(LED4, OUTPUT);
  
pinMode(BP4, INPUT);
  
  
pinMode(BP5, INPUT);
  
pinMode(BP6, INPUT);

}



void CondInitial()
{
//Initialisation des variables
  
etatBP1 = 0;
  
etatBP2 = 0;
  
etatBP3 = 0;
  
etatBP4 = 0;
  
etatBP5 = 0;
  
etatBP6 = 0;
  
digitalWrite(LED1, LOW);
  
digitalWrite(LED2, LOW);  

digitalWrite(LED3, LOW);
  
digitalWrite(LED4, LOW);
  
MemBP1 = 0;
  
MemBP2 = 0;
  
MemBP3 = 0;
  
MemBP4 = 0;
  

}



void loop(){
  
    
CondInitial();  //Appel de la fonction d'initialisation  
    
    
etatBP1 = digitalRead(BP1);  //Recuperer le changement d'état du bouton.
    
etatBP2 = digitalRead(BP2);
    
etatBP3 = digitalRead(BP3);    
    
etatBP4 = digitalRead(BP4);
    
etatBP5 = digitalRead(BP5);
    
etatBP6 = digitalRead(BP6); 


if(etatBP1 == HIGH && MemBP1 == 0 && MIPC == 0){      
//Traitement du signal lorsque qu'on sur BP1
      
MemBP1 = 1;  //Mise à 1 de sa mémoire et on force les autres mémoire à 0;
      
MemBP2 = 0;
      
MemBP3 = 0;
      
MemBP4 = 0;
    
MIPC = 1;
      
digitalWrite(LED1, HIGH);//On allume la LED 
           
      

	if(etatBP5 == HIGH && MemBP1 == 1 && MIPC == 1){    //Traitement du signal si réponse juste. Valider
       
	digitalWrite(LED1, LOW);
        
	MemBP1 = 0;
        
	MIPC = 0;
        
	Serial.print("a");        //Envoie d'un caractère pour incrémentation du Barre-Graph => PC
        
	delay(2000);              //Delai d'attente avant de reprendre pour voir s'il prend bien en compte le caractère
      
	}        
	else if(etatBP6 == HIGH && MemBP1 == 1 && MIPC == 1){  //Traitement du signal si réponse fausse. RAZ
        
		digitalWrite(LED1, LOW);
        
		MIPC = 0;
        		MemBP1 = 1;
      
		}
   
	}
 
else if(etatBP2 == HIGH && MemBP2 == 0 && MIPC == 0){
      
	MemBP1 = 0;
      
	MemBP2 = 1;
      
	MemBP3 = 0;
      
	MemBP4 = 0;
      
	MIPC = 1;
      
	digitalWrite(LED2, HIGH);
  
    

        if(etatBP5 == HIGH && MemBP2 == 1 && MIPC == 1){
        digitalWrite(LED2, LOW);
       
	MemBP2 = 0;
        
	MIPC = 0;    
        
	Serial.print("b");
        
	delay(2000);
      
	}
	else if(etatBP6 == HIGH && MemBP2 == 1 && MIPC == 1){
        
		digitalWrite(LED2, LOW);
        
		MIPC = 0;
        
		MemBP2 = 1;
      
		}
    
	}
    

else if(etatBP3 == HIGH && MemBP3 == 0 && MIPC == 0){
      
	MemBP1 = 0;
      
	MemBP2 = 0;
      
	MemBP3 = 1;
      
	MemBP4 = 0;
      
	MIPC = 1;
      
	digitalWrite(LED3, HIGH);
  

	if(etatBP5 == HIGH && MemBP3 == 1 && MIPC == 1){

	        digitalWrite(LED3, HIGH);
        
		MemBP3 = 0;
        
		MIPC = 0;   
        
		Serial.print("c");
        
		delay(2000); 
      
		}
      
	else if(etatBP6 == HIGH && MemBP3 == 1 && MIPC == 1){
        
		digitalWrite(LED3, HIGH);
        
		MIPC = 0;
        
		MemBP3 = 1;
      
		}
    
	}
    
else if(etatBP4 == HIGH && MemBP4 == 0 && MIPC == 0){
      
	MemBP1 = 0;
      
	MemBP2 = 0;
      
	MemBP3 = 0;
      
	MemBP4 = 1;
      
	MIPC = 1;
      
	digitalWrite(LED4, HIGH);
      


	if(etatBP5 == HIGH && MemBP4 == 1 && MIPC == 1){
        
		digitalWrite(LED4, LOW);
        
		MemBP4 =0;
        
		MIPC = 0;
        
		Serial.print("d");
        
		delay(2000);
      
		}

	else if(etatBP6 == HIGH && MemBP4 == 1 && MIPC == 1){
        
		digitalWrite(LED4, LOW);
        		MIPC = 0;
        		MemBP4 = 1;
      
		}
   
	}

  
}

Et voila du côté PC ce que j'ai atcuellement, pour ouvrir le port Série, et essayer de lire mon caractère ... Avez vous une idée de mon problème? ...

Form1(void)
		{
			InitializeComponent();

			HANDLE hSerial;
			hSerial = CreateFile(TEXT("COM3"), 
			GENERIC_READ | GENERIC_WRITE, 
			0,
			NULL, 
			OPEN_EXISTING,
			FILE_ATTRIBUTE_NORMAL, 
			NULL);

			if( hSerial == INVALID_HANDLE_VALUE ){
				printf("Erreur d'initialisation");
			}
			else{
				DCB dcb = {0};

				dcb.DCBlength = sizeof(dcb);

				if( !GetCommState(hSerial, &dcb)){
					printf("Erreur de paramêtrage");

					FillMemory(&dcb, sizeof(dcb), 0);
					dcb.BaudRate = CBR_115200;
					dcb.ByteSize = 8;
					dcb.StopBits = ONESTOPBIT;
					dcb.Parity = NOPARITY;

					if( !SetCommState(hSerial, &dcb)){
						printf("Erreur de Port");
					}

					COMMTIMEOUTS timeouts = {0};

					timeouts.ReadIntervalTimeout = 0;
					timeouts.ReadTotalTimeoutConstant = 0;
					timeouts.ReadTotalTimeoutMultiplier = 0;
					timeouts.WriteTotalTimeoutConstant = 0;
					timeouts.WriteTotalTimeoutMultiplier = 0;

					if( !SetCommTimeouts(hSerial, &timeouts)){
						printf("Erreur paramètrage timeouts");
					}

					char szBuff[5] = "";
					DWORD dwBytesRead = 0;
					int i = 0;
					char test[] = "B\n";
					int maxSamples = 10;
					DWORD dwCommStatus;

					ReadFile(hSerial, LPVOID(szBuff), 4, &dwBytesRead, nullptr);
					if(szBuff == "a"){

					}
						
				}
								CloseHandle(hSerial);
			}

			
		}

Et enfaite j'arrive pas à lire mon caractère "a" envoyé depuis l'Arduino ...