Я использую микроконтроллер Arduino с самым простым фрагментом кода:
void loop(){Serial.write('b');}
Таким образом, он посылает постоянный поток 'b'.
С другой стороны, я использую Visual Studio для получения данных:
#include <iostream>
#include <windows.h>
#include <string>
using namespace std;
LPCTSTR comPort = TEXT("COM3");
int main()
{
HANDLE hSerial;
hSerial = CreateFile(comPort,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if (hSerial == INVALID_HANDLE_VALUE) {
if (GetLastError() == ERROR_FILE_NOT_FOUND) {
//serial port does not exist. Inform user.
cout << "ERROR WITH COM PORT" << endl;
}
//some other error occurred. Inform user.
}
DCB dcbSerialParams = { 0 };
dcbSerialParams.DCBlength = sizeof(DCB);
if (!GetCommState(hSerial, &dcbSerialParams)) {
//error getting state
cout << "ERROR GETTING SERIAL STATE" << endl;
}
dcbSerialParams.BaudRate = CBR_9600;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(hSerial, &dcbSerialParams)) {
//error setting serial port state
cout << "ERROR SETTING SERIAL STATE" << endl;
}
COMMTIMEOUTS timeouts = { 0 };
timeouts.ReadIntervalTimeout = 5;
timeouts.ReadTotalTimeoutConstant = 5;
timeouts.ReadTotalTimeoutMultiplier = 1;
timeouts.WriteTotalTimeoutConstant = 5;
timeouts.WriteTotalTimeoutMultiplier = 1;
if (!SetCommTimeouts(hSerial, &timeouts)) {
//error occureed. Inform user
cout << "ERROR SETTING TIMEOUT" << endl;
}
const int n = 500;
char szBuff[n + 1] = { 0 };
DWORD dwBytesRead = 0;
if (!ReadFile(hSerial, szBuff, n, &dwBytesRead, NULL)) {
//error occurred. Report to user.
cout << "ERROR READING FROM ARDUINO" << endl;
}
cout << szBuff << endl;
//cout << szBuff << endl;
CloseHandle(hSerial);
}
Когда я собираю и запускаю, консоль показывает мне это:
Или иногда это:
Есть идеи, почему? Я следовал всем инструкциям этого руководства: http://bd.eduweb.hhs.nl/micprg/pdf/serial-win.pdf, и я много чего перепробовал (изменив TimeOut, количество байтов для получения, ...)
С уважением
РЕДАКТИРОВАТЬ: Я забыл сказать вам, что Arduino полностью в порядке. Я использую Matlab для получения большего количества данных, и он отлично работает (без странного поведения, как сейчас).