PDA

View Full Version : c++ comandi AT


Poix81
02-03-2005, 15:14
Ciao a tutti.
Con DevC++ per windows devo mandare dei comandi AT ad un modem GSM, devo mandare degli SMS.

Con queste due righe creo il canale verso il modem sulla com2
fstream modem;
modem.open("com2:");


Con questa riga dico al modem di fare il numero di telefono (1234)
modem << "ATD 1234\r");

A me interessa vedere la risposta di questi comandi, come avviene nell HyperTerminal, ho provato a cercare in giro, ma non ho trovato niente.

ciao caio e grazie a tutti

cionci
02-03-2005, 18:17
fstream modem;
modem.open("com2:");

Sicuro che questa cosa funioni ??!?!?!?

Poix81
02-03-2005, 21:53
per funzionare funziona, infatti il numero lo compone.

ciao ciao

cionci
02-03-2005, 23:29
Cavolo...davvero utile questa cosa...non credevo che funzionasse... Per leggere la risposta prova ad usare l'inpt con una stringa...

modem >> s;

Poix81
02-03-2005, 23:38
ho provato ma niente.
Non saprei proprio come fare.

Per caso conosci i comandi AT per mandare un SMS?

ciao ciao e grazie ancora

Poix81
04-03-2005, 08:57
nessuna novita'?

ilsensine
04-03-2005, 10:40
Tu: ATZQ0V1H0E0\r (o altra stringa di inizializzazione specifica per il modem)
Modem: OK\r
Tu: ATS0=0&C1\r
Modem: OK\r
Tu: AT+CMGF=1\r
Modem: OK\r
Tu: AT+CMGS="+39368888888"\r (il "+39" dovrebbe essere obbligatorio)
Modem: >[spazio]
Tu: <messaggio> (il messaggio _deve_ terminare con ctrl+z, carattere ascii 26 -- _non_ con \r)
Modem: OK\r (o altro messaggio di OK equivalente)

Poix81
04-03-2005, 13:21
Grazie!

Pero' col mio cellulare, siemens M50, mi da' errrore questa riga:

AT+CMGF=1

cosa potrebbe essere?

ciao ciao e grazie

ilsensine
04-03-2005, 15:36
Non mi ricordo a che serviva, è scritto nell'elenco delle estensioni GSM per i comandi AT.

Poix81
04-03-2005, 16:02
anche il comando successivo non mi funziona, vuol dire che non il mio modem non supporta le estensioni GSM?

ciao ciao

Poix81
10-03-2005, 09:20
up

ilsensine
10-03-2005, 09:42
Non saprei, occorre leggere la descrizione dei comandi. A memoria non li ricordo, ti ho postato i comandi che manda un programma che ho scritto tempo fa per mandare sms con un modem gsm.

Poix81
10-03-2005, 09:57
ok grazie.
Per caso sai come leggere la risposta dei comandi?

ciao ciao

ilsensine
10-03-2005, 11:14
Come ti ha consigliato Cionci non funziona?

cionci
10-03-2005, 13:29
Originariamente inviato da ilsensine
Come ti ha consigliato Cionci non funziona?
Tu l'avevi mai vista questa cosa ? Volevo fare qualche test, ma me lo sono scordato... Più che altro volevo verificare la compatibilità con altri compilatori...

Poix81
10-03-2005, 13:33
ho provato ma non funziona.

ciao ciao

ilsensine
10-03-2005, 14:12
Originariamente inviato da cionci
Tu l'avevi mai vista questa cosa ? Volevo fare qualche test, ma me lo sono scordato... Più che altro volevo verificare la compatibilità con altri compilatori...
Mai vista. Io ho sempre usato open/read/write/close, in quanto solo tramite open ottengo un descrittore compatibile con termios, per settare le impostazioni della porta.

Poix81
12-03-2005, 14:35
Per ilsensine:
ma quel progetto che hai fatto lo hai realizzato in c++?

ciao ciao e grazie

ilsensine
12-03-2005, 21:54
Era in c, sotto linux.

Poix81
12-03-2005, 23:59
ok, ma dopo riuscivi a leggere le risposte del modem?

ciao ciao e ancora grazie

Poix81
15-03-2005, 06:53
:)

ilsensine
15-03-2005, 07:56
Sì certo che ci riuscivo. E' fondamentale aspettare la risposta del modem prima di eseguire i comandi successivi.

Poix81
15-03-2005, 07:57
ma lo facevi con una semplice read?

ilsensine
15-03-2005, 07:59
Sì.
Ti conviene cercare in rete la procedura corretta sotto windows; se non ricordo male, occorre aprire la com con CreateFile, quindi usare qualche funzione per settare le impostazioni desiderate della porta, poi puoi accedere al dispositivo con le normali funzioni di read/write.

Poix81
15-03-2005, 08:03
ok, anche sotto linux e' necessario fare la stessa cosa?
magari prima faccio una prova sotto linux e poi provo sotto win.

ciao ciao e ancora grazie

ilsensine
15-03-2005, 08:08
Il concetto è simile, anche se le funzioni utilizzate sono ovviamente diverse.

Poix81
15-03-2005, 08:12
ok grazie

ilsensine
15-03-2005, 08:25
Esistono diverse guide in rete riguardo i sistemi posix come linux; ad es. questa:
http://www.virtualblueness.net/serial/serial.html

Poix81
15-03-2005, 08:35
grazie

cionci
15-03-2005, 09:14
Originariamente inviato da ilsensine
se non ricordo male, occorre aprire la com con CreateFile,
Infatti...CreateFile, ReadFile e WriteFile... E' per quello che mi sembrava strano che ti funzionasse ;)

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/configuring_a_communications_resource.asp

Poix81
15-03-2005, 09:23
grazie a tutti!

domani pomeriggio provo e vi faccio sapere

cionci
15-03-2005, 14:11
Se cerchi un po' a partire dal mio link vedraic he ce ne sono acnche altri di esempi: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/devio/base/monitoring_communications_events.asp

ilsensine
15-03-2005, 14:52
Comunque, tornando al discorso AT:
http://www.daniel-hertrich.de/mob_hplx/atc35i.pdf
Non è riferito specificamente al tuo modello, ma per lo più i comandi sono i soliti.

Poix81
15-03-2005, 15:15
grazie :)

Poix81
17-03-2005, 16:06
sto usando la funzione ReadFile che pero' a volte da problemi, infatti non legge tutta la risposta, ma solo 8 caratteri, anche se specifico di leggerne 40.

ciao ciao e grazie

ilsensine
17-03-2005, 16:19
Evidentemente quando hai effettuato la read erano presenti solo 8 caratteri nel buffer di ricezione.
Il "40" è il limite massimo, la read può benissimo ritornarne meno.

3nigma666
17-03-2005, 16:29
ragazzi scusate non ho capitio bene..state scrivendo un programma ke permette di scrivere un sms da tastiera ke viene inviato al cellulare tramite porta com,e poi dal cellulare alla rete gsm?
Teoricamente,non è possibile inviare sms tramite l'adsl?cioè scrivere un sms client ke si collega al tipico numero centro servizi ,tim wind o vodafone e mandare sms da casa senza ausilio di cellulare sfruttando il collegamento adsl? io sapeo ke era possibile grazie a hyperterminal con il modem 56 kb(se non sbaglio la stessa cosa la potrei fare via telnet?anke da linux),ma non con l'adsl in quanto non compone numeri.. ne sapete qualcosa di piu?(SPERO DI NON AVER SCRITTO CAVOLATE,L'ARGOMENTO è AL QUANTO INTERESSANTE SOLO KE NON DI FACILE DOCUMENTAZIONE)
grazie



3NiGm@666

cionci
17-03-2005, 16:43
Sta comandando un cellulare/modem GSM per inviare un SMS...

Poix81
17-03-2005, 16:44
Originariamente inviato da ilsensine
Evidentemente quando hai effettuato la read erano presenti solo 8 caratteri nel buffer di ricezione.
Il "40" è il limite massimo, la read può benissimo ritornarne meno.

pero' io letto la risposta, per esempio "NO CARRIER".
Alla prima read mi da NO CARRI e alla seconda ER, sfasando tutto.

ciao ciao

cionci
17-03-2005, 16:50
Prova ad inserire un piccolo ritardo fra lettura e scrittura...qualcosa come 100 o 200 ms (con Sleep)...

Poix81
17-03-2005, 17:24
Originariamente inviato da cionci
Prova ad inserire un piccolo ritardo fra lettura e scrittura...qualcosa come 100 o 200 ms (con Sleep)...


provo subito!

Poix81
17-03-2005, 17:38
ho cercato la funzione sleep, pero' non non l'ho trovata, uso devc++.
Intanto ho messo un pause e sembra andare,avevi ragione cionci!

sbagliavo perche' scrivevo sleep invece di Sleep

grazie

3nigma666
17-03-2005, 17:42
Poix81 se puoi,se non devi usare il programma per fini di vendita o similare,potresti postare il codice,perke mi interesserebbe parecchio studiarlo,sempre se non ti dispiace.

GRazie mille

3NiGm@666

cionci
17-03-2005, 17:44
Sleep con la S maiuscola...

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/sleep.asp

Poix81
17-03-2005, 17:46
Originariamente inviato da cionci
Sleep con la S maiuscola...

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/sleep.asp

e' vero!

Poix81
17-03-2005, 17:47
Originariamente inviato da 3nigma666
Poix81 se puoi,se non devi usare il programma per fini di vendita o similare,potresti postare il codice,perke mi interesserebbe parecchio studiarlo,sempre se non ti dispiace.

GRazie mille

3NiGm@666

gli do' una sistemata e poi lo posto.

3nigma666
17-03-2005, 18:15
Fantastico,non vedo l'ora :D :D :D Grazie mille ;)

3NiGm@666

Poix81
18-03-2005, 08:39
ho ancora un problemino...

Praticamente se apro la porta dove ho il cellulare prima con hyper terminal e poi col mio programmino la comunicazione funziona.
Pero' se prima non apro H T, riesco a mandare i messaggi al cellulare, ma poi il prog non va avanti e non legge...

devo configurare la porta, pero' non ho capito bene come.

ciao ciao e grazie

ilsensine
18-03-2005, 08:44
Con l'equivalente win32 di termios:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcecoreos5/html/wce50conconfiguringaserialport.asp

Poix81
18-03-2005, 08:49
Originariamente inviato da ilsensine
Con l'equivalente win32 di termios:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcecoreos5/html/wce50conconfiguringaserialport.asp


grazie

ma di lavoro fai il programmatore oppure sei "semplicemente" un super appossiontato?

Poix81
18-03-2005, 09:03
ho provato, ma non ci riesco!
non esiste una configurazione "standard" per un modem seriale?

ciao ciao e grazie

ilsensine
18-03-2005, 09:11
Originariamente inviato da Poix81
ho provato, ma non ci riesco!
non esiste una configurazione "standard" per un modem seriale?

Sì e no. Puoi stamparti i valori ritornati dalla GetCommState dopo aver avviato hyperterminal, per avere un punto di partenza. Credo che il problema nel tuo caso sia la velocità, evidentemente con il tuo cell ne devi usare una specifica.

ilsensine
18-03-2005, 09:12
Originariamente inviato da Poix81
grazie

ma di lavoro fai il programmatore oppure sei "semplicemente" un super appossiontato?
Prima di tutto, sono un utente di google ;)

Poix81
18-03-2005, 14:14
ho fatto come mi hai detto, tramite il comando GetCommState ho settato la porta nello stesso modo di Hyper Terminal, pero' ho sempre lo stesso problema.

ilsensine
18-03-2005, 14:28
Ah boh le mie conoscenze per win32 si fermano qui, non so cosa altro possa essere sfuggito.

Poix81
18-03-2005, 14:38
grazie comunque.

magari cionci ha qualche idea.

ciao ciao

cionci
18-03-2005, 14:55
Non so come aiutarti, mi dispiace...senza fare prove è un po' difficile...

Poix81
18-03-2005, 16:20
non e' che magari devo mandare una stringa di inizializzazione al modem?

ciao ciao

cionci
18-03-2005, 16:22
HyperTerminal non invia alcuna stringa di inizializzazione... apre solamente la porta...

Poix81
18-03-2005, 16:25
grazie per l'info.

non riesco proprio a capire dove possa esere il problema.

Ma in c++ oltre a fare questo
m_hCom = CreateFile (cPortName ,// Pointer to the name of the port
GENERIC_READ | GENERIC_WRITE,
// Access (read/write) mode
0, // Share mode
NULL, // Pointer to the security attribute
OPEN_EXISTING,// How to open the serial port
0, // Port attributes
NULL); // Handle to port with attribute
// to copy

devo anche dirgli di aprire la porta?

cionci
18-03-2005, 16:33
Con quello apri la porta...oltre a quello devi settare la modalità di comunicazione con SetCommState...

Poix81
18-03-2005, 16:42
ho fatto anche quello...

ma alla fine in out me la apre, mentre si blocca mentre leggo.

ciao ciao e grazie

ilsensine
18-03-2005, 16:47
Originariamente inviato da Poix81
ma alla fine in out me la apre, mentre si blocca mentre leggo.

Non vuol dir nulla. I dati in uscita li puoi sempre inviare, ma se le impostazioni della porta sono sbagliate (ad es. il cell non gradisce la velocità impostata), il cell non leggerà niente. Quindi non risponderà neanche.

A me continua a sembrare un problema di impostazione errata della velocità...boh sbaglierò...

Puoi postare il codice con cui setti le impostazioni della porta?

Poix81
18-03-2005, 17:30
ecco quello che faccio:
// Get the default port setting information.
GetCommState (m_hCom, &PortDCB);

// Change the DCB structure settings.
PortDCB.BaudRate = 9600; // Current baud
// PortDCB.fBinary = TRUE; // Binary mode; no EOF check
// PortDCB.fParity = TRUE; // Enable parity checking.
// PortDCB.fOutxCtsFlow = FALSE; // No CTS output flow control
// PortDCB.fOutxDsrFlow = FALSE; // No DSR output flow control
// PortDCB.fDtrControl = DTR_CONTROL_ENABLE;
// DTR flow control type
// PortDCB.fDsrSensitivity = FALSE; // DSR sensitivity
// PortDCB.fTXContinueOnXoff = TRUE; // XOFF continues Tx
// PortDCB.fOutX = FALSE; // No XON/XOFF out flow control
// PortDCB.fInX = FALSE; // No XON/XOFF in flow control
// PortDCB.fErrorChar = FALSE; // Disable error replacement.
// PortDCB.fNull = FALSE; // Disable null stripping.
// PortDCB.fRtsControl = RTS_CONTROL_ENABLE;
// RTS flow control
// PortDCB.fAbortOnError = FALSE; // Do not abort reads/writes on
// error.
PortDCB.ByteSize = 8; // Number of bits/bytes, 4-8
PortDCB.Parity = NOPARITY; // 0-4=no,odd,even,mark,space
PortDCB.StopBits = 0; // 0,1,2 = 1, 1.5, 2

// valori cambiati per farli diventare uguali a quelli dall' Hyper Terminal
PortDCB.fOutxCtsFlow = 1;
PortDCB.fTXContinueOnXoff = 1;
PortDCB.fRtsControl = 2;
PortDCB.fAbortOnError = 1;




// unsigned long inBuff = 1200;
// unsigned long outBuff = 1200;
// SetupComm(m_hCom,inBuff,outBuff);


// Configure the port according to the specifications of the DCB
// structure.
SetCommState(m_hCom,&PortDCB);

Poix81
21-03-2005, 09:18
qualche novita'?

ilsensine
21-03-2005, 09:44
- Metti 1 bit di stop. Non ho trovato nessuno che usa 0 bit.
- prova anche con altre velocità (in particolare 38400, 57600, 115200).

cionci
21-03-2005, 10:22
Infatti...

Poix81
21-03-2005, 12:57
ok, provo a rimettere 1.

Sta mattina ho fatto un'altra prova.

Senza collegare il cellulare ho avviato Hyper Terminal e ho aperto la COM1 (quella che mi server), poi ho chiuso, collegato il cellulare ed avviato il mio programma... tutto ok.

Magari puo' essere utile per capire il problema.

Approposito, ho anche provato ad installare i driver di un modem generico a 9600 kps.

ciao ciao e g grazie per l'aiuto

Poix81
21-03-2005, 16:07
a provato a settare il bit di stop a 1, ma niente.

ilsensine
21-03-2005, 16:30
Per curiosità, perché nel tuo esempio alcuni campi non li imposti?
Puoi vedere esattamente quali sono le impostazioni lasciate da HT, e ripeterle _esattamente_?
E' l'ultima cosa logica che puoi provare, prima di dare capocciate qui => X

( :D )

Poix81
21-03-2005, 16:34
ho impostato solo le cose che cambiavano.
Allora provo ad impostare tutti i valori, non si sa' mai che facciano casino...

ciao ciao e grazie

ilsensine
21-03-2005, 16:38
Sì in particolare fBinary; anche fDtrControl e fRtsControl possono essere importanti (dipende dalle linee che gestisce il cell).
Imposta _tutto_ esattamente come fa HT per essere sicuro.

Poix81
21-03-2005, 20:20
ho settato tutti i valori, ma niente!
Non e' che devo andare a modificare il timeout?

Poix81
22-03-2005, 08:15
Originariamente inviato da Poix81
ho settato tutti i valori, ma niente!
Non e' che devo andare a modificare il timeout?

era proprio il timeout!
i valori erano tutti a zero!
ho risolto copiando quelli impostati dall'HyperTerminal

ciao ciao e grazie a tutti per la collaborazione :)

Poix81
24-03-2005, 12:33
porso farvi un'altra domanda?
Il siemens M50 lo uso senza driver sulla COM, mentre il siemens c35 necessita dei driver per poter essere utilizzato con l'Hyper Terminal.

cosa devo passargli come argomento all'apertura della seriale per dirgli di usare i driver installati?

ciao caio e grazie ancora

ilsensine
24-03-2005, 13:50
Probabilmente il driver del c35 registra una "com virtuale" (ad es. com3).

Poix81
24-03-2005, 13:53
no, e' sempre collegato su seriale, perche' con l'hyper terminal funziona solo se seleziono il modem e non la porta com.

ciao ciao e grazie

ilsensine
24-03-2005, 14:17
Allora aprendo la stessa com dovrebbe funzionare ugualmente...

3nigma666
25-03-2005, 11:25
Poix posta il codice completo PLEASE !!!!!!!!!!!!!!!