Zitat von
PicNick
Das Problem ist hier, dass die Daten zwar korrekt ankommen (ist das so ?), aber eben mit 10 Sek Delay.
D.h. das mit der Baudrate und den anderen Config-Sachen ist NICHT das Problem.
Dann kann es nur ein Problem in der Software sein. Ich vermute PC-Seitig, will aber keinem Unrecht tun.
Richtig die Daten kommen korrekt. Die Verzögerung ist das Problem.
Ich habe jetzt die Parameter im C++ -Programm folgendermaßen belegt:
Code:
dcbSerialParams.BaudRate= CBR_128000; //CBR_57600;
dcbSerialParams.ByteSize=8;
dcbSerialParams.StopBits=ONESTOPBIT;
dcbSerialParams.Parity=NOPARITY;
dcbSerialParams.fOutxCtsFlow=0;
dcbSerialParams.fOutxDsrFlow=0;
Die Kommunikation mit dem Bascom-Programm und der Konsole klappt ohne Probleme und ohne Verzögerung. Deswegen sehe ich das Problem, ebenfalls wie PicNick, PC-seitig. Ich kann mir das aber nicht erklären. Hier mal mein ReadFile und WriteFile:
Code:
char *write_pointer = write_char;
DWORD len = write_pointer ? (DWORD)strlen(write_pointer) : 0;
DWORD dwBytesWritten;
while(len)
{
if(!WriteFile(hSerial, write_pointer, len, &dwBytesWritten, NULL))
{
//error occurred. Report to user
return TB_ERROR; //-1;
}
len -= dwBytesWritten;
write_pointer += dwBytesWritten;
}
write_pointer = "\r";
len = (DWORD)strlen(write_pointer);
while(len)
{
if(!WriteFile(hSerial, write_pointer, len, &dwBytesWritten, NULL))
{
//error occurred. Report to user
return TB_ERROR; //-1;
}
len -= dwBytesWritten;
write_pointer += dwBytesWritten;
}
}
Sleep(200);
DWORD dwBytesRead;
char read_buffer[256];
int read_index = 0;
while(read_index < sizeof(read_buffer))
{
if(!ReadFile(hSerial, &read_buffer[read_index], 1, &dwBytesRead, NULL))
{
//error occurred. Report to user
return TB_ERROR; //-1;
}
if(dwBytesRead != 1)
{
//error occurred. Report to user
return TB_ERROR; //-1;
}
if(read_buffer[read_index] == '\n')
{
// ignore
continue;
}
if(read_buffer[read_index] == '\r')
{
// end of message
break;
}
read_index++;
}
if(read_index == sizeof(read_buffer))
{
//error occurred (buffer overflow). Report to user
return TB_ERROR; //-1;
}
read_buffer[read_index] = '\0';
if(read_index > 0)
{
wchar_t print_buffer[sizeof(read_buffer)];
mbtowc(print_buffer, read_buffer, MB_CUR_MAX);
}
else
{
//error occurred. Report to user
return TB_ERROR; //-1;
}
//MessageBox(hwnd, print_buffer, L"ReadFile", MB_OK | MB_ICONINFORMATION);
int string_read_laenge = 3;
if(read_index < 3)
{
// Sollte read_index < 3 sein, gibt es einen Fehler, weil der substr nicht klappt. Bei dem substr wird erst ab Feld 3 gearbeitet
return TB_ERROR; //-1;
}
string_parameter_read = read_buffer;
Ich sende Daten vom Joystick zum Controller und der sendet sie wieder zurück zum PC. Die Daten die ich sende sind immer die aktuellen Daten der Joystickachsen. Dann empfange ich z.B. 10 mal den gleichen Wert der Achsen, obwohl ich mehrfach schon aktuellere Daten zum Controller gesendet habe. Erst nach ca. 10 Sekunden erhalte ich mit ReadFile die Daten die ich 10 Sekunden vorher zum Controller gesendet habe. Zwischen WriteFile und ReadFile empfängt der Controller nur einmal Daten und sendet auch nur einmal Daten zurück. Das habe ich mit LED-blinken getestet.
Ich verzweifle
Lesezeichen