Weitere Initialisierungsbefehle beim Modem.

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Weitere Initialisierungsbefehle beim Modem.

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Weitere Initialisierungsbefehle beim Modem.

Beitrag von Kurzer »

Ich glaube mich dunkel daran zu erinnern, daß das ^M ist.
(Alle Angaben ohen Gewähr) :roll:
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.12 x64, OS: Win 11 24H2 x64, Desktopscaling: 150%, CPU: I7 12700 H, RAM: 32 GB, GPU: Intel(R) Iris(R) Xe Graphics | NVIDIA GeForce RTX 3070
Useralter in 2025: 57 Jahre.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Weitere Initialisierungsbefehle beim Modem.

Beitrag von DarkDragon »

Hmm scheint nicht zu funktionieren. Aber vielleicht liegts doch an etwas anderem, weil ich nichtmal den ersten Befehl in dem Modemlog finde.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Re: Weitere Initialisierungsbefehle beim Modem.

Beitrag von Rokur »

Kann man das nicht hintereinander eingeben? Evtl. mit einem Komma dazwischen (1 Sek. warten pro Komma)
WinXP 32 Bit, PureBasic 4.40 (x86)
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Weitere Initialisierungsbefehle beim Modem.

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Re: Weitere Initialisierungsbefehle beim Modem.

Beitrag von Kaeru Gaman »

"at+"?
ist das sicher?

für mich klingt das, als solle es "@cpin" bedeuten...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Weitere Initialisierungsbefehle beim Modem.

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
7x7
Beiträge: 591
Registriert: 14.08.2007 15:41
Computerausstattung: ganz toll
Wohnort: Lelbach

Re: Weitere Initialisierungsbefehle beim Modem.

Beitrag 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)
- alles was ich hier im Forum sage/schreibe ist lediglich meine Meinung und keine Tatsachenbehauptung
- unkommentierter Quellcode = unqualifizierter Müll
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Re: Weitere Initialisierungsbefehle beim Modem.

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Antworten