Communication C ++ bidirectionnelle sur une connexion série
Je suis en train d'écrire un simple application C++ pour communiquer avec un Arduino. Je voudrais vous envoyer de l'Arduino un personnage qu'il renvoie immédiatement. Le code Arduino que j'ai pris à partir d'un tutoriel ressemble à ceci:
void setup()
{
Serial.begin(9600);
}
void loop()
{
//Have the Arduino wait to receive input
while (Serial.available()==0);
//Read the input
char val = Serial.read();
//Echo
Serial.println(val);
}
Je peux communiquer avec l'Arduino facilement à l'aide de GNU screen, donc je sais que tout fonctionne bien avec la de base de la communication:
$ screen /dev/tty.usbmodem641 9600
L' (cassé) code C++ que j'ai ressemble à ceci:
#include <fstream>
#include <iostream>
int main()
{
std::cout << "Opening fstream" << std::endl;
std::fstream file("/dev/tty.usbmodem641");
std::cout << "Sending integer" << std::endl;
file << 5 << std::endl; //endl does flush, which may be important
std::cout << "Data Sent" << std::endl;
std::cout << "Awaiting response" << std::endl;
std::string response;
file >> response;
std::cout << "Response: " << response << std::endl;
return 0;
}
Il compile bien, mais lors de l'exécution, des lumières clignotent sur l'Arduino et le terminal se bloque à:
Ouverture fstream
Où vais-je tort?
source d'informationauteur learnvst
Vous devez vous connecter pour publier un commentaire.
Il y a trois points:
Première: Vous n'avez pas initialiser le port série (ATS) côté Linux. Personne ne sait dans quel état il est.
Faire cela dans votre programme, vous devez utiliser
tcgetattr(3)
ettcsetattr(3)
. Vous pouvez trouver les paramètres requis par l'utilisation de ces mots-clés à ce site, l'Arduino site ou sur Google. Mais juste pour des tests rapides je vous propose d'émettre cette commande avant d'appeler votre propre commande:Surtout le manque
clocal
peut empêcher l'ouverture de l'ATS.Deuxième: Lorsque l'appareil est ouvert, vous devriez attendre un peu avant d'envoyer quoi que ce soit. Par défaut, l'Arduino se réinitialise lorsque le numéro de série en ligne est ouvert ou fermé. Vous devez prendre cela en compte.
La
-hupcl
partie permettra d'éviter ce reset, la plupart du temps. Mais, au moins, un reset est toujours nécessaire, parce que-hupcl
peut être réglé que lorsque le terminal est déjà ouvert et qu'à l'époque de l'Arduino a reçu le signal de réinitialisation déjà. Donc-hupcl
sera "seulement" de prévenir de futures réinitialise.Troisième: Il est PAS gestion des erreurs dans votre code. Veuillez ajouter le code après chaque opération e /s sur l'ATS qui vérifie les erreurs et la partie la plus importante - imprime des messages d'erreur utiles à l'aide de
perror(3)
ou des fonctions similaires.Lorsque vous ouvrez le port série de l'Arduino réinitialise. Pour un Arduino Unol'ajout de 10 µF condensateur entre la réinitialisation et de terrain de l'en empêche. Voir cette pour plus de détails. Notez que vous devez supprimer le condensateur chaque fois que vous avez besoin de reprogrammer la puce.
Vous devez également configurer le port série correctement, mais vous avez besoin pour résoudre le problème de matériel d'abord.
Vous devriez vérifier si vous avez accès à
/dev/tty.usbmodem641
. La manière habituelle dans Linux est pour ajouter l'utilisateur au groupe approprié avecadduser
.Par la manière, je sais que pour accéder au port série, il faut ouvrir
/dev/ttyS0
(COM1), jusqu'à ce que/dev/ttyS3
. Voir, par exemple,cet exemple en C.