Forum: PC-Programmierung c++ Problem beim Öffnen der COM Schittstelle RFID Reader


von Udo I. (stoui)


Lesenswert?

Hallo,

bin absoluter C++ Neuling und habe folgendes Problem. Ich habe einen
Phillips RFID Hitag Reader Modul HTRM800 und möchte es über die COM 
Schnittstelle ansprechen. Ich habe die den Orginal c source codes auf 
Diskette bekommen.
Zum öffnen der Com Schnittstelle ist folgende Funktion deklariert.

Hier ein Beispiel aus der Source Datei wie es funktionieren soll:
/*-BASIC--------------------------function 
header----------------------------
*
*       proloc_open (char *ComStr)
*                          opens the communication path between HOST and 
RWD,
*                          by programming the serial interface. Old 
interrupt
*                          and timer values are stored, to be restored 
at the
*                          end of a proloc-session by proloc_close().
*
*  (IN) char    *ComStr    This parameter defines the interface name.
*                          Only
*                             "COM1" and
*                             "COM2" are allowed.
*
*       return             EOK(0) is returned on success.
*                          ESERIELL(-1) is returned if it failed.
*
*       for     example:
*               :
*               :
*       if ( proloc_open( "COM1" )<0 )
*       {
*          printf( "open error" );
*          exit( 1 );
*       }
*               :
*               :
------------------------------------------------------------------------ 
---*/
int proloc_open (char *);

Ich kenne mich mit Pointern noch nicht richtig aus aber ich denke in 
meinen
Programm muss ich den Pointer vor dem Aufruf erst deklariern.


 int main()
  {
  char *Comstr="COM1";
  proloc_open(ComStr);

Ich stehe da momentan auf dem Schlauch. Die Funktion beginnt mit int,die
Variable ist aber char.
Wer kann mir da weiterhelfen

von XXX (Gast)


Lesenswert?

Du übergibst einen Zeiger auf character und bekommst
einen int zurück.

Gruß
Joachim

von Udo I. (stoui)


Lesenswert?

Hallo Joachim,

danke für die Antwort.

Bekomme aber die Fehlermeldung cannot convert int to char

char *ComStr= "COM1";
  int proloc_open(char *ComStr);

Ich denke mein Syntax ist falsch. Oder muss ich COM1 durch den 
Speicherbereich für COM1 ersetzen.

Hier nochmals die gesamte Funktion proloc_open ()
aus dem source code:
1
int proloc_open (char *ComStr)
2
{
3
   BYTE_T            IMR;
4
5
6
   strupr            (ComStr);
7
8
   //
9
   //              switch to standard bcc mode
10
   //
11
12
   BCCMode = 0;
13
14
   //
15
   //      - open serial port
16
   //      - init serial interrupt
17
   //
18
19
   if (strcmp (ComStr, "COM1") == 0)
20
   {
21
      Com = 0;
22
23
      //
24
      //      - init IMR - register
25
      //      - init interrupt routine
26
      //      - set read mode of rs485
27
      //
28
29
      IMR =  inportb (0x21);
30
      IMR |= 0x11;
31
32
      outportb (0x21, IMR);                   //  disable interrupt   //
33
      InitComPort ((BaseAddr = 0x3F0));
34
      old_com_isr = getvect (0x0C);
35
      setvect (0x0C, proloc_ComISR);
36
      old_timer_isr = getvect (0x08);
37
      setvect (0x08, proloc_TimerISR);
38
39
      IMR &= (~0x11);
40
41
      outportb (0x21, IMR);                   //  enable interrupt    //
42
      inportb (BaseAddr+READ_WRITE);          //  DUMMY - READ        //
43
44
      return (EOK);
45
      }
46
47
   if (strcmp (ComStr, "COM2") == 0)
48
   {
49
      Com = 1;
50
51
      //
52
      //              - init IMR - register
53
      //              - init interrupt routine
54
      //              - set read mode of rs485
55
      //
56
57
      IMR =  inportb (0x21);
58
      IMR |= 0x09;
59
60
      outportb (0x21, IMR);                   //  disable interrupt   //
61
      InitComPort ((BaseAddr = 0x2F0));
62
      old_com_isr = getvect (0x0B);
63
      setvect (0x0B, proloc_ComISR);
64
      old_timer_isr = getvect (0x08);
65
      setvect (0x08, proloc_TimerISR);
66
67
      IMR &= (~0x09);
68
69
      outportb (0x21, IMR);                   //  enable interrupt    //
70
      inportb (BaseAddr+READ_WRITE);          //  DUMMY - READ        //
71
72
      return (EOK);
73
   }
74
75
   return (ERR);
76
}

Laut readme sind nur COM1 oder COM2 als Werte erlaubt. Ich weiß aber 
nicht
wie ich Sie in meiner Anwendung richtig an die Funktion übergeben kann.
Ich kenne mich mit dem Syntax nicht richtig aus.

Gruß Udo

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

> Bekomme aber die Fehlermeldung cannot convert int to char
>
> char *ComStr= "COM1";
> int proloc_open(char *ComStr);

Dein Aufruf sollte z.B. so aussehen:
1
int Resultat;
2
3
Resultat = proloc_open("COM1");


Eine weitere Beschäftigung mit diesem Code ist allerdings nutzlos, weil 
das nur unter DOS funktioniert.

So etwas ist unter Betriebssystemen wie Windows oder Linux absolut 
unzulässig.

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Rufus Τ. Firefly schrieb:
> nur unter DOS funktioniert

Unter Win98s gehts auch noch ;)

von Udo I. (stoui)


Lesenswert?

Danke für die Info. Das die COM Schnittstelle unter unter 32 Bit 
Betriebssystemen aus Sicherheitsgründen nicht mehr direkt angesprochen 
werden kann wusste ich. Ich habe noch einen alten Rechner mit Windows 98 
und dem Borland C++ 4.5 Compiler mit dem ich eine einfache DOS Anwendung 
für
den Zugriff auf den Reader erstellen will.

Gruß Udo

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Läubi .. schrieb:
> Unter Win98s gehts auch noch ;)

Sicher? Das Ding da frickelt direkt am Interruptcontroller herum und 
versucht, eigene Interrupthandler zu installieren, das geht nur dann 
gut, wenn die VDM das wasserdicht abfängt.

Udo I. schrieb:
> Ich habe noch einen alten Rechner mit Windows 98
> und dem Borland C++ 4.5 Compiler mit dem ich eine einfache DOS Anwendung
> für den Zugriff auf den Reader erstellen will.

Wenn Du das tun willst, nur zu. Ist halt museales Wissen, das sich nicht 
sinnvoll andersweitig nutzen lässt.

von Udo I. (stoui)


Lesenswert?

O.K., du hast recht. Ist natürlich uraltes Zeug.

Ich möchte halt nicht alle Funktionen zur Kommunikation mit dem Reader 
neu schreiben. Ich denke einen Teil der Fuktionen kann man noch 
verwenden.
Wie kann ich die serielle Schnittstelle unter Linux/bzw  Windows 
ansprechen?

Gruß Udo

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Rufus Τ. Firefly schrieb:
> Sicher? Das Ding da frickelt direkt am Interruptcontroller herum

Puh... so genau hab ich mir das nicht angeschaut, manches lief auch nur 
wenn man im "MS-DOS Modus neustarten" wählte ;)

Udo I. schrieb:
> Wie kann ich die serielle Schnittstelle unter Linux/bzw
> Windows ansprechen?
Hat das Ding den eine "normale" RS-232 oder wird da die RS-232 nur als 
I/O mißbraucht? Ansonsten kannst du auch erst mal mit hTerm testen.

Udo I. schrieb:
> Ich möchte halt nicht alle Funktionen

Vermutlich sind diese garnicht so umfangreich und ein neuschreiben laut 
DB fixer gemacht als dieses "Beispiel" zu verstehen.

von nike (Gast)


Lesenswert?

Hi all,
I read about the issue with rfid r/w. I have the same problem. Someone 
have solved the problem with this programmer?

Tks in advance.

Nike

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.