Comment lire de série de l'appareil en C++
Je suis à essayer de comprendre comment je dois lire/écrire à mon Arduino en utilisant la communication série sous Linux en C++. Actuellement, je suis en train de lire une réponse de mon Arudino que je "détente" avec
echo "g" > /dev/ttyACM0"
J'ai essayé de regarder la réponse de mon Arduino dans mon terminal, à l'aide de la commande suivante:
tail -f /dev/ttyACM0
C'est de travailler comme il se doit. Maintenant, je veux faire la même chose dans une application C++. J'ai donc fait ce test
void testSerialComm()
{
std::string port = "/dev/ttyACM0";
int device = open(port.c_str(), O_RDWR | O_NOCTTY | O_SYNC);
std::string response;
char buffer[64];
do
{
int n = read(device, buffer, sizeof buffer);
if (n > 0) {
response += std::string(buffer);
std::cout << buffer;
}
} while (buffer[0] != 'X'); //'X' means end of transmission
std::cout << "Response is: " << std::endl;
std::cout << response << std::endl;
close(device);
}
Après quelques "messages", la transmission est un peu foiré. Mon application de test écrit la réponse de caractères dans un ordre aléatoire et quelque chose n'est pas droite. J'ai essayé de configurer le /dev/ttyACM0 appareil par cette commande:
stty -F /dev/ttyUSB0 cs8 115200 ignbrk -brkint -icrnl -imaxbel -opost -onlcr -isig -icanon -iexten -echo -echoe -echok -echoctl -echoke noflsh -ixon -crtscts
Pas de dés. Quelqu'un peut-il m'aider à comprendre comment communiquer avec mon Arduino en C++?
ftell()
rendement comme résultat?ftell() retourne -1
Donc, vous devriez réagir d'une certaine manière sur ce retour en cas d'erreur, vérifiez
errno
réellement ce qui s'est mal passé.Vous ne pouvez pas demander à un ats, qui est une grande partie de votre problème. Plutôt que de connaître à l'avant gros comment les données seront vous devrez continuer à lire jusqu'à ce que vous atteignez la fin des données.
Voir cette réponse pour une question très semblable
OriginalL'auteur gromit190 | 2016-01-17
Vous devez vous connecter pour publier un commentaire.
Le code ouvre
/dev/ttyACM0
, les tentatives de chercher à la fin de ce "dossier", et en se fondant sur la position dans le fichier alloue à l'ancienne, de style C de la mémoire tampon, pour une raison étrange, au lieu d'utiliserstd::vector
oustd::string
, en dépit de la demande qui c'est, vraisemblablement, un programme C++, selon la question de balises.Le problème avec cette approche est que vous pouvez rechercher par le biais d'ordinaire, ordinaire, jardin-variété de fichiers.
/dev/ttyACM0
n'est pas un fichier régulier. C'est un appareil. Bien que certains appareils sont adressable, ce n'est pas le cas. Qui, selon les commentaires, vous avez découvert de façon indépendante.Série de dispositifs de port sont de lecture et d'écriture. Ils ne sont pas adressable. Il n'y a pas une telle chose comme "chercher"ing sur un port série. Qui n'a pas de sens.
À lire à partir du port série que vous venez de lire, c'est tout. Le système d'exploitation ne maintenir une mémoire tampon interne de taille, donc si certains personnages ont déjà été reçues sur le port série, la lecture initiale sera de retour tous (à condition que le
read()
taille de la mémoire tampon est suffisamment grand). Si vous passez une résolution de 1024 tampon de caractères, par exemple, et cinq personnages étaient déjà lu à partir du port sérieread()
sera de retour 5, pour indiquer que en conséquence.Si aucun des caractères ont été lus, et que vous avez ouvert le port série comme un dispositif de blocage,
read()
va bloquer au moins jusqu'à ce qu'un personnage a été lu à partir du port série, et de revenir ensuite.Afin de lire à partir du port série tout ce que vous avez à faire est de lire de lui, jusqu'à ce que vous avez décidé que vous avez lu tout, il est à lire. Comment décidez-vous que? C'est à vous. Vous pouvez décider que vous voulez lire seulement jusqu'à ce que la lecture d'un caractère de saut de ligne. Ou vous pouvez decie que vous souhaitez lire seulement jusqu'fixe
#n
nombre de caractères ont été lus. C'est entièrement à vous.Et, bien sûr, si le matériel est correctement organisé, et vous prendre les arrangements nécessaires avec le port série de l'appareil à l'égard du port série, contrôle de pins, et, selon votre configuration, la DCD et/ou de la DSR broches sont signalées pour indiquer que le port série de l'appareil n'est plus disponible, votre
read()
immédiatement retourne 0 pour indiquer un pseudo-fin de fichier de condition sur le port série de l'appareil. C'est aussi quelque chose que vous aurez besoin de mettre en œuvre la logique nécessaire à la poignée.P. S. ni de style C stdio, ni C++-style
iostream
s fonctionne très bien avec les appareils, en raison de leurs propres algorithmes de mise en mémoire tampon. Lorsque vous travaillez avec des ports série, à l'aide deopen(2)
,read(2)
,write(2)
, etclose(2)
est mieux. Mais tout ce qui précède s'applique toujours.À l'aide de tampon classes, comme le C++ [io]fstream est bien dans les situations où vous savez exactement ce qui d'entrée et de sortie vous attendre à avoir. Mais, dans les situations où vous devez être prêts à traiter les différentes possibilités, lorsque vous devez comprendre exactement ce que vous la fin de la lecture, comme je l'ai dit, vous devriez utiliser open(), read () et write(), le système des appels, parce que la mise en mémoire tampon qui est introduit par fstream classes seront souvent obtenir de la manière.
Essaie d'utiliser la fonction "ouvrir" et "lecture" sur l'appareil. J'ai été à l'aide de "tail-f /dev/ttyACM0" pour voir ce que l'Arduino écrit. Ensuite, mon application est capable de lire les 2 premiers caractères de la réponse de l'Arduino (rien de plus). Si je ferme la "queue" du programme, mon application lit pas les caractères? Je vais mettre à jour ma question de ce que j'ai jusqu'à présent.
Généralement, un seul processus peut se lire à partir d'un port série en même temps. Lorsque plusieurs processus ont le port ouvert, chaque caractère reçu sur le port série est lu par l'un des processus, au hasard. En outre, étant donné que chaque processus est habituellement lit autant qu'il le peut, avec mise en mémoire tampon, un arrêt de processus pourrait avez toujours réussi à lire quelques entrées supplémentaires à partir du port série qui a été lu juste avant que le processus a été tué.
OriginalL'auteur Sam Varshavchik