2016-11-20 3 views
0

Я использую SerialClass.h и Serial.cpp в этой ссылке: http://playground.arduino.cc/Interfacing/CPPWindowsАрдуино и C++ последовательной связи синхронизации

Мой 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 пропускает данные. Мой выход:

output

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

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

ответ

1

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

enter image description here

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

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

Кроме того, вы должны реализовать какой-то протокол, по крайней мере, следующие 2:

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

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

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

Смежные вопросы