Seite 1 von 1

Weitere Initialisierungsbefehle beim Modem.

Verfasst: 22.09.2009 09:14
von DarkDragon
Hallo,

Kann mir jemand sagen wie man hier ein CRLF einfügt:
Bild

Ich muss nämlich zuerst
at+cpin="..."
ausführen und dann
at+cgdcont=1,"ip","pinternet.interkom.de"
:angry: Aber das hat ja nur eine Zeile.

Re: Weitere Initialisierungsbefehle beim Modem.

Verfasst: 22.09.2009 09:25
von Kurzer
Ich glaube mich dunkel daran zu erinnern, daß das ^M ist.
(Alle Angaben ohen Gewähr) :roll:

Re: Weitere Initialisierungsbefehle beim Modem.

Verfasst: 22.09.2009 09:36
von DarkDragon
Hmm scheint nicht zu funktionieren. Aber vielleicht liegts doch an etwas anderem, weil ich nichtmal den ersten Befehl in dem Modemlog finde.

Re: Weitere Initialisierungsbefehle beim Modem.

Verfasst: 22.09.2009 09:39
von Rokur
Kann man das nicht hintereinander eingeben? Evtl. mit einem Komma dazwischen (1 Sek. warten pro Komma)

Re: Weitere Initialisierungsbefehle beim Modem.

Verfasst: 22.09.2009 09:54
von DarkDragon
Also im Modemlog steht keiner der Befehle drin. Auch mit Komma gehts nicht. Das blöde ist wohl, dass at+cpin zu spät gesendet wird bzw. garnicht, weil die Verbindung vorher schon abbricht.

Re: Weitere Initialisierungsbefehle beim Modem.

Verfasst: 22.09.2009 11:05
von Kaeru Gaman
"at+"?
ist das sicher?

für mich klingt das, als solle es "@cpin" bedeuten...

Re: Weitere Initialisierungsbefehle beim Modem.

Verfasst: 22.09.2009 11:07
von DarkDragon
Kaeru Gaman hat geschrieben:"at+"?
ist das sicher?

für mich klingt das, als solle es "@cpin" bedeuten...
Der Befehl gehört zum erweiterten Hayes AT Befehlssatz
http://de.wikipedia.org/wiki/AT-Befehlssatz

Jeder Befehl beginnt mit AT auch wenn man das AT in dem Eingabefeld weglassen kann laut msdn (Dort steht aber auch kein Trennzeichen).

Hier mal ein PureBasic Programm, nach dessen Ausführung die Verbindung durch das Modem funktioniert:

Code: Alles auswählen

Procedure WriteModemString(Port, Text.s)
  ProcedureReturn WriteSerialPortString(Port, Text, #PB_Ascii)
EndProcedure

Procedure.s ReadModemString(Port, Timeout)
  Protected StartTime
  Protected Result.s
  Protected Buffer.b
  Protected FoundCRLF
  
  Result = ""
  
  StartTime = ElapsedMilliseconds()
  Repeat
    If AvailableSerialPortInput(Port)
      BytesRead = ReadSerialPortData(Port, @Buffer, 1)
      Result + Chr(Buffer)
      StartTime = ElapsedMilliseconds()
      
      FoundCRLF = FindString(Result, #CRLF$, 1)
      If FoundCRLF
        Result = Left(Result, FoundCRLF - 1)
        Break
      EndIf
    EndIf
    
    If ElapsedMilliseconds() - StartTime > Timeout
      Break
    EndIf
  ForEver
  
  ProcedureReturn Result
EndProcedure

Procedure.s ModemCommand(Port, Text.s, Timeout)
  Protected Result.s
  
  WriteModemString(Port, Text)
  Result = ReadModemString(Port, Timeout)
  
  If Left(Text, Len(Result)) = Result
    Result = ReadModemString(Port, Timeout)
  EndIf
  
  Result = Trim(Right(Result, Len(Result) - FindString(Result, ":", 1)))
  
  ProcedureReturn Result
EndProcedure

Enumeration
  #MODEM_PIN_NO_STATUS_RECEIVED
  #MODEM_PIN_READY
  #MODEM_PIN_NEED_PIN
  #MODEM_PIN_NEED_PUK
  #MODEM_PIN_NO_SIMCARD
EndEnumeration

#MODEM_TIMEOUT = 1000

Procedure OpenModem(PortName.s, Bauds, Parity, DataBits, StopBits, HandshakeMode)
  Protected Port
  
  Port = OpenSerialPort(#PB_Any, PortName, Bauds, Parity, DataBits, StopBits, HandshakeMode, 1024, 1024)
  
  If IsSerialPort(Port) And Port <> 0
    
    ModemCommand(Port, "ATZ" + #CRLF$, #MODEM_TIMEOUT)
    ModemCommand(Port, "ATE1" + #CRLF$, #MODEM_TIMEOUT)
    
    ProcedureReturn Port
  EndIf
  
  ProcedureReturn 0
EndProcedure

Procedure IsModem(Port)
  ProcedureReturn IsSerialPort(Port)
EndProcedure

Procedure CloseModem(Port)
  If IsSerialPort(Port) And Port <> 0
    ModemCommand(Port, "ATZ" + #CRLF$, #MODEM_TIMEOUT)
    ProcedureReturn CloseSerialPort(Port)
  EndIf
EndProcedure

Procedure ModemGetPINStatus(Port)
  Protected Text.s
  Protected Result
  
  Result = #MODEM_PIN_NO_STATUS_RECEIVED
  
  If IsSerialPort(Port)
    Text = UCase(ModemCommand(Port, "AT+CPIN?" + #CRLF$, #MODEM_TIMEOUT))
    
    Select Text
      Case "READY"
        Result = #MODEM_PIN_READY
      Case "SIM PIN"
        Result = #MODEM_PIN_NEED_PIN
      Case "SIM PUK"
        Result = #MODEM_PIN_NEED_PUK
      Case "ERROR"
        Result = #MODEM_PIN_NO_SIMCARD
    EndSelect
  EndIf
  
  ProcedureReturn Result
EndProcedure

Procedure ModemTryPIN(Port, PIN.s)
  Protected Text.s
  Protected Result
  
  Result = 0
  
  If IsSerialPort(Port)
    Text = UCase(ModemCommand(Port, "AT+CPIN=" + #DQUOTE$ + PIN + #DQUOTE$ + #CRLF$, #MODEM_TIMEOUT))
    If Text = "OK"
      Result = 1
    EndIf
  EndIf
  
  ProcedureReturn Result
EndProcedure

Procedure ModemTryPUK(Port, PUK.s, PIN.s)
  Protected Text.s
  Protected Result
  
  Result = 0
  
  If IsSerialPort(Port)
    Text = UCase(ModemCommand(Port, "AT+CPIN=" + #DQUOTE$ + PUK + #DQUOTE$ + "," + #DQUOTE$ + PIN + #DQUOTE$ + #CRLF$, #MODEM_TIMEOUT))
    If Text = "OK"
      Result = 1
    EndIf
  EndIf
  
  ProcedureReturn Result
EndProcedure

Define Port

Port = OpenModem("COM5", 921600, #PB_SerialPort_NoParity, 8, 1, #PB_SerialPort_NoHandshake)

If IsModem(Port)
  
  Select ModemGetPINStatus(Port)
    Case #MODEM_PIN_READY
      MessageRequester("Error", "PIN was already entered.")
    Case #MODEM_PIN_NEED_PIN
      PIN.s = InputRequester("PIN needed", "Input your pin here:", "")
      If PIN <> ""
        If Not ModemTryPIN(Port, PIN)
          MessageRequester("Error", "Wrong PIN")
        EndIf
      EndIf
    Case #MODEM_PIN_NEED_PUK
      PUK.s = InputRequester("PUK needed", "Input your puk here:", "")
      PIN.s = InputRequester("New PIN number", "Input your new pin number here:", "")
      If PUK <> ""
        If Not ModemTryPUK(Port, PUK, PIN)
          MessageRequester("Error", "Wrong PUK")
        EndIf
      EndIf
    Case #MODEM_PIN_NO_SIMCARD
      MessageRequester("Error", "No SIM-Card found.")
    Default
      MessageRequester("Error", "No Modem found.")
  EndSelect
  
  CloseModem(Port)
EndIf
Nur würde ich das gern irgendwie automatisieren und ich dachte durch eben jene Eingabezeile würde es Funktionieren.

Trotzdem danke für eure schnellen Antworten.

Re: Weitere Initialisierungsbefehle beim Modem.

Verfasst: 22.09.2009 15:54
von 7x7
DarkDragon hat geschrieben:... weil die Verbindung vorher schon abbricht.
Wenn ich mich recht erinnere an meine Probleme mit den Modems damals vor gefühlten 150 Jahren, dann meine ich war es oft notwendig, den Befehl "Warten auf Freizeichen" zu setzen (der entsprechende AT-Befehl weiss ich jetzt nicht mehr)

Re: Weitere Initialisierungsbefehle beim Modem.

Verfasst: 22.09.2009 16:25
von DarkDragon
7x7 hat geschrieben:
DarkDragon hat geschrieben:... weil die Verbindung vorher schon abbricht.
Wenn ich mich recht erinnere an meine Probleme mit den Modems damals vor gefühlten 150 Jahren, dann meine ich war es oft notwendig, den Befehl "Warten auf Freizeichen" zu setzen (der entsprechende AT-Befehl weiss ich jetzt nicht mehr)
Ich meinte eigentlich mehr den Verbindungsaufbau an sich bricht ab. Warten auf Freizeichen wäre eher direkt nach dem Verbindungsaufbau. Aber die Initialisierungsbefehle sollten bei mir schon vor allem kommen, bevor jeglicher Verbindungsbefehl gesendet wird.