Avatar billede yellow Nybegynder
11. juli 2002 - 20:20 Der 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);


4:  print 'AT+CMGF = 1...';
5:  $ob->write('AT+CMGF = 1' . chr(13));
6:  print getInput();
7:  print 'AT+CMGS = "+45********"...';
8:  $ob->write('AT+CMGS = "+45******"' . chr(13));
9:  print getInput();
10: undef $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.



Nogen der kan hjælpe?

PFT
/Yellow
Avatar billede jespernaur Nybegynder
12. juli 2002 - 00:25 #1
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

Mvh
Jesper Naur
Avatar billede yellow Nybegynder
12. juli 2002 - 04:01 #2
Takker,

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 :)
Avatar billede yellow Nybegynder
12. juli 2002 - 10:20 #3
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?
Avatar billede jespernaur Nybegynder
12. juli 2002 - 11:01 #4
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?
Avatar billede yellow Nybegynder
12. juli 2002 - 11:14 #5
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.
Avatar billede jespernaur Nybegynder
12. juli 2002 - 11:34 #6
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?
Avatar billede yellow Nybegynder
12. juli 2002 - 11:44 #7
Den der kommer med popup-fejlen, er en utility "Falcom GSM modem". Jeg kan styre modemet derfra ( indtaste pinkode etc. ).

Jeg modtager ikke SMSen på telefonen
Avatar billede jespernaur Nybegynder
12. juli 2002 - 13:46 #8
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.
Avatar billede drukkenbolden Nybegynder
06. januar 2005 - 12:12 #9
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester