Опрос COM порта для получения данных с компьютера

Antrone5545
Offline
Зарегистрирован: 03.01.2021

Добрые люди, помогите пожалуйста

Написал большой код для Arduino Nano который задает цвет светодиодов WS2812B по командам из COM порта,

то - есть пользователь отправляет с компьютера в ком порт строчку, в которой указывает какой светодиод каким цветом нужно зажечь, а ардуино делает это.

Но, проблема в том, что пользователь отправляет команды в разные промежутки времени, и очень часто случается такая ситуация, что отправленная пользователем команда, не попадает в тот момент, когда арудуино читает данные из com порта. Из за этого, зачастую ардуино не получает команды пользователя.

Надеюсь понятно. )))

Я пытался реализовать получение данных с com порта, по средствам прерывания, но все уперлось в то, что при считывании данных типа String из com порта, происходит ТаймАут который ломает прерывание.

Теперь не знаю что делать, помогите пожалуйста!

Мой кривой скетч:

char buffer[19];
int led;
int Bright = 255 ;
int r;
int g;
int b;
String com;
void(* reset) (void) = 0; 

   #include <GyverTimers.h>
   #include <FastLED.h>
    #define NUM_LEDS 120
    #define PIN 5
    #define LEDS 120
    #define LED_COUNT = 120;
     CRGB leds[LEDS];

    
void setup() {
  FastLED.addLeds<WS2812, PIN, GRB>(leds, LEDS);
  Serial.begin(115200); 
  FastLED.setBrightness(Bright);
  Serial.println("Start");
}

void loop()
{
  com = "";
  led = 0;
  r = 0;
  g = 0;
  b = 0;

  Serial.setTimeout(50);
com = Serial.readString();

com.toCharArray(buffer,16);
   
   led=atoi(strtok(buffer," "));
   r=atoi(strtok(NULL," "));
   g=atoi(strtok(NULL," "));
   b=atoi(strtok(NULL," "));


leds[led].r = r; 
leds[led].g = g; 
leds[led].b = b;
 FastLED.show();
 if (Serial.parseInt() == -999) reset();
 }

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

А нахрена ты принудительно читаешь из порта, когда там ничо нету?  За Serial.available() знаешь чонить?

rkit
Онлайн
Зарегистрирован: 23.11.2016

Antrone5545 пишет:

Я пытался реализовать получение данных с com порта, по средствам прерывания, но все уперлось в то, что при считывании данных типа String из com порта,

Не вижу в коде ничего даже отдаленно напоминающего о прерывании.

sadman41
Offline
Зарегистрирован: 19.10.2016
andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

rkit пишет:

Antrone5545 пишет:

Я пытался реализовать получение данных с com порта, по средствам прерывания, но все уперлось в то, что при считывании данных типа String из com порта,

Не вижу в коде ничего даже отдаленно напоминающего о прерывании.

А какая разница, если прерывания в данном случае вообще не нужны?

Опять же, как видно из поста ТС, не любые прерывания ему "по средствам".

rkit
Онлайн
Зарегистрирован: 23.11.2016

Ну удачно тебе помогать человеку, который говорит одно, а делает другое, раз никакой разницы.