Чтение байтов из последовательного порта C++ Windows

Эй, я пытаюсь подключиться к xbees, который я подключил к своей машине с Windows. Я могу писать на конечное устройство через координатора в режиме AT и видеть поток данных, передаваемых на мою консоль XCTU. Однако у меня возникли проблемы с пониманием того, как читать эти входящие данные.

Код, который я сейчас использую, приведен ниже. По сути, единственная важная часть — это последние 5 строк или около того (в частности, строки файла для чтения и записи), но я собираюсь опубликовать их все, чтобы быть тщательным. Как мне прочитать данные, которые я отправил на xbee через COM-порт? Данные, которые я отправил, были просто 0x00-0x0F.

Я думаю, что неправильно понимаю, как работает файл чтения. Я предполагаю, что биты, которые я отправляю на xbee, хранятся в буфере, который можно читать по одному. Это правильно? Или мне нужно записать весь байт, а не читать доступные данные? Прошу прощения, если мой ход мыслей сбивает с толку, я новичок в последовательной связи. Любая помощь приветствуется.

#include <cstdlib>
#include <windows.h>
#include <iostream>
using namespace std;

/*
 * 
 */
int main(int argc, char** argv) {
    int n = 8; // Amount of Bytes to Read
    HANDLE hSerial;
    HANDLE hSerial2;
    hSerial = CreateFile("COM3",GENERIC_WRITE,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);// dont need to GENERIC _ WRITE
    hSerial2 = CreateFile("COM4",GENERIC_READ,0,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);// dont need to GENERIC _ WRITE
    if(hSerial==INVALID_HANDLE_VALUE || hSerial2==INVALID_HANDLE_VALUE){
        if(GetLastError()==ERROR_FILE_NOT_FOUND){
//serial port does not exist. Inform user.
    cout << "Serial port error, does not exist" << endl;
    }
//some other error occurred. Inform user.
    cout << "Serial port probably in use" << endl;
    }

    DCB dcbSerialParams = {0};
    dcbSerialParams.DCBlength=sizeof(dcbSerialParams);
    if (!GetCommState(hSerial, &dcbSerialParams)) {
        cout << "error getting state" << endl;
    }
    dcbSerialParams.BaudRate=CBR_9600;
    dcbSerialParams.ByteSize=8;
    dcbSerialParams.StopBits=ONESTOPBIT;
    dcbSerialParams.Parity=NOPARITY;
    if(!SetCommState(hSerial, &dcbSerialParams)){
        cout << "error setting serial port state" << endl;

    }

    COMMTIMEOUTS timeouts = {0};

    timeouts.ReadIntervalTimeout = 50;
    timeouts.ReadTotalTimeoutConstant = 50;
    timeouts.ReadTotalTimeoutMultiplier =10;
    timeouts.WriteTotalTimeoutConstant = 50;
    timeouts.WriteTotalTimeoutMultiplier = 10;

    if (!SetCommTimeouts(hSerial, &timeouts)){
        cout << "Error occurred" << endl;
    }

    DWORD dwBytesWritten = 0;
    DWORD dwBytesRead = 0;
    unsigned char oneChar;
    for (int i=0; i<16; i++)
        {
          oneChar=0x00+i;
          WriteFile(hSerial, (LPCVOID)&oneChar, 1, &dwBytesWritten, NULL);
          ReadFile (hSerial2, &oneChar, 1, &dwBytesRead, NULL); // what I tried to do, just outputs white space
        }

    CloseHandle(hSerial);



    return 0;
}

person Zotto    schedule 17.07.2016    source источник


Ответы (1)


В вашем заявлении:

ReadFile (hSerial2, &oneChar, 1, &dwBytesRead, NULL);

Вам нужно проверить значение dwBytesRead, чтобы увидеть, действительно ли вы читаете какие-либо байты. Возможно, на одной стороне соединения вы хотите, чтобы простая программа отправляла байт каждую секунду. С другой стороны, вы хотите проверять доступные байты и выгружать их по мере их поступления.

Что, вероятно, происходит в вашей программе, так это то, что вы заполняете исходящий последовательный буфер за короткий промежуток времени, не дожидаясь достаточно долго, чтобы прочитать какие-либо данные, а затем выходите из цикла и закрываете последовательный порт, вероятно, до того, как он завершит отправку данных. данные в очереди. Например, напишите перед вызовом CloseHandle(), вы можете добавить:

COMSTAT stat;

if (ClearCommError(hCom, NULL, &stat))
{
    printf("%u bytes in outbound queue\n", (unsigned int) stat.cbOutQue);
}

И посмотрите, закроете ли вы дескриптор до того, как он будет отправлен.

person tomlogic    schedule 18.07.2016