Ich modifizierte serielle Loopback-Code von jemand anderem in C (Codeblocks/Mingw) unter Windows-Plattform geschrieben. Ich kann die Daten korrekt senden. Ich habe dies verifiziert, indem ich die Terminalsoftware geöffnet habe. Aber ich kann die Daten nicht empfangen. Ich erhalte den Fehler der Fehlermeldung, der vom Eingabepuffer 998 für ReadFile() in dem folgenden Code liest. Nicht sicher, was der Fehler ist. Ich verwende zwei CP210x USB zu seriellen Modulen und verbunden TxD zu RxD von einem zum anderen.Nicht in der Lage, serielle Daten zu empfangen
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <commdlg.h>
//#include <windef.h>
#include <time.h>
int nread,nwrite;
void myDelay(unsigned int mseconds)
{
clock_t goal = mseconds + clock();
while (goal > clock());
}
int main(int argc, char* argv[])
{
HANDLE hSerial;
COMMTIMEOUTS timeouts;
COMMCONFIG dcbSerialParams;
char *words, *buffRead, *buffWrite;
DWORD dwBytesWritten, dwBytesRead;
if(argc<3)
{
printf("Enter the com port as command line parameter and t for transmitter and r for receiver\n");
printf("Example: Serial.exe com4 t\n");
return(1);
}
hSerial = CreateFile(argv[1],GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hSerial == INVALID_HANDLE_VALUE)
{
if (GetLastError() == ERROR_FILE_NOT_FOUND)
{
printf(" serial port does not exist \n");
}
else
{
printf(" some other error occured\n");
}
return(1);
}
if (!GetCommState(hSerial, &dcbSerialParams.dcb))
{
printf("error getting state \n");
return(1);
}
dcbSerialParams.dcb.DCBlength = sizeof(dcbSerialParams.dcb);
// Set various serial port parameters.
dcbSerialParams.dcb.BaudRate = CBR_9600;
dcbSerialParams.dcb.ByteSize = 8;
dcbSerialParams.dcb.StopBits = ONESTOPBIT;
dcbSerialParams.dcb.Parity = NOPARITY;
dcbSerialParams.dcb.fBinary = TRUE;
dcbSerialParams.dcb.fDtrControl = DTR_CONTROL_DISABLE;
dcbSerialParams.dcb.fRtsControl = RTS_CONTROL_DISABLE;
dcbSerialParams.dcb.fOutxCtsFlow = FALSE;
dcbSerialParams.dcb.fOutxDsrFlow = FALSE;
dcbSerialParams.dcb.fDsrSensitivity= FALSE;
dcbSerialParams.dcb.fAbortOnError = TRUE;
if (!SetCommState(hSerial, &dcbSerialParams.dcb))
{
printf(" error setting serial port state \n");
return(1);
}
GetCommTimeouts(hSerial,&timeouts);
timeouts.ReadIntervalTimeout = 50;
timeouts.ReadTotalTimeoutConstant = 50;
timeouts.ReadTotalTimeoutMultiplier = 10;
timeouts.WriteTotalTimeoutConstant = 50;
timeouts.WriteTotalTimeoutMultiplier= 10;
if(!SetCommTimeouts(hSerial, &timeouts))
{
printf("error setting port state \n");
return(1);
}
while(1)
{
// Use a delay of 500 msec
myDelay(500);
if(!strcmp(argv[2],"t"))
{
printf("Write Mode\n");
//****************Write Operation*********************//
words = "This is a string to be written to serial port COM1";
nwrite = strlen(words);
buffWrite = words;
dwBytesWritten = 0;
if (!WriteFile(hSerial, buffWrite, nwrite, &dwBytesWritten, NULL))
{
printf("error writing to output buffer \n");
return(1);
}
}
//***************Read Operation******************//
else
{
dwBytesRead = 0;
nread = strlen(words);
if (!ReadFile(hSerial, buffRead, nread, &dwBytesRead, NULL))
{
printf("error reading from input buffer %d\n", GetLastError());
continue;
}
printf("Data read from read buffer is \n %s \n",buffRead);
}
}
CloseHandle(hSerial);
return(0);
}
Fehler 998 ist ERROR_NOACCESS „Unzulässiger Zugriff auf Speicherstelle“. Informiert Sie mit 100% Sicherheit, dass Sie einen schlechten Zeiger auf ReadFile() übergeben. Sie sind, Sie initialisierten nie * buffRead *. Eine viel bessere Deklaration ist 'BYTE buffRead [4096];' Und übergeben Sie einen korrekten Wert für die Puffergröße, die 4096 sein wird. Die printf() -Anweisung ist ebenfalls falsch, Sie erhalten keine ordnungsgemäß nullterminierte Zeichenkette. –
gearbeitet. Habe nicht bemerkt, dass Speicher nicht zugewiesen ist. Wenn Sie dies als Antwort schreiben, kann ich dies als Antwort markieren. Jetzt funktioniert es für mich. Auch einige Änderungen, die ich im Empfangsbereich gemacht habe, um eine Müllanzeige zu vermeiden. Einige weitere Änderungen, die ich als Teil der Sanierung Code tun ' else { if (dwBytesRead) { for (count = 0; count
Rajesh