Ich habe einen Atmel mirocontroller Senden von Daten, die ich auf meinem PC über COM1 erhalten möchte.Ich empfange Junk auf der seriellen Schnittstelle
Wenn ich ein Terminal-Programm anschließe, werden die Daten korrekt empfangen (es ist alles ASCII, alles bedruckbar außer für \ n).
Mein Code scheint jedoch Junk (non-ASCII-Zeichen) zu empfangen. Kann jemand sehen, was ich falsch mache? Dank
Code gesendet, nur zur Info
// USART options.
static const usart_options_t USART_CONSOLE_OPTIONS =
{
.baudrate = 115200,
.charlength = 8,
.paritytype = USART_NO_PARITY,
.stopbits = USART_1_STOPBIT,
.channelmode = USART_NORMAL_CHMODE
};
Empfangen Code
E_boolean OpenCom1(void)
{
COMMTIMEOUTS timeouts;
comPortHandle = CreateFile("COM1", // Specify port device: default "COM1"
GENERIC_READ | GENERIC_WRITE, // Specify mode that open device.
0, // the device isn't shared.
NULL, // the object gets a default security.
OPEN_EXISTING, // Specify which action to take on file.
0, // default (not overlapped i/o).
NULL); // default (hTemplate must be NULL for COM devices).
if (comPortHandle == INVALID_HANDLE_VALUE)
return False;
deviceControlBlock.DCBlength = sizeof(deviceControlBlock);
if((GetCommState(comPortHandle, &deviceControlBlock) == 0))
{
// CodeMe: do what?
return False;
}
deviceControlBlock.BaudRate = CBR_115200;
deviceControlBlock.StopBits = ONESTOPBIT;
deviceControlBlock.Parity = NOPARITY;
deviceControlBlock.ByteSize = DATABITS_8;
deviceControlBlock.fRtsControl = 0;
if (!SetCommState(comPortHandle, &deviceControlBlock))
{
// CodeMe: do what?
return False;
}
// set short timeouts on the comm port.
timeouts.ReadIntervalTimeout = MAXDWORD;
timeouts.ReadTotalTimeoutMultiplier = MAXDWORD;
timeouts.ReadTotalTimeoutConstant = 1000; // oen second
timeouts.WriteTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 1;
if (!SetCommTimeouts(comPortHandle, &timeouts))
{
// CodeMe: do what?
return False;
}
FlushFileBuffers(comPortHandle);
PurgeComm (comPortHandle, PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
return True;
}//OpenCom1()
// +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=
void ReadCharacterFromCom1(INPUT char *theCharacter)
{
DWORD numBytesRead;
numBytesRead = 0;
while (numBytesRead == 0)
{
ReadFile(comPortHandle, // handle of file to read
theCharacter, // store read data here
sizeof(char), // number of bytes to read
&numBytesRead, // pointer to number of bytes actually read
NULL);
}
return;
}//ReadCharacterFromCom1()
Was verstehen Sie unter "Junk" bedeuten? Woher weißt du, dass der "Müll" nicht auf elektrischen Lärm zurückzuführen ist? –
@HotLicks +1 Ich meine nicht-ASCII-Zeichen und da ein Terminal-Programm korrekt empfängt, bin ich geneigt, meinen eigenen Code zu beschuldigen. – Mawg
Haben Sie versucht, den hexadezimalen Wert jedes Bytes zu drucken, das über 'theCharacter' empfangen wurde? – Tuxdude