• 21.08.2025, 21:10
  • Registrieren
  • Anmelden
  • Sie sind nicht angemeldet.

 

Smoern

Senior Member

Com Port ständig abfragen

Freitag, 30. April 2004, 12:49

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

Freitag, 30. April 2004, 14:17

Hi

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

Quellcode

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

Freitag, 30. April 2004, 19:21

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?

Quellcode

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

Freitag, 30. April 2004, 19:52

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

Freitag, 30. April 2004, 20:00

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

Freitag, 30. April 2004, 20:07

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

Freitag, 30. April 2004, 23:56

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

Montag, 3. Mai 2004, 15:20

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.

Quellcode

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

Montag, 3. Mai 2004, 21:45

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

Dienstag, 4. Mai 2004, 17:52

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

Quellcode

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

Dienstag, 4. Mai 2004, 20:35

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

Mittwoch, 5. Mai 2004, 11:25

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

Mittwoch, 5. Mai 2004, 14:32

Dann inkludier besser mehr als zu wenig

Hier mal mein TasterausleseProgramm:

Quellcode

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;
}