Esp32 передача по uart в ардуино мега

fsdb
Offline
Зарегистрирован: 24.10.2015

Из serial2 esp32 передаю в serial 2 Arduino mega на скорости 115200. Скетч работал между ардуино про мини 3.3в и Arduino mega ранее. Сейчас залил его на esp32. Передача данных есть но почему то читается только по 1 байту за раз. Вопрос прошу пример скетча по передачи int из есп32 в мегу. Может быть я что то не так делаю.

fsdb
Offline
Зарегистрирован: 24.10.2015

Проблема именно в приеме. Как правильно принять . Serial.write отправляю

fsdb
Offline
Зарегистрирован: 24.10.2015

Читаю так и по кругу получаю разные crc контрольные одни и те же. Делаю вывод не принимает целиком . Когда пробую serial.println и читать то тоже читает по 1 символу(скетч уже другой)

// структура данных посылки

 

 

 

https://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

 

 

 

 

rkit
Offline
Зарегистрирован: 23.11.2016

Нельзя двоичные данные передавать между разными архитектурами. Они разные. Передавай строкой.

b707
Offline
Зарегистрирован: 26.05.2017

rkit пишет:

Нельзя двоичные данные передавать между разными архитектурами. Они разные. Передавай строкой.

 с какого? - можно конечно.

rkit
Offline
Зарегистрирован: 23.11.2016

Так - нельзя. Хочешь читать ему четыре часа лекций как правильно - валяй.

fsdb
Offline
Зарегистрирован: 24.10.2015

Не понимаю почему стандартный пример ардуино не читает данные целиком. Тайм-аут что ли нужно другой. Под рукой нет возможности пока проверить. Куда копать то скажите

fsdb
Offline
Зарегистрирован: 24.10.2015

Не понимаю почему стандартный пример ардуино не читает данные целиком. Тайм-аут что ли нужно другой. Под рукой нет возможности пока проверить. Куда копать то скажите

b707
Offline
Зарегистрирован: 26.05.2017

fsdb

если не хотите проблем - никогда не используйте неконкретные спецификаторы типов аля int.

struct MyData {

int val_i;

byte crc; // байт crc
};

пользуйтесь вместо этого типами с точным указанием размера - int8 int16 int32

В чем проблема? -ваши "int" на ардуино Меге это 2 байта, то есть int16, а на ЕСП32 инт 4 байта, то есть int32, Структура, вроде бы описанная одинаково на двух концах линии - никогда не будет иметь одинаковый CRC

 

И второе - это выравнивание. В памяти МК данные не всегда лежат подряд байт к байту, иногда они выравниваются по два или по 4 байта. В результате структура, даже описанная побайтно, опять может получится разной на двух сторонах линии. Я не мастак много обьяснять в 8 утра :), поэтому найдите в гугле что-нибудь про "выравнивание данных по границе слова" и про директиву pack

 

b707
Offline
Зарегистрирован: 26.05.2017

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

rkit
Offline
Зарегистрирован: 23.11.2016

b707 пишет:

пользуйтесь вместо этого типами с точным указанием размера - int8 int16 int32

это всё тоже не гарантировано будет одинаковым

fsdb
Offline
Зарегистрирован: 24.10.2015

Спасибо попробую. Мне разницы нет. Раз в секунду передача. Главное crc

fsdb
Offline
Зарегистрирован: 24.10.2015

спасибо. через String реализовал передачу. без проблем. нужно придумать какой то простой алгоритм проверки контрольных сумм... одним числом . передаю число от -999 до 999