Je fais mes applis PC sur VB6 (de la suite Visual Studio 6.0) qui communiquent avec l'arduino via le port série. Vu l'implémentation de Arduino dans VS 2010, je vais peut-être changer de version, mais c'est dommage quand on commence à maîtriser un soft qui marche encore très bien de changer...)
Le plus dur étant de dire à l'arduino d'envoyer des octets (byte) et non des caractères : Serial.print(0x65) envoie trois octets (49, 48 et 49 : "101") au lieu de la valeur sur un seul octet ( 101 ou caractère "A"). il faut utiliser Serial.write(data) avec data comme byte, sinon, ça ne marche pas bien (un int en paramètre risque d'être traité comme une chaine de deux caractères).
Ensuite, côté VB, le port série est lui aussi orienté chaine de caractères, donc il faut lui dire d'envoyer des octets un par un (à partir d'un tableau à 1 case).
C'est un peu de la bidouille, mais ça a finit par marcher. Reste le côté "événement" qui n'est pas facile, sur l'arduino, il faut pouvoir réagir à tout moment à la réception de données pour répondre si c'est une demande de lecture de données par exemple. Pour VB, pareil, il faut pouvoir traiter les données reçues quand elles arrivent.
Un exemple des codes que j'utilise, côté arduino :
byte data, d0, d1, d2;
loop(){
if (Serial.available()) { // scruter en continu l'arrivée de commandes via le port série et les traiter.
data = Serial.read(); // réception d'une commande :
Switch (data){
case 0x55 : // code 0x55 = "Bonjour, tu vas bien?"
Serial.write(0xAA); // Réponse 0xAA = "Bonjour aussi! Oui, je vais bien!"
Break;
case 0x24 : // code 0x24 = commande éclairage
While(!Serial.available()); // attente des données suivantes
d0 = Serial.read(); // d0 contient le numéro de la lampe sur laquelle on doit agir
While(!Serial.available()); // attente des données suivantes
d1 = Serial.read(); // d1 contient la valeur d'éclairage (pour PWM par exemple)
lampe_eclaire(d0, d1); // appel d'une procédure qui allume la lampe demandée à la valeur demandée
Serial.write(0xAA); // Réponse 0xAA = "Bien reçu, commande traitée"
Break;
(...) // la suite du traitement des commandes...
}
}
}
Dans cet exemple,
si on reçoit 0x55, l'émetteur attend en retour 0xAA ou un code d'erreur.
si on reçoit 0x24, c'est une commande suivie de deux octets de paramètes, il faut donc attendre d'avoir reçu les deux octetc suivants pour traiter la commande
Côté VB :
un timer à 100ms qui fait comme sur l'arduino (if serial.available()...), car j'ai jamais réussi à utiliser le handler du port série. Je ne sais pas pourquoi, mais voilà quoi...
un timer lancé dans la proc de lecture (pour retrouver une fonction similaire à While (Serial.available()); data = Serial.read(); de l'arduino avec une gestion de Time_Out, car ce n'est pas prévu dans VB et c'est très gênant en cas de plante lors du développement :
Private Sub Timer_TimeOut_Timer() ' procédure appelée par le timer
Time_Out = True
Timer_TimeOut.Enabled = False
End Sub
Function Data_Read() As Byte ' Fonction qui renvoie un octet du buffer série INPUT
Dim Data As Byte
Time_Out = False
Timer_TimeOut.Interval = 3000 ' timeout = 3s
Timer_TimeOut.Enabled = True
While (Not Time_Out) And (Serial.InBufferCount = 0)
DoEvents ' permet le traitement des autres évènements
Wend
Timer_TimeOut.Enabled = False
If Time_Out Then
' MsgBox ("TIME OUT port série!")
Data_Read = 0
Else
Data_Read = Asc(Serial.Input)
End If
End Function
Sub Data_Write(Data As Byte) ' envoie un octet dans le série OUT
Dim Data_out(0) As Byte ' Obligation de passer par un tableau, sinon Serial.Output ne marche pas
Data_out(0) = Data
If Serial.PortOpen Then Serial.Output = Data_out
End Sub
Sub Data_Write_16(Data As Integer) ' envoie un word (16 bits) dans le série OUT
Dim Data_out(0 To 1) As Byte
Data_out(0) = Data And 255
Data_out(1) = (Data And 65280) \ 256
If Serial.PortOpen Then Serial.Output = Data_out
End Sub
Private Sub Command_Eclairage_Click() ' commande l'éclairage de la lampe 1 en fonction de la position du scrollbar.
Data_Write(&H24) ' code d'éclairage
Data_Write(1) ' lampe N°1
Data_Write(ScrollBar1.Value) ' valeur d'éclairage
if Data_Read = &HAA then ' si tout s'est bien passé, l'arduino a renvoyé le code de confirmation (&HAA)
MsgBox("Commande bien traitée par l'arduino")
else
MsgBox ("Commande non traitée par l'arduino")
End Sub
Vous remarquerez le Data_Read = Asc(Serial.Input), car Serial.Input renvoie un caractère!
De plus, il faut initialiser Serial.InputLen = 1 : on reçoit les octets un par un.
J'ai tellement galéré à faire marcher ça, que je vous donne mes codes, si ça peut aider. Il faut bien sûr avoir des prérequis sur le composant MSComm de VB, car il est assez compliqué et peu documenté.