• 22.08.2025, 12:48
  • Register
  • Login
  • You are not logged in.

 

Smoern

Senior Member

Com Port ständig abfragen

Friday, April 30th 2004, 12:49pm

Moin,

ich würde gern den COM1 dauerhaft abfragen. Sobald etwas ankommt soll der String dann weiterverarbeitet werden.
Wie kann ich das am besten lösen?
Sprache und OS sind frei wählbar. Wegen mir auch unter DOS ;)

Hoffe das mir jemand helfen kann

Gruss
Smoern

hurra

God

Re: Com Port ständig abfragen

Friday, April 30th 2004, 2:17pm

Hi

Ich hab 4 Taster am Comport angschlossen, OS is Linux:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
int fd = 0;
unsigned int status = 0;

fd = open(serial_device, O_RDWR | O_NOCTTY);
if (fd > 0)
{
ioctl(fd, TIOCMGET , &status);
            close(fd);
            if(status==16390)remote_key=0; //keine taster

            if(status==16646)remote_key=11; //taste 1 & 1            
            if(status==16710)remote_key=12; //taste 1 & 2
            if(status==16678)remote_key=13; //taste 1 & 3
            if(status==16774)remote_key=14; //taste 1 & 4

            if(status==16710)remote_key=21; //taste 2 & 1            
            if(status==16454)remote_key=22; //taste 2 & 2
            if(status==16486)remote_key=23; //taste 2 & 3
            if(status==16582)remote_key=24; //taste 2 & 4
            
            if(status==16678)remote_key=31; //taste 3 & 1
            if(status==16486)remote_key=32; //taste 3 & 2
            if(status==16422)remote_key=33; //taste 3 & 3
            if(status==16550)remote_key=34; //taste 3 & 4

            if(status==16774)remote_key=41; //taste 4 & 1            
            if(status==16582)remote_key=42; //taste 4 & 2
            if(status==16550)remote_key=43; //taste 4 & 3
            if(status==16518)remote_key=44; //taste 4 & 4
      }

Smoern

Senior Member

Re: Com Port ständig abfragen

Friday, April 30th 2004, 7:21pm

Das sieht doch cool aus!
Vom Prinzip her versteh ich sogar was da abgeht ;)

Zwei drei Zeilen sind mir aber unverständlich, kannste mir die bitte erklären?

Source code

1
2
ioctl(fd, TIOCMGET , &status); 
  close(fd);


Also mir ist nicht klar, was das ioctl genau macht. Bzw. wofür TIOCMGET steht. Warum das close(fd)?

Wie lang überprüft das Prog denn COM1? Doch solange bis fd einen Wert grösser als 0 an nimmt, oder? Dann wird die if Schleife durchlaufen und danach beendet sich das Prog.

Danke schon mal im Voraus!

Gruss
Smoern

hurra

God

Re: Com Port ständig abfragen

Friday, April 30th 2004, 7:52pm

Hi

close(fd) , schließt die geöffnete "Datei" ;D wieder
So wie ich es verstanden habe überträgt ioctl, den Status vom Comport in die Variable status.

fd is im normalfall >0, nur wenn halt linux den comport nicht önnen kann. (zB wegen fehlender rechte)

Dieser Codeauszug überprüft einmal den Comport, wenn du sowas dauerhaft machen willst , packst ihn halt in eine eigen Funktion, und die dann in eine schöne Schleife.

Cu Hurra

Smoern

Senior Member

Re: Com Port ständig abfragen

Friday, April 30th 2004, 8:00pm

Alles klar!
Haste evtl. noch ne ahnung wie gross der String sein darf, der in status reinpasst?

hurra

God

Re: Com Port ständig abfragen

Friday, April 30th 2004, 8:07pm

Ich weiß nicht, wie du strings auslesen willst. ???

Wie gesagt, ich hab da Taster angeschlossen und es funktioniert.

Schließte du da sowas wie ne Tastatur an??

Smoern

Senior Member

Re: Com Port ständig abfragen

Friday, April 30th 2004, 11:56pm

Sowas ähnliches...
N Terminal gibt mir ne Zeichenkette mit ca. 9 Zeichen zurück, wenn das Gerät das angeschlossen ist n Impuls bekommt. Sowas wie n Keyreader.

Smoern

Senior Member

Re: Com Port ständig abfragen

Monday, May 3rd 2004, 3:20pm

Moin,

hab mal probiert nach deinem Beispiel auf meinem Linux was gebacken zu bekommen. Aber als Shellscript wills nich wirklich laufen. Bin was Scripte angeht noch nich so fit. Please help.
Das Prog heisst vorläufig com. Unten stehen die Error Messages die ich krieg.

Source code

1
2
3
4
./com: line 7: int: command not found
./com: line 8: unsigned: command not found
./com: line 10: syntax error near unexpected token `('
./com: line 10: `fd = open(serial_device, 0_RDWR | 0_NOCTTY);'

hurra

God

Re: Com Port ständig abfragen

Monday, May 3rd 2004, 9:45pm

hi, es is kein shellscript sondern c ;)
also
gcc mainprgram.c -o mainprogramm
./meinprogramm

Cu Hurra

Smoern

Senior Member

Re: Com Port ständig abfragen

Tuesday, May 4th 2004, 5:52pm

So langsam komm ich mir was blöd vor ;D

Source code

1
2
3
4
5
6
7
8
9
com.c:7: error: parameter `fd' is initialized
com.c:8: error: parameter `status' is initialized
com.c:10: error: parse error before "fd"
com.c:8: error: declaration for parameter `status' but no such parameter
com.c:7: error: declaration for parameter `fd' but no such parameter
com.c:10: error: number of arguments doesn't match prototype
cc1: error: prototype declaration
com.c:10:26: invalid suffix "_RDWR" on integer constant
com.c:10:35: invalid suffix "_NOCTTY" on integer constant


Das ist das einzige was ich beim compilen sehe...
Bestimmt braucht das Prog noch n paar Header-Datein...
Hab nur keinen Plan welche...

hurra

God

Re: Com Port ständig abfragen

Tuesday, May 4th 2004, 8:35pm

Io, ein paar header und noch eine main-funktion.

Wirklich, wenn du keinen Plan vom Programieren hast, solltest du erstmal dies lernen. :D

C is echt ned schwer und für deine Zwcke wohl sowohl unter Windows als auch unter Linux am besten verwendbar.

Cu Hurra

Smoern

Senior Member

Re: Com Port ständig abfragen

Wednesday, May 5th 2004, 11:25am

Ich hab schon was Plan von C++, zumindest das was mir auf der Berufsschule beigebracht worden ist.
Ich kenn halt nur das Microsoft Visual C...
Wo von ich halt keinen Plan hab, ist woher ich weiss welche header-Dateien welche Funktionen bereitstellen und in wie fern sich C in Linux von dem Microsoft Kram unterscheidet.

hurra

God

Re: Com Port ständig abfragen

Wednesday, May 5th 2004, 2:32pm

Dann inkludier besser mehr als zu wenig

Hier mal mein TasterausleseProgramm:

Source code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <ctype.h>
#include <errno.h>
#include <termio.h>
static char serial_device[128] = "/dev/ttyS0";
static int get_remote_key()
{
      int remote_key = 0;
      int fd = 0;
      unsigned int status = 0;

      fd = open(serial_device, O_RDWR &#124; O_NOCTTY);
      if (fd > 0)
      {
            ioctl(fd, TIOCMGET , &status);
            close(fd);
            if           (status & TIOCM_CD  && !(status & TIOCM_DSR &#124;&#124; status & TIOCM_CTS &#124;&#124; status & TIOCM_RI))  remote_key = 1;
            else if      (status & TIOCM_DSR && !(status & TIOCM_CD  &#124;&#124; status & TIOCM_CTS &#124;&#124; status & TIOCM_RI))  remote_key = 2;
            else if      (status & TIOCM_CTS && !(status & TIOCM_CD  &#124;&#124; status & TIOCM_DSR &#124;&#124; status & TIOCM_RI))  remote_key = 3;
            else if      (status & TIOCM_RI  && !(status & TIOCM_CD  &#124;&#124; status & TIOCM_DSR &#124;&#124; status & TIOCM_CTS)) remote_key = 4;
      }
      else
            remote_key = -1;
      return remote_key;
}


int main()
{
      printf("Hallo zu hurras kleinem Tasterchen-Prograemmchen\n");
      for(;;)
      {
            usleep(3000);
            printf("%d\n",get_remote_key());
      }
      printf("bye\n");
      return 0;
}