Executer des commandes Hayes (AT) en language C

Résolu
S1rK Messages postés 17 Date d'inscription mardi 25 juillet 2006 Statut Membre Dernière intervention 15 novembre 2011 - 15 févr. 2011 à 15:03
S1rK Messages postés 17 Date d'inscription mardi 25 juillet 2006 Statut Membre 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

6 réponses

cs_beg0 Messages postés 51 Date d'inscription lundi 17 janvier 2005 Statut Membre Dernière intervention 13 mars 2011 1
19 févr. 2011 à 21:40
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...
2
S1rK Messages postés 17 Date d'inscription mardi 25 juillet 2006 Statut Membre Dernière intervention 15 novembre 2011 4
18 févr. 2011 à 11:27
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);
1
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
16 févr. 2011 à 07:18
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()

@++
0
S1rK Messages postés 17 Date d'inscription mardi 25 juillet 2006 Statut Membre Dernière intervention 15 novembre 2011 4
18 févr. 2011 à 11:32
oups, petit problème lors du c/c.. les #8220 représentent des "
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
S1rK Messages postés 17 Date d'inscription mardi 25 juillet 2006 Statut Membre Dernière intervention 15 novembre 2011 4
21 févr. 2011 à 11:26
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 ^^)
0
S1rK Messages postés 17 Date d'inscription mardi 25 juillet 2006 Statut Membre Dernière intervention 15 novembre 2011 4
24 févr. 2011 à 11:28
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!
0
Rejoignez-nous