View Full Version : c++ comandi AT
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
fstream modem;
modem.open("com2:");
Sicuro che questa cosa funioni ??!?!?!?
per funzionare funziona, infatti il numero lo compone.
ciao ciao
Cavolo...davvero utile questa cosa...non credevo che funzionasse... Per leggere la risposta prova ad usare l'inpt con una stringa...
modem >> s;
ho provato ma niente.
Non saprei proprio come fare.
Per caso conosci i comandi AT per mandare un SMS?
ciao ciao e grazie ancora
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)
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.
anche il comando successivo non mi funziona, vuol dire che non il mio modem non supporta le estensioni GSM?
ciao ciao
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.
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?
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...
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.
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.
ok, ma dopo riuscivi a leggere le risposte del modem?
ciao ciao e ancora grazie
ilsensine
15-03-2005, 07:56
Sì certo che ci riuscivo. E' fondamentale aspettare la risposta del modem prima di eseguire i comandi successivi.
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.
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.
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
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
grazie a tutti!
domani pomeriggio provo e vi faccio sapere
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.
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
Sta comandando un cellulare/modem GSM per inviare un SMS...
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
Prova ad inserire un piccolo ritardo fra lettura e scrittura...qualcosa come 100 o 200 ms (con Sleep)...
Originariamente inviato da cionci
Prova ad inserire un piccolo ritardo fra lettura e scrittura...qualcosa come 100 o 200 ms (con Sleep)...
provo subito!
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
Sleep con la S maiuscola...
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/sleep.asp
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!
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
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
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?
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 ;)
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.
grazie comunque.
magari cionci ha qualche idea.
ciao ciao
Non so come aiutarti, mi dispiace...senza fare prove è un po' difficile...
non e' che magari devo mandare una stringa di inizializzazione al modem?
ciao ciao
HyperTerminal non invia alcuna stringa di inizializzazione... apre solamente la porta...
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?
Con quello apri la porta...oltre a quello devi settare la modalità di comunicazione con SetCommState...
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?
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);
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).
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
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 )
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.
ho settato tutti i valori, ma niente!
Non e' che devo andare a modificare il timeout?
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 :)
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).
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 !!!!!!!!!!!!!!!
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.