2013-05-28 9 views
0

Voici une partie de mon code. Je vais expliquer le problème juste après. Mon périphérique envoie des chaînes de 13 octets sur le port série. Malheureusement, seuls les deux premiers octets sont lus correctement. Peut-être cela est parce que deux premiers octets peuvent être interprétés comme des caractères ASCII, ce serait étrange parce que je mets le codage comme NULL avec la fonction g_io_channel_set_encoding(koncentrator, NULL, NULL);GIOChannel parfois il lit parfois pas

Si je tente d'accéder les octets après deux premiers je reçois Segmentation fault, qui est aussi étrange parce que la variable ret après lecture contient 13 ce qui signifie qu'il avait lu 13 octets.

J'ai essayé d'utiliser g_io_channel_read_line et g_io_channel_read_to_end. Avec ces deux le programme bloque à boucle infinie (même quand je vérifie la condition G_IO_STATUS_EOF).

Le dernier problème, et peut-être le plus ennuyeux est qu'il ne fonctionne pas à la première fois, j'ai besoin d'ouvrir le port série avec le terminal, comme cutecom par exemple. Sinon, je peux envoyer les données mais il ne détecte aucun rappel. Je suis sûr de lui parce que l'appareil a des diodes pour indiquer les états RX et TX.

Je n'ai aucune idée de ce qui ne va pas, je serai très formidable pour me donner quelques conseils ou liens vers l'exemple approprié. Je me sens comme il n'y a rien de plus sur google que je pourrais trouver. Merci, bravo!

Répondre

1

Lorsque vous traitez avec des ports série, doit les les configurer correctement avant de commencer à lire. Ma conjecture est cutecom est la mise en place de certains paramètres de série vitaux, ce qui rend le port utilisable. En d'autres termes, le code que vous avez publié n'est pas le problème. Le code manquant est.

Un bon moyen de vérifier cela est d'utiliser stty. Ceci est juste un exemple: utilisez man stty pour avoir la liste (admittely long) d'options.

stty -F /dev/ttyS0 raw 9600 -parity 
+0

Merci beaucoup. Cela marche. Je voudrais aussi demander comment le rendre pernament, devrais-je l'ajouter au script boot rc pour qu'il l'exécute après chaque démarrage? – Marek

+0

@Marek Oui, par ex. vous pouvez utiliser '/ etc/rc.local'. Une meilleure approche serait de lancer l'appel 'stty' au début de votre programme, via' g_spawn_command_line_sync() 'par exemple.La meilleure solution serait d'appeler directement les API 'termios' pour obtenir la même configuration, mais cela impliquerait beaucoup plus de travail. – fetasail

1

C'est la signature de g_io_channel_read_chars selon la documentation:

GIOStatus   g_io_channel_read_chars    (GIOChannel *channel, 
                 gchar *buf, 
                 gsize count, 
                 gsize *bytes_read, 
                 GError **error); 

Vous passez &msg comme argument buf, donc vous passez une valeur de type gchar** où la fonction attend gchar*. Vous devriez passer msg à la place. Vous devriez également d'abord allouer la mémoire car c'est la responsabilité de l'appelant et non la fonction.

+0

Merci Adrian. J'ai ajouté 'malloc' et changé' & msg' pour 'msg' et cela a résolu le problème avec' Segmentation fault'. Mais j'ai toujours le problème avec la communication, j'ai besoin d'ouvrir l'appareil avec le terminal 'cutecom' et seulement alors mon programme C sera capable de recevoir des messages de l'appareil. J'ai oublié de dire que j'ajoute le module au noyau donc je suis sûr que le périphérique existe dans le système, il est noté par le terminal 'cutecom'. – Marek

Questions connexes