81

Re: STM32, Atolic TrueStudio, CubeMX

Це не STL. Які саме рядки використовуються там, я гадки не маю, але ніби очевидно, що indexOf - це пошук в рядку, а другий параметр вказує, з якого місця починати пошук. В C немає сенсу вводити додатковий параметр в strstr, бо можна просто додати до вказівника позицію:

- index_colon = data.indexOf(':', index_PIPDcomma + 5);
+ index_colon = strstr(data + index_PIPDcomma + 5, ":" );//другий параметр має бути теж char *
Подякували: leofun01, taburyak2

82

Re: STM32, Atolic TrueStudio, CubeMX

Краще послуговуйтесь strchr, але майте на увазі, що стандартна ліба сі оперує стірчками з кінцевим нулем! Чи подходить такий формат вам для роботи?

Подякували: koala, leofun01, taburyak3

83

Re: STM32, Atolic TrueStudio, CubeMX

taburyak написав:

В черговий раз поговорю сам з собою. А що робить?

Ой, бачив це, але мені зараз DMA ні до чого, а вільного часу небагато. То й не тойво.

taburyak написав:

Вітання.
Є потреба перековбасити одну невеличку бібліотеку з Сі++ на Сі. Це бібліотека роботи Arduino з ESP8266 АТ командами. Хочу таку ж бібліотеку на Сі для STM32. Такого досвіду ще на маю.

І наче потроху виходить, але застряг на одній функції де йде активна робота з рядками. Може хто спєц в цьому і може допомогти мені?

Arduino писалося довго багатьма людьми, там багато різних класів використовуються наскрізно через всі бібліотеки і ці класи несуть відбиток того, що воно писалося (спершу і досі суттєвою мірою) під 8-бітні AVR з різними просторами пам'яті (наприклад, методи класу для роботи з рядками враховують можливість розміщення рядкових літералів у флеші, доступ до якого не тими командами, що до оперативки). То треба дивитися, який тип того data в класі ESP і дивитися код його методів.

Або писати з використанням бібліотек Arduino, а не пробувати їх перетоптати.
Десь були рекомендації/комплект makefile/скриптів для використання бібліотек Arduino поза межами оболонки Arduino, у звичному циклі make+gcc.

Подякували: taburyak1

84

Re: STM32, Atolic TrueStudio, CubeMX

koala, 0xDADA11C7, ReAl

Дякую, друзі, за відповіді.
Але, чим далі в ліс, тим товщі партизани.
Як виявляється, це занадто складно для мене. Брак досвіду. І це тільки маленький крок для застосування ще більшої бібліотеки, яку теж треба було б переробити.

Мабуть треба йти іншим шляхом. Трішки поміркую/поясню, а там може в кого які ідеї виникнуть.

Є бібліотека blynk для потреб IoT, добре працює з ESP8266 (майже те саме по коду що і Arduino). В мене добре виходить програмувати ті ESP8266 під blynk. Але хотілось би мати і підтримку stm32 не в середовищі mbed і arduino, а по людські. Блінкери не планують щось робити в напрямку, що мене влаштував би (не поширена платформа і таке інше). Тому є ідея. Раз blynk добре працює на esp8266, то хай там і працює. А при потребі моцного MCU і більшого функціонала до того esp8266 під'єднувати вже stm32 по uart чи SPI і вже між ними ганяти данні.
Ідея не погана і мене б влаштувало таке рішення.
Стає питання про універсальний "протокол" обміну між esp8266 i stm32. Щоб, коли потрібно додати якогось функціоналу не треба було б перелопачувати код на esp8266.

Вся робота Blynk'у зав'язана на віртуальних пінах (штифтах), їх там 127. До кожного штифта прив'язаний запис у базі твого аккаунту. Можна туди дані надсилати, або отримувати.

Наприклад надіслати данні можна так, де pin це V0 - V127:

// Send string
Blynk.virtualWrite(pin, "abc");

// Send integer
Blynk.virtualWrite(pin, 123);

// Send float
Blynk.virtualWrite(pin, 12.34);

// Send multiple values as an array
Blynk.virtualWrite(pin, "hello", 123, 12.34);

// Send RAW data
Blynk.virtualWriteBinary(pin, buffer, length);

Коли данні віртуального штифта на сервері оновлюються (наприклад на смартфоні натиснув віджет кнопки, чи віджет слайдера, тощо), то викликається функція BLYNK_WRITE, де pin це V0 - V127 до якого прикріплений віджет:

BLYNK_WRITE(pin)
{   
  int value = param.asInt(); // Get value as integer

  // The param can contain multiple values, in such case:
  int x = param[0].asInt();
  int y = param[1].asInt();
}

Ну в принципі цього достатньо.

Так от з боку esp8266 задача підтримувати зв'язок з wifi, з сервером блінк, приймати і відправляти данні від віртуальних штифтів. Це все працює.

А от як у зв'язці з stm32 бути?

Ось наприклад, на stm32 від сенсора температури отримав значення тієї ж температури і мені потрібно ці данні відправити на віртуальний штифт V0. Ну і хай я на stm32 по uart кидаю рядок, щось на кшталт "V0=25.5", а esp8266 передає це далі на сервер.  А коли сталось оновлення на сервері V10 (на смартфоні натиснули віджет кнопки), то щоб esp8266 по uart кинув щось типу "V10=1" чи "V10=0", а stm32 вже увімкнув чи вимкнув світлодіод. Ну це я спрощено для прикладу, щоб було зрозуміло. Можна json забабахать і все таке, чи через коди (які самому видумати). Питання не в цьому.

От як зробити на стороні esp8266 так універсально, щоб коли я додаю на stm32 новий датчик, чи новий виконавчий пристрій міняв код тільки на stm32, а вже esp8266 сама розрулює, код міняти не треба, автоматично знало що куди. Просто шлю до esp8266 команду з новим віртуальним штифтом. Так само і з оновленням віртуальних штифтів з боку сервера.

От з оновленням наче проканає перерахувати всі віртуальні штифти в коді esp8266:

BLYNK_WRITE(V0)
{   
  int value = param.asInt(); // Get value as integer

  // а далі відправка прийнятого value на stm32 і так для всіх V0-V127
}

Хоча не розумію як розрізняти різні типи даних тоді?

А коли треба відправити дані

// Send float
Blynk.virtualWrite(pin, value);

А замість pin підставити потрібний (де pin = V5, а value = 23.54), який отримав esp8266 від stm32.

p.s. ого понаписував. це хтось прочитає?  :D

85

Re: STM32, Atolic TrueStudio, CubeMX

З приводу ESP8266 я все більше схиляюся до думки (точніше, дописи raxp мене все більше схиляють до думки), що там треба все робити на Lua.

Якщо ESP-шних ніжок та їхніх функцій достатньо, то й з головою.

Якщо ESP8266 стоїть поруч з чимось «реально-часовішим» для зв'язку, то все, пов'язане з мережею, робити в ESP на Lua, а між ESP і мікроконтролером кинути якийсь нескладний протокол, мікроконтролер може думати, що він отак досі по RS232/RS485 до PC приєднаний.

86 Востаннє редагувалося taburyak (10.01.2018 11:55:45)

Re: STM32, Atolic TrueStudio, CubeMX

ReAl написав:

Якщо ESP-шних ніжок та їхніх функцій достатньо, то й з головою.

Та так, згоден. Мені для домашнього IoT'у esp'шкиних ніг позаочі. Як що що, то 1-wire, spi і i2c в допомогу. та й скільки тих ніг треба на реле для лампочки, чи там обігрівача, та пару сенсорів якихось. Але є такий запрос, один девайс на іншому мікроконтролері ввести в систему типу "розумний дім".

робити в ESP на Lua

Про LUA поверхово знайомився. Конкретно мені підходить добре і в середовищі arduino програмувати esp'шки.

87

Re: STM32, Atolic TrueStudio, CubeMX

Є бібліотека blynk для потреб IoT, добре працює з ESP8266 (майже те саме по коду що і Arduino). В мене добре виходить програмувати ті ESP8266 під blynk. Але хотілось би мати і підтримку stm32 не в середовищі mbed і arduino, а по людські.

Боріться з Гарвардською архітектурою сішним препроцесором.

88

Re: STM32, Atolic TrueStudio, CubeMX

0xDADA11C7 написав:

Боріться з Гарвардською архітектурою сішним препроцесором.

На жаль, я не зрозумів вашу думку.

89

Re: STM32, Atolic TrueStudio, CubeMX

Програми для гарвардських архітектур пишуться з врахуванням типів пам'яті, для цього в мову сі вводять різні модифікатори та pragma, тобто перед визначенням змінної стоїть модифікатор або вказується сегмент, в якому дані зберігаються. Вам потрібно просто умовною компіляцією за допомогою препроцесора знехтувати цими модихвікаторами (оскільки в фон-нейманівських архітектурах пам'ять здебільшого пласка) а також зробити "перемикача" між підмножиною рантайм бібліотеки для вбудованих систем і повноцінною рантайм бібліотекою.

Подякували: taburyak1

90

Re: STM32, Atolic TrueStudio, CubeMX

taburyak написав:
0xDADA11C7 написав:

Боріться з Гарвардською архітектурою сішним препроцесором.

На жаль, я не зрозумів вашу думку.

Про це в цій темі вже було.
В Arduino це обійдено класом-обгорткою для рядків у PROGMEM, призначеним для перевантаження методів/операторів рядкових і комунікаційних класів.

91

Re: STM32, Atolic TrueStudio, CubeMX

Та вже зрозумів, але справа зовсім не в тому. Коротше, це занадто складно для мене. Пуп стаканом стане. Дякую за бесіду  ;)

Подякували: 0xDADA11C71

92 Востаннє редагувалося taburyak (17.01.2018 10:10:36)

Re: STM32, Atolic TrueStudio, CubeMX

Маю шанс зневіритись у свої здібності. То монітор по SPI не вдалось запустити - відклав. Думаю дай щось простіше за монітор запущу. Взявся сенсор світла TSL2561 по I2C запустити. На ESP8266 працює відмінно.
Відкрив доки по сенсору, відкрив доки по HAL, відкрив код той що на ESP8266 працює. І давай переробляти на STM32. Наче розібрався і зробив як слід, а ніпуркуа воно не працює. Аж руки вже опустились.

Ну ось, наприклад код з ESP8266:

boolean SFE_TSL2561::writeByte(unsigned char address, unsigned char value)
{
    Wire.beginTransmission(_i2c_address);
    Wire.write((address & 0x0F) | TSL2561_CMD);
    // Write byte
    Wire.write(value);
    _error = Wire.endTransmission();
    if (_error == 0)
        return(true);

    return(false);
}

По адресі пристрою I2C "_i2c_address" в певний регістр + що це команда "(address & 0x0F) | TSL2561_CMD" записуємо значення "value". Простіше простого.

Для STM32:

bool TSL2561_WriteByte(uint8_t regAdr, uint8_t value)
{
    uint8_t data[2] = {0, 0};

    data[0] = ((regAdr & 0x0F) | TSL2561_CMD);
    data[1] = value;

    if(HAL_I2C_Master_Transmit(&hi2c1, (uint16_t) TSL2561_ADDR, data, 2, 1000) == HAL_OK)
    {
        return true;
    }
    else
    {
        return false;
    }
}

Робимо те саме за допомоги HAL функції, передаємо два байти по I2C за адресою пристрою "TSL2561_ADDR", data вказівник на масив з двома байтами "((regAdr & 0x0F) | TSL2561_CMD)" - адреса регістру + що це є команда і "value" - сама команда. Далі "2" - це що передаємо 2 байти і таймаут 1000 мілісекунд.
І вже ця функція "HAL_I2C_Master_Transmit" повертає false.

Ну не какулька? Що далі роблять try залізячники? Куди копати? Як розібратись в чому діла? Наче роблю як слід, а крім UART'у так нічого запустити не виходить.

93

Re: STM32, Atolic TrueStudio, CubeMX

Все веселіше і веселіше.
Є ще в мене сенсор Si7021 вологість і темпа. Є бібліотека цього сенсору для STM32 заточену під HAL драйвер. Але ж так само повертає помилку щодо I2C. Вже те I2C на інших пінах спробував. Ну і сам сенсор Si7021 на ESP8266 не завівся. Оце не знаю що і думати. Як швидко і просто перевірити той i2c працює чи ні?

94

Re: STM32, Atolic TrueStudio, CubeMX

Ну не какулька? Що далі роблять try залізячники? Куди копати? Як розібратись в чому діла?

Читають про мову асемблера і вікривають знежучувавча.

95

Re: STM32, Atolic TrueStudio, CubeMX

Перевірте адреси. Зустрічав два підходи в готових бібліотеках. Деякі приймають адресу як значення поля, яке треба помістити в байт, а якісь — як весь байт із замаскованим бітом R/W.
Наприклад, для запису в пристрій треба передати бітово 10100010, а для зчитування 10100011.
Тоді одні бібліотеки вважають адресою 10100010 і самі при потребі лише записують 1-ку в молодший біт, а деяікі хочуть адресу 1010001 (власне поле адреси), зсувають на 1 біт вліво і заповнюють потрібним молодший біт.

Ну і там все інше — налаштування виводів, те-се, хоча це HAL має робити.

96 Востаннє редагувалося taburyak (17.01.2018 12:12:04)

Re: STM32, Atolic TrueStudio, CubeMX

HAL_I2C_Master_Transmit оця HAL функція по передачі байтів вже повертає HAL_BUSY. Драйвер/бібліотека вже тут ні до чого. ХЗ що й робити.

97 Востаннє редагувалося ReAl (17.01.2018 12:13:50)

Re: STM32, Atolic TrueStudio, CubeMX

taburyak написав:

Що далі роблять try залізячники?

Ну не знаю, try я залізячник, true чи oldscull, але я можу користуватися або лише найвищим рівнем — грубо open("/dev/ttyS0") чи, можливо, та ж arduino, але без ручної роботи, з класом, який вже повертає там тиск чи вологість, а що за сенсор нижче — начхати, при ініціалізації вибрав потрібний клас і все. Тоді можна взагалі абстрагуватися від реального заліза, його виробника, моделі, ...

Або найнижчим (документація на мікросхему, на конкретний блок мікроконтролера), бо якщо вже доводиться працювати з конкретною залізякою, то чи через проміжний шар, чи ні, а все одно треба розуміти, як це конкретне залізо працює. А коли по опису зрозумів, то тоді вже й записи в регістри зробити нескладно.

Часом це в певному сенсі заважає, бо займає більше часу в порівнянні з варіантом, коли той проміжний шар відразу працює. Але коли та абстракція дірява

98

Re: STM32, Atolic TrueStudio, CubeMX

Це якась повна хрінь. Чомусь не працює i2c на мікроконтролері. Вже під'єднав розширювач портів PCF8574, взагалі простіше не буває. Адреса, байт++. І дивись як світлодіоди блимають. Фігушки. Треба інший мікроконтролер спробувати.

99

Re: STM32, Atolic TrueStudio, CubeMX

Взяв плату з STM32F407VG написав простенький сканер адрес по шині i2c - працює, адреси визначає.
Ладно думаю візьму вчорашню плату STM32F103RB, на якій нічого не виходило. Залив той самий сканер адрес на шині i2c.
І шо ви собі думаєте?.....
.
.
.
.
.
.
.
.
.
Бляхамухацекапєць - Визначає адреси!!!
Тільки адреси якісь не ті що я очікував, відповідно до доків. Розбираюсь далі.

100

Re: STM32, Atolic TrueStudio, CubeMX

з власного досвіду, embedded програмування це повний капець, іноді не сходиться те що описано в даташиті, а застосування всі йдуть з іншою маркіровкую чіпа, були такі випадки

Подякували: 0xDADA11C71