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ß
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
...
}