Я пытаюсь получать ответ от Arduino по запросу.
В этом примере я отправляю букву
H и получаю
Hello, всё работает.
Но проблема в том, что приём работает ооочень долго(приходиться ждать 2-3 секунды).
Отправка работает моментально, но ответ идёт долго, что делать?
Мой код:
#include <iostream>
#include <Windows.h>
#include <conio.h>
#include <string> //for wstring
using namespace std;
int main(int argc, char* argv[])
{
int screenWidth = GetSystemMetrics(SM_CXSCREEN);
int screenHeight = GetSystemMetrics(SM_CYSCREEN);
wchar_t sPortName[8] = L"COM";
wchar_t sPortNumberStr[8] = L"";
int sPortNumber = 0;
wchar_t buffer[256] = L"";
cout << "Enter COM port number: ";
cin >> sPortNumber;
swprintf_s(sPortNumberStr, L"%d", sPortNumber);
wcscat_s(sPortName, sizeof(sPortNumberStr) / sizeof(wchar_t), sPortNumberStr);
HANDLE hSerial = ::CreateFile((LPCWSTR)sPortName, GENERIC_READ | GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
if (hSerial == INVALID_HANDLE_VALUE)
{
if (GetLastError() == ERROR_FILE_NOT_FOUND)
{
wcout << sPortName << " does not exist\n";
return -1;
}
cout << "Error in file\n";
return -1;
}
else
{
//настройка параметров соединения
DCB dcbSerialParams = { 0 };
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
if (!GetCommState(hSerial, &dcbSerialParams))
{
cout << "Getting state error\n";
return -1;
}
dcbSerialParams.BaudRate = CBR_9600;
dcbSerialParams.ByteSize = 8;
dcbSerialParams.StopBits = ONESTOPBIT;
dcbSerialParams.Parity = NOPARITY;
if (!SetCommState(hSerial, &dcbSerialParams))
{
cout << "Error setting serial port state\n";
return -1;
}
}
//Sleep();
while (true)
{
char data[] = "H"; // строка для передачи
DWORD dwSize = sizeof(data); // размер этой строки
DWORD dwBytesWritten; // тут будет количество собственно переданных байт
DWORD dwBytesReaded;
BOOL iRet = WriteFile(hSerial, data, dwSize, &dwBytesWritten, NULL);
if (!iRet)
{
cout << "Write error\n";
return -1;
}
else
{
cout << dwSize << " Bytes in string. " << dwBytesWritten << " bytes sended\n";
iRet = ReadFile(hSerial, data, 256, &dwBytesReaded, NULL);
if (!iRet)
{
cout << "Read error\n";
return -1;
}
else
{
cout << data << " " << dwBytesReaded << " bytes readed\n";
}
}
}
cout << "Press Enter to exit";
while (_getch() != 13);
return 0;
}
Код на Arduino:
const int ledPin = 13;
int inputSymbol = 0;
void setup()
{
pinMode(ledPin, OUTPUT);
Serial.begin(9600);
}
void loop()
{
if(Serial.available())
{
inputSymbol = Serial.read();
if(inputSymbol == 'L')
{
digitalWrite(ledPin, HIGH);
delay(3000);
digitalWrite(ledPin, LOW);
inputSymbol = NULL;
}
if(inputSymbol == 'H')
{
Serial.print("Hello!");
inputSymbol = NULL;
}
}
}