помогите с разборкой строки больше 30 символов
- Войдите на сайт для отправки комментариев
Пнд, 14/03/2016 - 11:30
Помогите разобраться с проблемой есть строка которую я передаю с внешней программы строка вида: 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 или что то другое.
Как объявлены переменные ?
Массивами
sscanf возвращает количество входных параметров, которые успешно обработаны, можно использовать для отладки.
Количество заполненых элементов всегда одинаково, памяти хватает?
Вообще здесь напрашивается три-четыре цикла и разборка более простым способом, типа использование функции strtok, если содержимое буфера больше нигде не используется (strtok портит содержимое буфера).
Содержание буфера записывается сразу в переменные. А можно пример как его разобрать а то кроме sscanf нечего не нашол.
А передается строка ?
Если передавать масив, можно сразу писать в некую структуру по указателю.
строка 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 ето значение ШИМ, остальные цыфры это врямя вкл выкл канала.
Я понимаю.
Но гемор с преобразованием/раскладыванием.
и Serial имеет буфер 64 байта, и похоже все остальное вы теряете или мусор
код приема в Serial покажите.
Содержание буфера записывается сразу в переменные. А можно пример как его разобрать а то кроме sscanf нечего не нашол.
"не нашел" значит не искал. Я название функции написал, по этому названию много ссылок, открыть первую попавшуюся или следующую и вся информации с примерами на русском языке. Например (первая ссылка после поиска по строке "C++ strtok": http://cppstudio.com/post/747/
Выходит порт принимает только эту часть строки S,154,180,200,132,128,192,10,30,21,20,8,30,22,10,9,30,21,30,11,
Как выйти с этой ситуации.
1 попробывать снизить скорость до 9600-2400 (плохой способ);
2 писать в порт, со стороны компа, блоками , например по 32 байта сразу в структуру,
а не строкой и потом ее разбирать
код не проверял, но идея должна быть понятна;
с стороны компа потребуется переработка программы
такаяже структура, встаете на первый байт и погнали
в порт 32 байта, пауза несколько мс, и заново пока не дошли до конца стуктуры
на компе на чем написан софт ?
з.ы.
да и учтите, что в компе int скорее всего 4 байта, а в Ардуино 2
C#
Выходит порт принимает только эту часть строки 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
Может быть в буфер не влазит ?