init, lire et écrire pour linux périphérique série avec C
Je suis en train de travailler sur un nouveau projet où je veux faire une connexion avec un FTDI qui est connecté à ma machine debian. J'ai l'intention d'écrire le code du C, pas du C++. Ici se trouve mon problème. Tous les exemples que je trouve sont incomplètes ou un compilateur c++ au lieu de le compilateur GCC.
L'objectif est d'en parler à mon microcontrôleur qui est connecté à la FTDI. Pour le débogage, je veux commencer la construction d'une application linux qui est en mesure de:
- initialiser une connexion série au démarrage sur ttyUSB1
- envoyer une chaîne de caractères
- afficher les chaînes de caractères lorsqu'ils sont reçus par le pc
- enregistrer la communication à un .fichier txt
Est il un exemple de code ou un tutoriel pour faire cela?
Si je réussis, je vais defenetly placer le code ici, de sorte que les nouveaux utilisateurs peuvent l'utiliser à!
Edit:
Comme je l'ai dit je poste le code si je l'avais, et c'est ce qui a fonctionné pour moi:
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>
#define MODEM "/dev/ttyUSB0"
#define BAUDRATE B115200
int main(int argc,char** argv)
{
struct termios tio;
struct termios stdio;
struct termios old_stdio;
int tty_fd, flags;
unsigned char c='D';
tcgetattr(STDOUT_FILENO,&old_stdio);
printf("Please start with %s /dev/ttyS1 (for example)\n",argv[0]);
memset(&stdio,0,sizeof(stdio));
stdio.c_iflag=0;
stdio.c_oflag=0;
stdio.c_cflag=0;
stdio.c_lflag=0;
stdio.c_cc[VMIN]=1;
stdio.c_cc[VTIME]=0;
tcsetattr(STDOUT_FILENO,TCSANOW,&stdio);
tcsetattr(STDOUT_FILENO,TCSAFLUSH,&stdio);
fcntl(STDIN_FILENO, F_SETFL, O_NONBLOCK); //make the reads non-blocking
memset(&tio,0,sizeof(tio));
tio.c_iflag=0;
tio.c_oflag=0;
tio.c_cflag=CS8|CREAD|CLOCAL; //8n1, see termios.h for more information
tio.c_lflag=0;
tio.c_cc[VMIN]=1;
tio.c_cc[VTIME]=5;
if((tty_fd = open(MODEM , O_RDWR | O_NONBLOCK)) == -1){
printf("Error while opening\n"); //Just if you want user interface error control
return -1;
}
cfsetospeed(&tio,BAUDRATE);
cfsetispeed(&tio,BAUDRATE); //baudrate is declarated above
tcsetattr(tty_fd,TCSANOW,&tio);
while (c!='q'){
if (read(tty_fd,&c,1)>0){
write(STDOUT_FILENO,&c,1); //if new data is available on the serial port, print it out
printf("\n");
}
if (read(STDIN_FILENO,&c,1)>0){
write(tty_fd,&c,1);//if new data is available on the console, send it to serial port
printf("\n");
}
}
close(tty_fd);
tcsetattr(STDOUT_FILENO,TCSANOW,&old_stdio);
return EXIT_SUCCESS;
}
La plupart du code est venu de http://en.wikibooks.org/wiki/Serial_Programming/Serial_Linux mais j'ai aussi utilisé un peu le code affiché ci-dessous.
avez-vous vérifier cette question stackoverflow.com/questions/2982552/...
Quel est le problème avec minicom?
Bonne question, plus tard je veux reconstruire le programme à se connecter et exécuter des commandes sans avoir de moi derrière le pc donc, ce concept est que le début.
Je vois le point. Eh bien, vous pouvez au moins regarder minicom code source (alioth.debian.org/frs/...). Il est open source et écrit en C, également largement utilisé depuis de nombreuses années, donc je suis sûr qu'il ya beaucoup de choses à la réutilisation de l'apprendre.
OriginalL'auteur Embed | 2013-10-17
Vous devez vous connecter pour publier un commentaire.
La manipulation avec les ports série ( pour linux ) :
- Pour ouvrir la communication, vous aurez besoin d'un descripteur qui sera la poignée de votre port série.
- Définir les indicateurs pour contrôler la façon dont la communication sera.
- Écrire la commande à la Poignée ( assurez-vous que vous êtes à la mise en forme de l'entrée correctement ).
- Obtenir la réponse. (assurez-vous que vous êtes de lire la quantité d'informations que vous voulez )
- Fermez la poignée.
Cela ressemblera à ceci:
Notez que vous devez vous soucier de ce d'écrire et de quoi lire.
Certains plusieurs indicateurs peuvent être utilisés en cas de parité de contrôle, les bits d'arrêt, la vitesse de transmission et plus.
E_INTR
, n'ouvrez pas le fichier à l'aide de poignéesO_CLOEXEC
, ne pas traiter les signaux... Ce n'est pas combien vous voulez dire à un débutant à écrire du bon code d'Unix. Une fois que vous arrivez à un point où il est bon de code d'Unix, il va être trop long pour le peu qu'il fait, il y a une question de savoir si c'est même pas la peine de faire plus dans la plaine C sans perdre votre santé mentale...À l'autre extrémité du spectre, on peut dire que Qt est si vaste et englobant tout, dans ce qu'il fait qu'il y a une question de savoir si c'est même pas la peine de l'utiliser. J'ai vu Qt amené à une dépendance sur des projets qui n'utilisait que pour une très petite partie de la fonctionnalité (par exemple: les structures de base de données, qui sont beaucoup plus raisonnablement mis en œuvre à l'aide de la STL) et, essentiellement, le prix que vous payez est la météorisation. Je me dis qu'il est plus facile de garder votre santé mentale de le faire de cette façon... C'est la construction de votre voiture à partir de zéro plutôt que d'être à la merci du fabricant pour le remplacement des pièces
J'ai peut-être choisi un terrible analogie comme sans ressources extraordinaires, la voiture, vous vous retrouvez avec seront pas adaptés à l'utilisation. POSIX, cependant, est un peu moins difficile, surtout parce que c'est bien documentée.
Qt est tout à fait utilisable même si vous n'avez pas apporter à l'ensemble des modules, mais seulement certaines parties d'entre eux. C'est, en général, fait automatiquement si vous lier statiquement la bibliothèque Qt à votre exécutable. Comme un bonus supplémentaire, vous pouvez certainement inclure que certains Qt source les fichiers de votre projet, tout comme Qt le fait quand il s'amorce lui-même. Sur Windows, entièrement compilé statiquement bonjour tout le monde qui utilise QString, QTextStream sur un
stdout
de cstdio, sans filetage de soutien, pas de dépendances sur toutes les exécutions, est d'environ 800ko sans essayer super dur.Ouais, mais 800ko est encore énorme pour peu de fonctionnalité réelle que le binaire fournit!
OriginalL'auteur rfermi
Depuis gcc est un compilateur C/C++, vous n'avez pas besoin de vous limiter à la pure C.
Coller à la pure C est OK si vous aimez écrire beaucoup de code réutilisable, et si vous savez vraiment ce que vous faites. Beaucoup de gens utilisent des Api Unix de manière incorrecte, et beaucoup d'exemple de code, il est beaucoup trop simpliste. L'écriture correcte Unix code C est un peu ennuyeux, pour dire le moins.
Personnellement, je vous conseille d'utiliser non seulement pour le C++, mais aussi un haut niveau d'application du cadre de développement comme Qt. Qt 5 est livré avec un QtSerialPort module qui le rend facile d'énumérer les ports série, configurer, et récupérer des données dans et hors d'eux. Qt n'est pas de vous forcer à utiliser l'interface utilisateur des modules, il peut être une application en ligne de commande, ou un non-interactive server/daemon.
QtSerialPort est également utilisable à partir de Qt 4, mais il n'est pas fourni avec Qt 4, vous devez l'ajouter à votre projet. Je suggère de commencer avec Qt 5, c'est plus agréable à utiliser avec son C++11.
Le code à l'aide de Qt peut être assez simple, pas beaucoup plus que votre langage de description. Ci-dessous est un Qt application de console à l'aide de Qt 5 et C++11. Il utilise le
core
etserialport
modules. Il a également gère leSIGINT
signal de sorte que la sortie fichier est vidé avant que le processus prendrait fin en raison d'une^C
. Je suis en utilisantQLocalSocket
en place des premières Unix API pour communiquer de l'Unix gestionnaire de signal, la fonctionnalité est la même.Seulement le code à l'intérieur
main
qui est strictement nécessaire, le reste est juste de le faire correctement envelopper les choses quand vous frappez^C
.Eh bien, vous ne pouvez pas le faire manuellement, sans comprendre ce qui se passe. L'utilisation de QT creator pour créer un projet, ajouter des fichiers au projet, ajoutez le
serialport
module à l' .fichier pro (QT += serialport
), et cela devrait fonctionner.Je voterais votre réponse si j'en ai eu 15 de la réputation
de langue requis est le C et le système d'exploitation unix. Downvoted que ces deux condition n'était pas respectée.
J'ai proposé une solution alternative, et ce très certainement fonctionne sur tout système Unix où vous pouvez compiler Qt (rien qui vaille la peine, pour l'essentiel) 🙂
OriginalL'auteur Kuba Ober