Gast
#1459870
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;
}