Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » C-Code für Serielle Schnittstelle in VC++ umwandeln

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
04.10.2004, 22:22 Uhr
vision



Hallo,

ich habe den Quellcode für ein DOS-Programm geschrieben in C.
Nun möchte ich, das Programm in VC++/MFC neu schreiben, damit es unter Windows XP und Win 2000 läuft.

Zur Funktionsweise: vom Benutzer wird eine Zahlen-/Buchstabenkombination eingegeben, im Programm in einen String umgewandelt, über die serielle Schnittstelle an ein externes Gerät ausgegeben, dort mit einem Algorithmus in einen mehrstelligen Zahlenwert umgewandelt.
Dieser wird vom Programm über die serielle Schnittstelle wieder empfangen und dem Benutzer angezeigt.

Um Ursprungscode wurden noch die Befehle inp und outp verwendet, die direkt auf die Schnittstellenadressen zugreifen, was aber bei Windows XP und 2000 nicht mehr möglich ist.

Ich habe zur Initialisierung der Schnittstelle (Baudrate, Anzahl Datenbits,..) Funktionen aus der Klasse CSerialPort (mit den Dateien "serialport.h" bzw. "serialport.cpp") benutzt.
Quelle siehe hier: www.codeproject.com/system/cserialport.asp

Was mir bei der Übersetzung am meisten zu schaffen macht, sind die folgenden Funktionen TXBE und RDA, bei denen bestimmte Bits des Buffers abgefragt werden.

Gibt es da auch bestimmte Funktionen, die auch die Klasse CSerialPort anbietet?

Ich verstehe auch leider nicht, was (bzw. wo) genau diese Bits zu finden sind.
Sind das sind das bestimmte Register des UART?

Beginnen tut das Ganze mit der Funktion in dem der String *outstr an diese Funktion übergeben wird. Und später wird das Ganze mit der Funktion recv als *inpstr wieder gelesen.


C++:

int TXBE ( int PortBase )               /* Transmit Buffer Empty */
  {
   return(inp(PortBase+5) & 0x20);      /* Teste bit 5 - Senderegister leer? */
  }


int RDA ( int PortBase )                /* Received Data Available */
  {
   return(inp(PortBase+5) & 0x01);      /* Teste bit 0 - Empfangsdaten gültig? */
  }


void txch( char outchar )       /* Daten senden */
  {
   int value;
  
   while (!TXBE(PortBase))
    { }                        
   value = outp(PortBase,outchar);
   value = value;                /* Dummy-Statement for Compiler-Errors */
  }


int rxch( int timeoutval, int PortBase )  /* Daten empfangen  */
  {
   do
     {
      if (RDA(PortBase))
    {
     return(inp(PortBase));         /* char received OK   */
    }
     } while (timeoutval-- != 0);
   return( -1 );                                /* time out  */
  }


void send ( char *outstr )
{    
   while ( *outstr != '\0' )
     {
      txch(*outstr++);
     }
  }


int recv ( char *inpstr, int maxlen, int PortBase )
  {
   char ch1;
   int count;
   count = 0;
   do
     {
      ch1 = rxch((int)65000,PortBase);
      if (ch1 == -1)
    {
     *inpstr = '\0';
     return ( 0 );
    }
      *inpstr++ = ch1;
     } while ((ch1 != CR) && (count++ <= maxlen));  // CR= Ascii 13 als letztes Zeichen im String
   *inpstr = '\0';
   return ( count );
  }




Ist vielleicht jemand in der Lage, die kompletten Teile zu übersetzen?
Ich kenne mich leider nicht so sehr mit der Schnittstellen-Kommunikation aus und bin auch erst seit Kurzem bei VC++.

Danke schonmal für eventuelle Hilfe

Dieser Post wurde am 04.10.2004 um 22:58 Uhr von vision editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
04.10.2004, 22:28 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


such mal im forum nach WriteFile ReadFile CreatFile COM1
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
04.10.2004, 23:06 Uhr
vision



Danke Windalf,

ich habe jetzt auch schon etwas mehr Durchblick.

Meine o.g. Funktionen TXBE und RDA beziehen sich auf das LSR (Line Status Register) bit 0 und 5.

Aber über welche Funktion bei CSerialPort kann ich diese Bits abfragen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
04.10.2004, 23:11 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


tut mir leid weiss ich auch spontan nicht.. Ich glaub ao udn Spacelord sind da ziemlich Profies... an sonsten mal in der MSDN blättern... Viele befehle findest du unter SetComm... und GetComm...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.10.2004, 07:27 Uhr
proga



Hallo vision. Ich verstehe nicht ganz was das Problem ist, wofür brauchst du denn diese ganzen Funktionen? du willst doch nur einen String verschicken und einen anderen empfangen, oder?

also, z.B. mit


C++:

// Initialize the COM device
m_COMPort.Open(
    1,                            // COM interface
    9600,                         // baud rate
    CSerialPort::NoParity,    // parity
    8,                            // data bits
    CSerialPort::OneStopBit,      // stop bits
    CSerialPort::NoFlowControl);  // flow control



die Schnittstelle öffnen
und jetzt mit


C++:
char buffer = new char[100];
// string einlesen
int nBytes;
m_COMPort.Write(&buffer, strlen(buffer));



Einen String versenden
bzw. mit


C++:
char buffer = new char[100];
int nBytesReceived = 0;
nBytesReceived = m_COMPort.Read(&buffer, sizeof(buffer));



einen String empfangen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.10.2004, 08:54 Uhr
ao

(Operator)



Zitat von vision:
Meine o.g. Funktionen TXBE und RDA beziehen sich auf das LSR (Line Status Register) bit 0 und 5.

Aber über welche Funktion bei CSerialPort kann ich diese Bits abfragen?

Mit diesem ganzen Lowest-Level-Kram willst du dich nicht wirklich rumschlagen, und Microsoft sei Dank ( :-) ) brauchst du das auch nicht, das ist alles schon in High-Level-Funktionen eingepackt.

Mit CreateFile die Schnittstelle öffnen, mit WriteFile Daten verschicken, mit ReadFile lesen. Oder mit deiner Codeproject-Klasse, die sowieso alles viel schöner kann.

Beispiele gibts zuhauf in diesem Forum (Suchfunktion!) und im Rest des Internets.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: