Hallo

Dit is een programma voor een elektrische poort met een tag reader, aangesloten via rs232/rs485 op de pc com poort.
Kunnen jullie zien wat er fout gaat in het programma?

vriendelijke groet,

#include <cstdlib>
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string>
#include <windows.h>
//#include <fstream>

using namespace std;
HANDLE hCom=INVALID_HANDLE_VALUE;
COMMTIMEOUTS timeouts = {1000,1000,1000,1000,1000}; //set Timeouts, 1000ms

int main(int argc, char *argv[])
{
    DCB dcb;
    DWORD dwEventMask;
    BOOL fSuccess;
    char driver[10];
    char driver_akt;
    SYSTEMTIME time;
    
    hCom = CreateFile( "COM1",

    GENERIC_READ | GENERIC_WRITE,

    0,    // comm devices must be opened w/exclusive-access

    NULL, // no security attributes

    OPEN_EXISTING, // comm devices must use OPEN_EXISTING

    0,    // not overlapped I/O

    NULL  // hTemplate must be NULL for comm devices

    );
    
    //COM-Port configuration 

    dcb.fBinary = TRUE;

    dcb.Parity = TRUE; // parity

    dcb.fOutxCtsFlow = FALSE; 

    dcb.fOutxDsrFlow = FALSE;

    dcb.fDtrControl = DTR_CONTROL_DISABLE;

    dcb.fDsrSensitivity = FALSE;

    dcb.fTXContinueOnXoff = FALSE;

    dcb.BaudRate = 9600; // baud=9600 bps

    dcb.ByteSize = 8; //8 data bits

    dcb.fOutX = FALSE;

    dcb.fInX = FALSE;

    dcb.fErrorChar = FALSE;

    dcb.fNull = FALSE;

    dcb.fRtsControl = RTS_CONTROL_DISABLE;

    dcb.fAbortOnError = FALSE;

    dcb.StopBits = ONESTOPBIT; //1 stop bit
    
    SetupComm(hCom,256,10);
    SetCommState (hCom, &dcb);    // COM-Einstellungen speichern
    
    if(!SetCommMask(hCom, EV_RXCHAR ))
    printf ("fehler SetCommmMask");
    if(WaitCommEvent(hCom, &dwEventMask, NULL))
    {
     char Byte=0;
     DWORD dwBytesRecieved;
     DWORD dwWritten;
     char zeichen;
     zeichen = 255;
       
     do{     
      // Bei Kontakt mit Tag wird immer gleiche Byte-Reihenfolge übertragen
      // erstes Byte prüfen 0x07              
      ReadFile (hCom,&Byte,sizeof (Byte), &dwBytesRecieved, NULL);                      
      if (Byte == 7)
      {
      ReadFile (hCom,&Byte,sizeof (Byte), &dwBytesRecieved, NULL);
      // zweites Byte prüfen 0xFF
      if (Byte == -1)
         Byte=0;
         ReadFile (hCom,&Byte,sizeof (Byte), &dwBytesRecieved, NULL);
         // drittes Byte prüfen 0xFF
         if (Byte == -1)
         {
            // Puffer (Fahrernummer) auslesen und in Array speichern (char)    
            do{
                  for (int i=0;i<6;i++){
                   ReadFile (hCom,&Byte,sizeof (Byte), &dwBytesRecieved, NULL);
                   driver[i]=Byte;  
                   // Anzeige in DOS-Fenster
                   //printf("%d", Byte);
                   }
                // Schleife bis Ende-Byte 0xFF
               }while(Byte == -1);
               // neue Zeile bei Bildschirmausgabe
               printf("\n");
               // pointer für Datei
               FILE* datei;
               //fstream datei;
                  // wenn Datei nicht vorhanden, Fehler ausgeben -> Programm beenden   
                  if ((datei = fopen("Chauffeur.txt", "r+")) ==NULL){
                        printf("Error opening file\n");
                        exit(1); 
                  }
                  // Zeiger am Ende der Datei positionieren
                  fseek(datei, 0, SEEK_END);
                  fprintf(datei,"Chauffeur: ");
                  printf("Chauffeur: ");
                  //datei.open("Fahrer.txt", ios::out);
                  // Fahrernummer in Ascii-zeichen umwandeln
                   for (int i=0;i<6;i++){
                   driver_akt = driver[i];
                   switch (driver_akt)
                   {
                          case 48: driver_akt = 0;
                          break;
                          case 49: driver_akt = 1;
                          break;
                          case 50: driver_akt = 2;
                          break;
                          case 51: driver_akt = 3;
                          break;
                          case 52: driver_akt = 4;
                          break;
                          case 53: driver_akt = 5;
                          break;
                          case 54: driver_akt = 6;
                          break;
                          case 55: driver_akt = 7;
                          break;
                          case 56: driver_akt = 8;
                          break;
                          case 57: driver_akt = 9;
                          break;
                   }
                   
                   // Nummer in Datei schreiben
                   fseek(datei, 0, SEEK_END);
                   fprintf(datei, "%i", driver_akt);
                   printf("%i", driver_akt);
                   //datei << driver_akt;
                   }
                   GetLocalTime (&time);
                   fseek(datei, 0, SEEK_END);
                   // Datum und Uhrzeit an Datensatz hängen
                   fprintf(datei,"    Tijd: %02d:%02d    Datum: %04d.%02d.%02d\n", time.wHour, time.wMinute,
                    time.wYear, time.wMonth, time.wDay);
                    printf("    Tijd: %02d:%02d    Datum: %04d.%02d.%02d", time.wHour, time.wMinute,
                    time.wYear, time.wMonth, time.wDay);
                   //datei
                   // Datei schliessen
                   fclose(datei); 
                   // Sende ok zurück, dass Daten empfangen und geschrieben wurden 0xAA 
                   WriteFile(hCom, &zeichen,sizeof(zeichen), &dwWritten ,0);
           }
           
         }         
       // Programm beenden, wenn keine Zeichen über RS232 übertragen werden     
      }while (dwBytesRecieved > 0);
      
      }
      
    system("PAUSE");
    return EXIT_SUCCESS;

[Bericht gewijzigd door GJ_ op (0%)]

Plaats uw code eens tussen codetags, dan is het veel leesbaarder.

En wat is het probleem ?

de tag's zouden geleest moeten worden uit een bestaand lijst met nummers. Daarna geeft de pc via de com poort naar de rs232/rs485 converter een Tx door om de poort te openen

Als het nummer voor komt in de lijst geeft hij goed keuring en stuurt de poort open

[Bericht gewijzigd door Henry S. op (20%)]

Dus het werkt wel? Of werkt het nou niet?
Beetje meer info aub. Een plak code dumpen zonder erbij te melden wat er niet werkt/mis gaat...

Nee het werkt dus niet;)
Ik ben niet zo thuis in het programmeren enz, heb geen idee wat die code's betekenen. Ik kan dus niet vinden waar het mis gaat.

Door middel van een COM tester zie ik wel de code's van de tag reader binnen komen. Ook het TX signaal van uit de pc werkt en komt binnen om mijn converter. Kan ik op een of andere manier monitoren oid? Om te kijken waar het probleem zit?

Dus: Tagreader->rs232/rs485 converter naar COM-> PC

Dit is niet best :-)
Heb je een debugger? Programma verwacht op COM1 te lezen: 0x07, 0xFF en 0xFF en verwacht op COM1 dan een reeks van 6 bytes (tag IDs?) welke met 0xFF afgesloten wordt en in array "driver" geschreven wordt, van deze 6 bytes wordt later iets in de reeks 48 t/m 57 verwacht. Vervolgens wordt er een (log?) file Chauffeur.txt geopend in read-appand mode en wordt er over deze 6 bytes geloopt en via een switch omgezet (er wordt 48 afgetrokken mits de waarde in de reeks 48 t/m 57 zit) en variabele driver_akt geset. Aan het eind van de loop heeft variabele driver_akt altijd waarde 0xFF (laatste byte gelezen van COM1) en deze waarde wordt naar de log file geschreven, vervolgens wordt er een timestamp geschreven. Mits dit allemaal werkt schrijft het programma 0xFF naar COM1 (om de poort te openen?) en als ik het Duitse commentaar lees moet dat 0xAA zijn. Ergo, de gelezen tag IDs worden niet geschecked en als er maar 6 bytes gelezen kunnen worden wordt er 0xFF naar de poort gestuurd.

Veel plezier :-D

Ahaa, er wordt me al wat meer duidelijk! Ik denk zelf niet dat het in het programma zit ivm dat dit al bestaand is en hier niks aan verandert is.

Zou het kunnen dat de configuratie van de poort verkeerd staat?

Weet iemand een debugger tool te downloaden?

Bedankt voor jullie antwoorden!

Gebruik je wel de bijbehorende tags? (met andere types gaat 't niet werken)
Probeer het anders eens met hyperterminal o.i.d., dan weet je dat de reader werkt...

Laat dit programma zich wel compileren?

ik zie de constante: dwBytesRecieved
'Receive' schrijf je met 'ei'
Maar het zou natuurlijk zo kunnen zijn dat degene die deze structure heeft bedacht de engelse taal niet beheerst.

EDIT: Ik zie dat het in het programma is gedeclareerd, never mind :-)

De PC waarop het programma draait heeft een ander domein gekregen. Dan gaan geloof ik, de instellingen naar een basis stand? sinsdien werkt het programma niet meer..

Domain heeft niets met COM poort instellingen te maken.

Als je geen debugger ter beschikking hebt dan kun je met een kleine aanpassing in het programma de gegevens die je inleest van de compoort naar een logbestand sturen:


// toevoegen voor "int main(..."
FILE *log; 
void logbyte( char Byte ) {
    if( (log =fopen("commdata.log","r+" )) != NULL ) {
        fseek( log, 0, SEEK_END );
        fprintf( log, "%c", Byte );
        fclose(log);
    } else if( (log =fopen("commdata.log","w" )) != NULL ) {
        fprintf( log, "%c", Byte ); // bin
        // fprintf( log, "%d ", Byte ); // dec
        // fprintf( log, "%02X ", Byte ); // hex
        fclose(log);
    }
}


// toevoegen na iedere "ReadFile (hCom,..."
if( dwBytesRecieved ) {
    logbyte( Byte );
}

Debuggen is niet nodig lijkt me; volgens TS heeft dit programma voorheen gewoon gewerkt...

Het programma zal beslist gewerkt hebben, maar misschien is er nog iets anders veranderd dan het domein.

Is het verkeerd om te weten wat er wordt gelezen.

Nee, da's altijd handig... ;)
Daarom raadde ik ook aan om Hyperterminal er eens aan te hangen...

Probleem is opgelost! Er moest nog een programma geïnstalleerd worden. Een serial com terinal oid... Geen idee ;). Helaas ben ik er niet achter wat nou daadwerkelijk het probleem was. Iig super bedankt voor jullie informatie en hulp. Ik ben wel geïnteresseerd geworden in het programmeer wereldje.

in je eerste post vraag je of iemand ziet wat het probleem, en nu blijkt dat het programma ervoor gewoon al werkte en was er een verandere gebeurd op de pc?
ik vermoed niet zozeer dat die in een ander domein werd geplaats, maar dat de pc gewoon vervangen werd.

bij een goeie probleemomschrijving, had je veel sneller het probleem kunnen vinden (hier nu zouden we vragen je compoort na te kijken en niet zozeer in de programma code duiken. gelukkig is er maar een dag over gegaan, maar voor hetzelfde zaten we hier een week te debuggen

[Bericht gewijzigd door fcapri op (35%)]

Fijn dat het werkt,...
Nu maar hopen dat de (waarschijnlijk duitse)rechtmatige eigenaar van de software ermee instemt dat het hier gepubliceerd is wanneer ie dit topic voorbij ziet komen...
http://www.juridische-supermarkt.nl/publicaties/thema-intellectuele-ei…

Dit is ook voor de juridische eigenaar van CO om over na tedenken.