lundi 29 juin 2015

WIN32 Garbage from Reading COM Port


I am attempting to read a message that was sent on one COM port and received on another. The two ports are connected via two USB to Serial converters. When I attempt to read the transmitted message I get this:

Tx Baud rate: 9600 Rx Baud rate: 9600 Attempting to read... Hello, is ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠á☼ Done...

Press any key to continue . . .

The message should read "Hello, is there anybody out there!?"

we is the code I have written:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <string>
#include <Windows.h>

typedef struct COMDevice {
    HANDLE deviceHandle;
    DWORD actualBytesReadOrWritten;
    int deviceStatus;
    std::string message;
    DCB controlSettings;
} COMDevice;

int main(int argc, char *argv[]) {

// create new device
COMDevice *comWriter = new COMDevice;
COMDevice *comReader = new COMDevice;
// setup
comWriter->deviceHandle = NULL;
comWriter->actualBytesReadOrWritten = 0;
comWriter->deviceStatus = 0;
comWriter->message = "Hello, is there anybody out there!?";

comReader->deviceHandle = NULL;
comReader->actualBytesReadOrWritten = 0;
comReader->deviceStatus = 0;
comReader->message = "";

// open COM1 for writing
comWriter->deviceHandle = CreateFile(TEXT("COM5"), GENERIC_WRITE, 0, 0, OPEN_ALWAYS, 0, 0);
if(comWriter->deviceHandle == INVALID_HANDLE_VALUE) {
        std::cout << "Error occurred opening port for writing...\n";
        return (int)GetLastError();
}

    // open COM4 for reading
    comReader->deviceHandle = CreateFile(TEXT("COM4"), GENERIC_READ, 0, 0, OPEN_ALWAYS, 0, 0);
    if(comReader->deviceHandle == INVALID_HANDLE_VALUE) {
        std::cout << "Error occurred opening port for reading...\n";
        return (int)GetLastError();
    }

    // check baud rates
    if(GetCommState(comWriter->deviceHandle, &comWriter->controlSettings) == 0 || 
    GetCommState(comReader->deviceHandle, &comReader->controlSettings) == 0) {
        std::cout << "Error occurred getting the comm state...\n";
        return (int)GetLastError();
    }
    else {
        std::cout << "Tx Baud rate: " << comWriter->controlSettings.BaudRate << std::endl;
        std::cout << "Rx Baud rate: " << comReader->controlSettings.BaudRate << std::endl;
    }

    // write message to serial port
    comWriter->deviceStatus = WriteFile(comWriter->deviceHandle, comWriter->message.c_str(), 
    comWriter->message.length(), &comWriter->actualBytesReadOrWritten, NULL);
    if(comWriter->deviceStatus == FALSE) {
        std::cout << "Error occurred writing to port..\n";
        return (int)GetLastError();
    }

    // wait a few
    int i = 0, count = 4000;
    while(i < count) { i++; }

    // read
    std::cout << "Attempting to read...\n";
    char buffer[1024];
    comReader->deviceStatus = ReadFile(comReader->deviceHandle, buffer, 1023, 
    &comReader->actualBytesReadOrWritten, NULL);
    if(comReader->deviceStatus == FALSE) {

        return (int)GetLastError();
    }
    std::cout << buffer << std::endl;

    // close handles
    (void)FlushFileBuffers(comReader->deviceHandle);
    (void)CloseHandle(comWriter->deviceHandle);
    (void)CloseHandle(comReader->deviceHandle);

    // clean up...
    delete comWriter;
    delete comReader;

    std::cout << "Done...\n";

return 0;
}

I also use the DCB structure to check the baud rates at both ends...they match. Is there something else I may be missing?


Aucun commentaire:

Enregistrer un commentaire