www.mikrocontroller.net

Forum: PC-Programmierung ReadFile Problem


Autor: salre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich steuere eine Zugprüfmaschine mittels serieller Schnittstelle an.
Dazu habe ich ein kleines C++-Testprogramm geschrieben, um die 
notwendigen Befehle zu testen.
Wenn ich den Maschinenstatus abfrage, werden vier Ziffern 
zurückgesendet.
Bei allen anderen Befehlen wird nur eine Zahl bzw <ACK> zurückgesendet. 
Das Problem tritt nun auf, wenn ich zweimal hintereinander den 
Maschinenstatus abfragen will. Dann werden plötzlich nur drei oder nur 
zwei Zahlen zurückgesendet. Und bei späteren Befehlen antwortet die 
Maschine immer mit 0 statt mit <ACK>.
Wenn ich den Befehl nicht zweimal hintereinander sende, funktioniert die 
Kommunikation einwandfrei.

Hier der Code:

#include <windows.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <iostream>

int main (){


DCB sDcb;
HANDLE hFile;
COMMTIMEOUTS sTo;


hFile=CreateFile("\\\\.\\COM1",GENERIC_READ|GENERIC_WRITE,0,0,OPEN_EXIST 
ING,FILE_ATTRIBUTE_NORMAL,0)  ;
if(hFile==INVALID_HANDLE_VALUE)return 0;
memset(&sDcb,0,sizeof(sDcb));
sDcb.DCBlength = sizeof(sDcb);
sDcb.BaudRate = 9600; // Baudrate
sDcb.fParity = FALSE;
sDcb.fBinary = TRUE;
sDcb.Parity = NOPARITY;// Kein Paritybit
sDcb.StopBits = ONESTOPBIT;
sDcb.fOutxCtsFlow = FALSE;
sDcb.fOutxDsrFlow = FALSE;
sDcb.fDtrControl = DTR_CONTROL_ENABLE;
sDcb.fRtsControl = RTS_CONTROL_ENABLE;
sDcb.fDsrSensitivity = FALSE;
sDcb.fAbortOnError = FALSE;
sDcb.ByteSize = 8; // 8 Datenbits

if(!SetCommState(hFile,&sDcb))
{
CloseHandle(hFile);
return 0;
}

sTo.ReadIntervalTimeout = 10; // 0 ms Read-Tomeout
sTo.ReadTotalTimeoutMultiplier = 1;
sTo.ReadTotalTimeoutConstant = 10;
sTo.WriteTotalTimeoutMultiplier= 1; // 1*2 ms Write Timeout
sTo.WriteTotalTimeoutConstant = 10;

if(!SetCommTimeouts((HANDLE)hFile,&sTo))
{
CloseHandle(hFile);
return 0;
}
DWORD dwCount;
DWORD dwCount2;
DWORD dwCount3;
DWORD dwCount4;
DWORD dwCount5;
DWORD dwCount6;
DWORD dwCount7;
DWORD dwCount8;

char cData;
char cData2;
char cData3='\r';
char cData4[4];
char cData5=53;
char cData6=48;
char cData7=48;
char cData8=48;
char puffer;

while(1)
{
    puffer=getch();
    printf("\n Bitte Befehl eingeben \n");

    cData=getche();
    cData2=getche();


    Sleep(1000);

    if(kbhit()==0)
    {


        WriteFile(hFile,&cData,1,&dwCount,0);
        WriteFile(hFile,&cData2,1,&dwCount2,0);
        if(cData2=='V')
        {
            WriteFile(hFile,&cData5,1,&dwCount5,0);
            WriteFile(hFile,&cData6,1,&dwCount6,0);
            WriteFile(hFile,&cData7,1,&dwCount7,0);
            WriteFile(hFile,&cData8,1,&dwCount8,0);
        }

        WriteFile(hFile,&cData3,1,&dwCount3,0);

        Sleep(100);


        ReadFile(hFile,cData4,4,&dwCount4,0);


        Sleep(100);

        if(dwCount4>0)
        {
            printf("\n");
            printf(cData4);

        }

    }



}
return 0;


}

: Verschoben durch Moderator
Autor: Daniel G. (daniel83)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo salre

mal so versucht??

ReadFile(hFile,&cData4,4,&dwCount4,0);

steht zumindest so in der Doku von VS

Autor: salre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei mir ist cData4 ein array. Daher geht das schon von der Syntax.

Autor: salre (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
push

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
salre schrieb:

> Wenn ich den Maschinenstatus abfrage, werden vier Ziffern
> zurückgesendet.
> Bei allen anderen Befehlen wird nur eine Zahl bzw <ACK> zurückgesendet.
> Das Problem tritt nun auf, wenn ich zweimal hintereinander den
> Maschinenstatus abfragen will. Dann werden plötzlich nur drei oder nur
> zwei Zahlen zurückgesendet. Und bei späteren Befehlen antwortet die
> Maschine immer mit 0 statt mit <ACK>.

Wie hast du das verifiziert?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist das ein Problem deines Programms oder ein Problem/Eigenart der 
Maschine?

Um das zu beantworten könntest du ein bekannt funktionierendes 
Steuerprogramm (wenn es das gibt) mitloggen oder zunächst mit einem 
Terminalprogramm eine Kommunikation "manuell" fahren.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.