Работа с Arduino через COM-порт на C++
Мне необходимо передать данные на Arduino Uno с компьютера, после чего получить другие данные уже на компьютер от Arduino. Я написал реализующий данную логику код на Arduino и на компьютер, используя C++. К сожалению код работает исправно только сразу после прошивки Arduino Uno. Но если отключить Arduino от COM-порта, а затем опять подключить, то компьютер не может передать данные на плату. Какие могут быть причины? Код для компьютера
#include <windows.h>
#include <iostream>
using namespace std;
HANDLE serial;
char outData[] = "s";
DWORD outDataSize = sizeof(outData);
DWORD outBytesWritten;
void SerialRead() {
DWORD inputDataSize;
char receivedChar;
while (true) {
ReadFile(serial, &receivedChar, 1, &inputDataSize, 0);
if (inputDataSize > 0) cout << receivedChar;
}
}
int main(){
cout << ">> begin\n";
LPCTSTR name = L"COM4";
DCB sParams;
serial = CreateFile(name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (serial == INVALID_HANDLE_VALUE){
if (GetLastError() == ERROR_FILE_NOT_FOUND){
cout << ">> serial port does not exist\n";
CloseHandle(serial);
return 0;
}
cout << ">> some other error occurred\n";
CloseHandle(serial);
return 0;
}
if (!GetCommState(serial, &sParams)) {
cout << ">> getting state error\n";
CloseHandle(serial);
return 0;
}
sParams.BaudRate = CBR_9600;
sParams.ByteSize = 8;
sParams.StopBits = ONESTOPBIT;
sParams.Parity = NOPARITY;
if (!SetCommState(serial, &sParams)) {
cout << ">> error setting serial port state\n";
CloseHandle(serial);
return 0;
}
BOOL write = WriteFile(serial, outData, outDataSize, &outBytesWritten, NULL);
cout << write;
cout << ">> reading\n";
while (true) SerialRead();
return 0;
}
Код для Arduino Uno
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.read() == 's') Serial.print('e');
}
Ответы (1 шт):
Автор решения: Федор Яроцкий.
→ Ссылка
Добавил перед отправкой данных с компьютера паузу в три секунды Sleep(3000)
. Всё заработало.