mrjbom
@mrjbom

COM-порт долго возвращает ответ от Arduino?

Я пытаюсь получать ответ от 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;
        }
    }
}
  • Вопрос задан
  • 321 просмотр
Пригласить эксперта
Ответы на вопрос 1
@vanyamba-electronics
Драйвер файла просто ждёт, когда программа отправит ему символ конца строки.
Добавьте вызов FlashFileBuffers, чтобы передать данные сразу:
BOOL FlushFileBuffers(
  HANDLE hFile
);

Подробнее
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы