помогите с разборкой строки больше 30 символов

dark_angel411
Offline
Зарегистрирован: 13.08.2015

Помогите разобраться с проблемой есть строка которую я передаю с внешней программы  строка вида: S,154,180,200,132,128,192,10,30,21,20,8,30,22,10,9,30,21,30,11,11,20,12,8,20,23,25,11,33,20,40,10,17,34

Arduino должно принять и раздавить каждую цифру определённой переменной 

sscanf(buffer, "%c,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d" , &Comand[0],
           &Meridian_PWM[0], &Meridian_PWM[1], &Meridian_PWM[2], &Meridian_PWM[3], &Meridian_PWM[4], &Meridian_PWM[5],
           &Hours_Start_Sunrise[0], &Minutes_Start_Sunrise[0], &Hours_End_Sunset[0], &Minutes_End_Sunset[0],
           &Hours_Start_Sunrise[1], &Minutes_Start_Sunrise[1], &Hours_End_Sunset[1], &Minutes_End_Sunset[1],
           &Hours_Start_Sunrise[2], &Minutes_Start_Sunrise[2], &Hours_End_Sunset[2], &Minutes_End_Sunset[2],
           &Hours_Start_Sunrise[3], &Minutes_Start_Sunrise[3], &Hours_End_Sunset[3], &Minutes_End_Sunset[3],
           &Hours_Start_Sunrise[4], &Minutes_Start_Sunrise[4], &Hours_End_Sunset[4], &Minutes_End_Sunset[4],
           &Hours_Start_Sunrise[5], &Minutes_Start_Sunrise[5], &Hours_End_Sunset[5], &Minutes_End_Sunset[5],
           &SystemTim[0], &SystemTim[1], &SystemTim[2]);

 сделал таким образом получается что:         

  &Comand[0],

           &Meridian_PWM[0], &Meridian_PWM[1], &Meridian_PWM[2], &Meridian_PWM[3], &Meridian_PWM[4], &Meridian_PWM[5],

           &Hours_Start_Sunrise[0], &Minutes_Start_Sunrise[0], &Hours_End_Sunset[0], &Minutes_End_Sunset[0],

           &Hours_Start_Sunrise[1], &Minutes_Start_Sunrise[1], &Hours_End_Sunset[1], &Minutes_End_Sunset[1],

           &Hours_Start_Sunrise[2], &Minutes_Start_Sunrise[2], &Hours_End_Sunset[2], &Minutes_End_Sunset[2],

 записывается нормально остальное 0 или что то другое.

 

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Как объявлены переменные ?

dark_angel411
Offline
Зарегистрирован: 13.08.2015

Массивами 

char Comand[1];
int Meridian_PWM[6];
int Hours_Start_Sunrise[6];
int Minutes_Start_Sunrise[6];
int Hours_End_Sunset[6];
int Minutes_End_Sunset[6];
int SystemTim[3];

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

sscanf возвращает количество входных параметров, которые успешно обработаны, можно использовать для отладки.

Количество заполненых элементов всегда одинаково, памяти хватает?

Вообще здесь напрашивается три-четыре цикла и разборка более простым способом, типа использование функции strtok, если содержимое буфера больше нигде не используется (strtok портит содержимое буфера).

 

dark_angel411
Offline
Зарегистрирован: 13.08.2015

Содержание буфера записывается сразу в переменные. А можно пример как его разобрать а то кроме sscanf  нечего не нашол.

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

А передается строка ?

Если передавать масив, можно сразу писать в некую структуру по указателю.

 

dark_angel411
Offline
Зарегистрирован: 13.08.2015

строка  S,154,180,200,132,128,192,10,30,21,20,8,30,22,10,9,30,21,30,11,11,20,12,8,20,23,25,11,33,20,40,10,17,34

первый символ команда следуюшие 6 ето значение ШИМ, остальные цыфры это врямя вкл выкл канала.

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

Я понимаю.

Но гемор с преобразованием/раскладыванием.

и Serial имеет буфер 64 байта,  и похоже все остальное вы теряете или мусор

код приема в Serial покажите. 

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

dark_angel411 пишет:

Содержание буфера записывается сразу в переменные. А можно пример как его разобрать а то кроме sscanf  нечего не нашол.

"не нашел" значит не искал. Я название функции написал, по этому названию много ссылок, открыть первую попавшуюся или следующую и вся информации с примерами на русском языке. Например (первая ссылка после поиска по строке "C++ strtok": http://cppstudio.com/post/747/

dark_angel411
Offline
Зарегистрирован: 13.08.2015

Выходит порт принимает только эту часть строки S,154,180,200,132,128,192,10,30,21,20,8,30,22,10,9,30,21,30,11, 

Как выйти с этой ситуации.

dark_angel411
Offline
Зарегистрирован: 13.08.2015
if (Serial.available())
  {
  
    while ( Serial.available() && i < 99)
    {
      buffer[i++] = Serial.read();
    }

    buffer[i++] = '\0';

 

xDriver
xDriver аватар
Offline
Зарегистрирован: 14.08.2015

1 попробывать снизить скорость до 9600-2400 (плохой способ);

2 писать в порт, со стороны компа, блоками , например по 32 байта сразу в структуру,

а не строкой и потом ее разбирать

#define PWM1 9

void setup() {
  Serial.begin(115200);

}
struct {
  char Comand[1];
  int Meridian_PWM[6];
  int Hours_Start_Sunrise[6];
  int Minutes_Start_Sunrise[6];
  int Hours_End_Sunset[6];
  int Minutes_End_Sunset[6];
  int SystemTim[3];
} data ;

void loop() {

  if (Serial.available())
  {
    int i=0;
    char *p;
    // указатель на первый байт структуры
    p = data.Comand;
    while (i < sizeof(data))
    {
      // тут можем повиснуть если от компа не придет нужное кол-во байт
      // можно собаку задействовать или чтото еще
      if (Serial.available()) {
        *p++ = Serial.read();
        i++;
      }
    }
    *p++ = '\0';
    // очищаем serial от хвоста
    while (Serial.read() >= 0);
  }
  // дальше пользуемся нашими переменными
  analogWrite(PWM1, data.Meridian_PWM[1]);

  // и так далее .....

}

код не проверял, но идея должна быть понятна;

с стороны компа потребуется переработка программы

такаяже структура, встаете на первый байт и погнали

в порт 32 байта, пауза несколько мс, и заново пока не дошли до конца стуктуры

на компе на чем написан софт ?

 

з.ы.

да и учтите, что в компе int скорее всего 4 байта, а в Ардуино 2

 

 

dark_angel411
Offline
Зарегистрирован: 13.08.2015

C#

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

dark_angel411 пишет:

Выходит порт принимает только эту часть строки S,154,180,200,132,128,192,10,30,21,20,8,30,22,10,9,30,21,30,11, 

Как выйти с этой ситуации.

HardwareSerial.h

#if !defined(SERIAL_RX_BUFFER_SIZE)
#if ((RAMEND - RAMSTART) < 1023)
#define SERIAL_RX_BUFFER_SIZE 16
#else
#define SERIAL_RX_BUFFER_SIZE 64
#endif
#endif

Может быть в буфер не влазит ?