Arduino и C ++ последовательная синхронизация связи

Я использую SerialClass.h и Serial.cpp в этой ссылке: http://playground.arduino.cc/Interfacing/CPPWindows

Мой main.cpp:

#include <stdio.h>
#include <tchar.h>
#include "SerialClass.h"    // Library described above
#include <string>

// application reads from the specified serial port and reports the collected data
int main(int argc, _TCHAR* argv[])
{

printf("Welcome to the serial test app!\n\n");

Serial* SP = new Serial("COM4");    // adjust as needed

if (SP->IsConnected())
printf("We're connected\n");

char incomingData[256] = "hello";
int dataLength = 255;
int readResult = 0;

while(SP->IsConnected())
{
readResult = SP->ReadData(incomingData,dataLength);
incomingData[readResult] = 0;

if(readResult != 0){
printf("%s",incomingData);
printf("---> %d\n",readResult);
}
Sleep(500);
}
return 0;
}

Мой код Arduino:

int mySize = 5;
char incomingData[256] = "hello";

void setup (){
Serial.begin(9600); // Seri haberleşmeyi kullanacağımızı bildirdik
pinMode(LedPin, OUTPUT); //LedPini çıkış olarak tanımlıyoruz.
}

void loop (){

incomingData[mySize] = 't';
++mySize;

Serial.write(incomingData);

delay(500);
}

Arduino пишет массив символов, а C ++ читает его. Проблема иногда в том, что cpp не хватает данных. Мой вывод:

выход

Мой первый вопрос: что я могу сделать для этого? Как сделать синхронизацию между Arduino и C ++? C ++ должен подождать, пока arduino закончит писать. Я думаю, что я должен использовать систему блокировки или что-то подобное.

И другой вопрос. Я хочу, чтобы мои Arduino и C ++ программы постоянно общались. Я хочу сделать это: «Arduino пишет» после «C ++ reads» после «C ++ write» после «Arduino reads» после снова «Arduino write». Так что я не использую сон и задержку. Мой второй вопрос, как я могу сделать для этой синхронизации? Я думаю, что ответ такой же, как ответ на первый вопрос.

0

Решение

Используемый вами класс C ++ не реализует собственные внутренние буферы, он опирается на аппаратный буфер и буфер драйвера ОС. Буфер драйвера ОС может быть увеличен (Диспетчер устройств -> Порты -> Свойства драйвера -> Настройки порта)

введите описание изображения здесь

Есть Sleep(500) задержка в получении кода. Теперь представьте, что во время такой задержки в 500 мс буферы аппаратного и программного драйвера UART заполняются. Но ваш код «спит» и не читал буферизованные данные. Любые данные, полученные в течение этого периода, будут отброшены. Поскольку Windows не является операционной системой реального времени, время от времени ваш процесс Windows не получал достаточного промежутка времени (потому что существует много других процессов), и во время такого длительного бездействия данные могли быть потеряны. Так что убери это Sleep(500),

Чтобы обеспечить надежную связь, принимающая часть должна буферизовать данные, как только обнаружит новые данные (обычно в отдельном потоке, может иметь более высокий приоритет). Основная логика обработки должна работать с этими буферизованными данными.

Также вы должны реализовать какой-то протокол, по крайней мере, после 2:

  • формат сообщения (начало, конец, размер и т. д.)
  • целостность сообщения (данные получены без искажения, может быть простой контрольной суммой)

Также было бы неплохо контролировать передачу (тайм-ауты, ответ / подтверждение, если таковые имеются).

UPD: в коде Arduino Serial.write (входящие данные); убедитесь, что входящие данные правильно заканчиваются нулями. И добавьте проверку верхней границы для mySize …

1

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

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