ReadFile & WriteFile: Emfänger empfängt Daten, leider sind diese auch im PC:RXBuffer?

mats_MF

Mitglied
Hallo,

Meine Kommunikation zwischen µC und PC funtioniert soweit gut, und der µC empfängt sauber die Daten vom PC (USB-Port3 / ein Teilnehmer / RS485). Doch leider sind die Daten aus meinem Sende-Buffer im Empfangsbuffer vor der eigentlichen Antwort vom µC. Habe schon verschiedene Timouts genommen und und sämtliche Zeiger "umgebogen" ...ohne Erfolg. Vielleicht kann mir jemand helfen: na ch folgendem Code habe ich im RxBuf[] in den ersten drei Stellen das gesendete TxBuf stehen und danach meine Empfangenen Daten vom µC. Ich danke Euch im Voraus! Gruß

Code:
#define RX_BUFFERSIZE 10
#define TX_BUFFERSIZE 3
unsigned char TxBuf[TX_BUFFERSIZE];
unsigned char RxBuf[RX_BUFFERSIZE];

...

DWORD CTestdialog::Read(LPVOID ptrBuf_r, DWORD dwCount)  //void *
{
  DWORD dwBytesRead = 0;
  ReadFile(h_com, ptrBuf_r, dwCount, &dwBytesRead, NULL);
  return dwBytesRead;
}

DWORD CTestdialog::Write(LPCVOID ptrBuf_w, DWORD dwCount) //const void *
{  
  DWORD dwBytesWritten = 0;
  WriteFile(h_com, ptrBuf_w, dwCount, &dwBytesWritten, NULL);
  return dwBytesWritten;
}

void CTestdialog::Manuell_Senden(int a, int b, int c)
{
 CTestdialog td;
 SetCommMask(h_com, 0);
  
 TxBuf[0] = a,TxBuf[1] = b,TxBuf[2] = c;
		
 DWORD dwWrite = td.Write(TxBuf, TX_BUFFERSIZE);
 td.TerminateOutstandingWrites();

 //SetCommMask(h_com, EV_TXEMPTY);
 //SetCommMask(h_com, EV_RXCHAR);

 DWORD dwRead = td.Read(RxBuf, RX_BUFFERSIZE);
 td.TerminateOutstandingReads();
	
 if(dwRead<8)
 {
  rx_timeout++;
  if(rx_timeout>10)
  {
	rx_timeout=0;
	timeout=1;
	STATUS=4;
 }
}

 td.ClearWriteBuffer();
 td.ClearReadBuffer();
 td.Flush();
 Messwerte_ermittlen();
 InvalidateRect(td_farbrahmen,TRUE);
 InvalidateRect(&td_fortschritt,TRUE);
 UpdateData(FALSE);
}

BOOL CTestdialog::OnInitDialog()
{
....
ZeroMemory(&com_old, sizeof(COMMTIMEOUTS));
ZeroMemory(&com_new, sizeof(COMMTIMEOUTS));

GetCommTimeouts(h_com,&com_old);

com_new = com_old;
com_new.ReadIntervalTimeout = MAXDWORD;
com_new.ReadTotalTimeoutMultiplier = 0;
com_new.ReadTotalTimeoutConstant = 0;
com_new.WriteTotalTimeoutMultiplier = 0;
com_new.WriteTotalTimeoutConstant = 500;

if(!SetCommTimeouts(h_com, &com_new)) // COM-Einstellungen speichern
err = GetLastError();
	
ZeroMemory(&dcbnew,sizeof(DCB));
ZeroMemory(&dcbold,sizeof(DCB));
dcbnew.DCBlength = sizeof(DCB);// setzen der Blocklaenge
dcbold.DCBlength = sizeof(DCB);// setzen der Blocklaenge
GetCommState (h_com, &dcbold); // COM-Einstellungen laden
dcbnew = dcbold;
dcbnew.BaudRate = 57600; // Baudrate einstellen
dcbnew.ByteSize = 8; // Datenbits einstellen, hier 8
dcbnew.Parity = NOPARITY; // Parität einstellen, hier keine Parität
dcbnew.StopBits = ONESTOPBIT; // Stopbits einstellen, hier 1
...
}