Executer des commandes Hayes (AT) en language C [Résolu]

Messages postés
17
Date d'inscription
mardi 25 juillet 2006
Dernière intervention
15 novembre 2011
- - Dernière réponse : S1rK
Messages postés
17
Date d'inscription
mardi 25 juillet 2006
Dernière intervention
15 novembre 2011
- 24 févr. 2011 à 11:28
Hello la compagnie,

Voila mon "problème" (il n'y en a pas pour le moment xD) je cherche a crée un petit programme en C de préférence, capable d'exécuté des commandes Hayes d'un modem vers un autre modem.

A savoir que j'ai déja test la plupart des commandes, et que celles-ci fonctionnent, mais je ne vois pas trop comment les exécutés dans un programme en C (pour le moment je cherche, mais je n'ai pas de pistes, en parallèle je découvre la programmation sous Linux aussi..)

Du genre lorsque je fais un "AT" savoir si celui-ci reçoit l'information ou non, ou encore émettre un appel "ATD 301" (vers le poste 301 ici)

Si une âme charitable à une idée, un tuto, des bouts de codes qui me serviraient d'exemple ou quoi que ce soit, je suis preneur :)

En espérant m'être fait comprendre ^^ merci d'avance!

Cordialement
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
52
Date d'inscription
lundi 17 janvier 2005
Dernière intervention
13 mars 2011
2
Merci
Je ne sais pas si tu fais du C depuis longtemps, mais en C le point d'entrée (i.e. l'endroit de la premiere instruction executée) est la fonction main(). Tout ce qui est en dehors de la fonction main() ne sera pas executé (Enfin c'est pas tout à fait vrai, mais pour l'instant ca suffira ;) )


Voici un programme minimaliste en C
/* file: hello.c */
#include <stdio.h>

int main()
{
    puts("Hello, world");
    return 0;
}

Ce programme peut se compiler avec la ligne de commande suivante
$ gcc -Wall -o hello hello.c


Voici un truc qui devrais plus ou moins marcher.
J'ai simplement mis tout le code à l'interieur du main() et ajouté deux lignes pour l'allocation/liberation de memoire pour la variable buff

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include 


int main()
{
int fd1;
int fd2;
char *buff,*buffer,*bufptr;
int wr,rd,nbytes,tries;

//beg0 added: Allocation memoire necessaire
buff=(char*)calloc(sizeof(char), 10+1);

//Next step, we connect to device through associated file and check the connection:

fd1 = open(&#8220;/dev/ttyS0&#8243;, O_RDWR | O_NOCTTY | O_NDELAY);

if (fd1 == -1 )
{
perror(&#8220;open_port: Unable to open /dev/ttyS0 &#8211; &#8220;);
}

else
{
fcntl(fd1, F_SETFL,0);

printf(&#8220;Port 1 has been sucessfully opened and %d is the file description\n&#8221;,fd1);
}

//Where, &#8220;/dev/ttyS0&#8221; is associated with COM1 port.

//With following code we send to device some bits:

wr=write(fd1,&#8221;ATZ\r&#8221;,4);

//And for reading response from device:

rd=read(fd1,buff,10);

printf(&#8220;Bytes sent are %d \n&#8221;,rd);

//At the end, close the connection:

close(fd1);

//Beg0 added: Liberation de la memoire allouée
free(buff);

return 0;
}


Pourrait on egalement savoir comment tu compiles ton programme ? Et pourrait tu nous envoyer les erreures generées ?

De ce que j'ai vu il y a egalement quelques definitions de variables en trop, mais ca ne devrait pas generer d'erreurs.


Je ne peux pas affirmer que ce code compile, je suis sous Windows donc...

Merci cs_beg0 2

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de cs_beg0
Messages postés
17
Date d'inscription
mardi 25 juillet 2006
Dernière intervention
15 novembre 2011
1
Merci
Salut!

Merci pour ton aide, c'est peut-être pas grand chose, mais ton explication m'a mis sur la bonne voie, encore merci =)

J'ai récupéré un programme complet et fonctionnel certes, mais que je ne comprends pas forcement (ce qui n'est pas mon but), donc je suis reparti sur quelque chose de beaucoup plus simple et clair, par contre j'ai un nombre d'erreur incalculable dans mon programme, si ton oeil d'expert ou celui d'un autre peut m'aider, un grand merci d'avance!! :)

#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <errno.h>
#include <termios.h>
#include 

int fd1;
int fd2;
char *buff,*buffer,*bufptr;
int wr,rd,nbytes,tries;

int main()
{
return 0;
}

//Next step, we connect to device through associated file and check the connection:

fd1 = open(&#8220;/dev/ttyS0&#8243;, O_RDWR | O_NOCTTY | O_NDELAY);

if (fd1 == -1 )
{
perror(&#8220;open_port: Unable to open /dev/ttyS0 &#8211; &#8220;);
}

else
{
fcntl(fd1, F_SETFL,0);

printf(&#8220;Port 1 has been sucessfully opened and %d is the file description\n&#8221;,fd1);
}

//Where, &#8220;/dev/ttyS0&#8221; is associated with COM1 port.

//With following code we send to device some bits:

wr=write(fd1,&#8221;ATZ\r&#8221;,4);

//And for reading response from device:

rd=read(fd1,buff,10);

printf(&#8220;Bytes sent are %d \n&#8221;,rd);

//At the end, close the connection:

close(fd1);
Commenter la réponse de S1rK
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Dernière intervention
14 février 2014
0
Merci
salut,


Sous Linux, c'est très simple:
Tu ouvres le port COM (ttys?) avec open().
Tu places un select() sur le fd pour lire les données entrantes.
Tu écris les commandes AT avec write() comme pour un fichier basique.

Si ton modem reçoit bien la commande AT et l'execute, il retourne "OK" qui sera lu par ta procedure fournie avec select()

@++
Commenter la réponse de cs_patatalo
Messages postés
17
Date d'inscription
mardi 25 juillet 2006
Dernière intervention
15 novembre 2011
0
Merci
oups, petit problème lors du c/c.. les #8220 représentent des "
Commenter la réponse de S1rK
Messages postés
17
Date d'inscription
mardi 25 juillet 2006
Dernière intervention
15 novembre 2011
0
Merci
Hello! un grand merci de prendre la peine de me répondre =)

Effectivement en postant, je me suis aperçu de mes erreurs :D (notamment le fait que j'étais en dehors de ma fonction main() >.<

Sinon je n'ai plus fait de C depuis une bonne année (et surtout jamais sous Linux!) donc j'apprends, tout doucement mais surement. Je compile avec l'IDE Anjuta (relativement proche de Visual Studio, et facile a prendre en main) ou via le terminal.

Lors de l'exécution de mon programme (avec les erreurs corrigées) la communication était bonne, par contre je recevais un nombre de byte de -1 (hu? oO)

Je viens d'exécuter ton programme ci-dessus, et là j'obtiens le résultat suivant:

Port 1 has been sucessfully opened and 3 is the file description
Bytes sent are 6 (auparavant je recevais -1)

Conclusion? :p (et encore merci ^^)
Commenter la réponse de S1rK
Messages postés
17
Date d'inscription
mardi 25 juillet 2006
Dernière intervention
15 novembre 2011
0
Merci
Bon, la conclusion c'est faite d'elle même ça va :D

Un grand merci a tous, j'ai bien avancé dans mon programme grâce a vous.

Tchao!
Commenter la réponse de S1rK

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.