11. juli 2002 - 20:20Der er
8 kommentarer og 1 løsning
Snakke med GSM modem over seriel port
Jeg ved mit spørgsmål tager udgangspunkt i Perl, men naturen af spørgsmålet kunne ligeså godt have været et andet programmeringssprog - derfor under denne kategori.
Hej Eksperter,
Jeg har et GSM modem koblet til min PC via seriel porten. Jeg vil så gerne have et Perl script til at sende SMSer via det modem.
Jeg kan godt få det til at virke gennem Hyperterminalen ( kører på en windows NT maskine ). Ved hyperterminalen gør jeg følgende:
1: Opretter forbindelse til GSM modemet 2: Skriver AT+CMGF = 1 [trykker enter] 3: Modemet svarer "OK" 4: Skriver AT+CMGS = "+45********" (hvor stjernene er mobilnummeret) [trykker enter] 5: Modemet svarer med en ny linie der starter med et større-end tegn > 6: Ved større end tegnet skriver jeg min besked og afslutter med at trykke CTRL-Z 7: Modemet svarer "OK" 8: Beskeden dukker op på mobiltelefonen
Jeg vil nu gerne gøre det samme via. et perlscript ved brug af Win32::SerialPort. Mit script ser indtil videre således ud (telefonnummer igen udskiftet med stjerner) Har tilføjet linienumre for at kunne kommentere senere: *********************************************** 1: use Win32::SerialPort;
2: $ob = Win32::SerialPort->new ('COM1'); 3: die "Can't open serial port $port: $^E\n" unless ($ob);
11: sub getInput(){ 12: my $input; 13: do{ 14: sleep 1; 15: $input = $ob->input; 16: } until( $input ne "" ); 17: return $input; 18: } *********************************************** Når jeg kører scriptet får jeg følgende output:
AT+CMGF = 1... OK AT+CMGS = "45********"... >
Jeg er nu kommet så langt som punkt 5 i hyperterminalbeskrivelsen ovenfor, men her sidder jeg fast. Hvordan svarer jeg igen på > tegnet?
Jeg har prøvet at give hele kommandoen med sammen med telefonnummeret sådan her: 8: $ob->write('AT+CMGS = "+45******"' . chr(13) . 'her er min besked' . chr(26) );
Dette giver et "ERROR" svar fra modemet ved linie 9
Jeg har også prøvet at tilføje flgn. efter linie 9: $ob->write('her er min besked' . chr(26)); print getInput();
Her går programmet i undelig løkke da der aldrig kommer det forventede "OK" svar tilbage fra modemet.
Jeg har dyrket samme sport som det, du prøver på (afsendelse af SMS'er gennem seriel port forbundet til et GSM modem). Min erfaring er, at efter afsendelse af
AT+CMGS="45********"<cr>
er det nødvendigt at vente ganske kort før GSM modemet er klar til at modtage den egentlige besked-tekst. Principielt bør programmet nok vente, indtil tegnet ">" er modtaget før besked-teksten afsendes - det afhænger dog af kommunikationsmulighederne, hvad der er praktisk muligt. Et af problemerne er, at ">" fra GSM modemet ikke efterfølges af <cr> (carriage return, chr(13)), dette kræver at man er i stand til at læse tegn fra den serielle port eet ad gangen (jeg ved her ikke hvad Perl's Win32::SerialPort tilbyder).
I en fungerende implementation har jeg primitivt valgt følgende:
send AT+CMGS="45********"<cr> vent 0.2 sekunder send 'besked' afsluttet med <CTRL/Z> afvent "OK" fra GSM modem
Jeg har ikke afprøvet det endnu, men ud fra din implementation kan jeg se hvordan/hvornår jeg skal sende beskeden med ctrl-z. Nu når jeg ved hvordan, skulle det jo ikke være det store problem :)
Hmm, det driller stadigvæk. Hvilke sprog har du lavet det i før? Det behøves strengt taget ikke være perl, jeg skal bare have noget der virker. Har eksperimenteret lidt med MSComm i Visual Basic, men også uden held.
Har du evt. en kodestump eller noget fra et andet sprog?
Den implementation, jeg skrev om er lavet i FORTRAN under VMS. Jeg tvivler stærkt på, at du ved at se koden får mere at vide, end jeg allerede skrev ovenfor. Hvad er det for problemer, du stadig har?
AT+GMGS="+45********"<cr> venter 1 sekund får svar > sender: 'her er min besked'<ctrl-z>
men det er som om der ikke sker noget her. Nogle gange efter at have udført ovenstående, får jeg en popup i windows hvor der står at Falcom modemet ikke svarer korrekt.
Hvilket modul/objekt/kontrol bruger du til kommunikationen? Windows bør overhovedet ikke interessere sig for, hvad det er, du sender frem og tilbage på COM-porten, så hvorfor kommer der en Windows-fejludskrift?
Noget andet: Modtager du rent faktisk SMS'en på den telefon, du sender den til?
Det lyder for mig som om, der er et installeret program, som slås med dit program om adgangen til COM-porten. Hvis du ønsker med dit eget program at lave kommunikation med GSM-modemet på det niveau, du har skitseret ovenfor, må der ikke være andre programmer, der blander sig, heller ikke nogle, du fik sammen med GSM-modemet.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.