xbee — чтение байтов из последовательного порта 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;
}

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);
}

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]