Qualche tempo fa ho realizzato un programma che mi permette di pilotare un modem tramite comandi AT.
Fino alla settimana scorsa ho vissuto felice coi miei Siemens MC35 ed i cellulari Nokia: il programma non è velocisimo ma funziona in maniera accettabile. Ma poi...
Lunedì mi hanno "regalato" un Siemens ES75, chiedendomi di adattare il programma a funzionare *anche* con questo modello.
Cerco di descrivere brevemente il casino che sto vivendo:
L'MC35 lo piloto tranquillamente così:
- Codice: Seleziona tutto
Function SCRIVI_COMANDO(ByVal PORTA As String, ByVal COMANDO As String)
Dim com1 As IO.Ports.SerialPort
(...)
com1= My.Computer.Ports.OpenSerialPort(PORTA, VELOCITA, IO.Ports.Parity.None, 8, 1)
' VELOCITA=115200, SETTABILE DALL'UTENTE
com1.Write(COMANDO & vbCrLf)
' a questo punto, sulla porta arrivano i byte della risposta
WAIT_MS(500) 'routine che attende 500 millisecondi
While com1.BytesToRead > 0
RISPOSTA= com1.ReadExisting
Wait_MS(500)
End While
com1.Dispose
SCRIVI_COMANDO = RISPOSTA
End Function
Con l'ES75 le cose cambiano... se lo gestisco con la routine qui sopra... ogni volta mi dà la risposta relativa al comando precedente. Il modem reagisce nel modo corretto solo se cambio lo stato del pin DTR.
Il mio codice quindi è diventato:
- Codice: Seleziona tutto
Function SCRIVI_COMANDO(ByVal PORTA As String, ByVal COMANDO As String)
Dim com1 As IO.Ports.SerialPort
(...)
Try
com1= My.Computer.Ports.OpenSerialPort(PORTA, VELOCITA, IO.Ports.Parity.None, 8, 1)
' VELOCITA=115200, SETTABILE DALL'UTENTE
com1.Write(COMANDO & vbCrLf)
' a questo punto, sulla porta arrivano i byte della risposta
com1.DtrEnable = True 'questo perchè se metto a true il pin DTR prima di scrivere il comando...
Wait_MS(100) ' ... il vecchio MC35 non risponde più
com1.DtrEnable = False '
WAIT_MS(500) 'routine che attende 500 millisecondi
While com1.BytesToRead > 0
RISPOSTA= com1.ReadExisting
Wait_MS(500)
End While
com1.Dispose
Catch ex as Exception
[...] ' Codice che gestisce le eccezioni
End Try
SCRIVI_COMANDO = RISPOSTA
End Function
I problemi inziano quando questa funzione viene chiamata ripetutamente perchè devo eseguire delle sequenze di comandi (ad esempio: inviare un SMS): dopo 2-3 comandi iniziano a generarsi eccezioni tipo "a device attached to the port is not functioning" oppure "Port COM4 does not exist".
In questi casi, dopo circa 10-15 secondi, il modem comunica "^SYSSTART" e risponde al primo comando, dopodiché la sequenza ricomincia. Altre volte, invece, la porta COM4 (USB) non viene più elencata tra quelle disponibili finché non spengo e riaccendo il terminale.
Domanda 1: Dove sbaglio?
Domanda 2: C'è un modo per capire che il terminale non è pronto a ricevere il comando successivo?
A complicare ulteriormente le cose c'è il fatto che il cliente vorrebbe usare un hub USB autoalimentato per comandare 4 modem di questo tipo (per ora, però, sto provando un solo terminale, senza hub). Secondo voi cosa dovrei aspettarmi?
Ogni suggerimento è il benvenuto...
Grazie in anticipo,
MAx