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 User
Hallo salre mal so versucht?? ReadFile(hFile,&cData4,4,&dwCount4,0); steht zumindest so in der Doku von VS
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?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.