Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту


 
Опции темы
Непрочитано 25.09.2018, 09:05  
olegprom19
Прописка
 
Регистрация: 08.04.2017
Сообщений: 100
Сказал спасибо: 40
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
olegprom19 на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Доброго дня.
Делаю шлюз CAN (4 канала) ‹›Modbus RTU Slave (Modbus TCP).
есть вопрос по структурам и указателям
STMы как и Си изучаю с начала лета.
Пока не во всем ещё разобрался.
CAN и Modbus работают не зависимо друг от друга
т.е. CAN принимает данные и складывает в буфер
Modbus RTU Slave принимает запрос считывает из буфера, и отдает данные.
Прием и передача работает.
Вопрос в преобразовании данных
т.е. приняли CAN пакет c ID 424 и нужно положить данные (8 байт) в определенную ячейку массива, приняли CAN пакет c ID 157....
Далее при запросе Modbus нужно брать из определенной ячейки массива данные.
можно конечно сделать сравнение принятого ID и запись типа так
if (RxMessage1.StdId == 424)
{
CAN1_Modbus.ID_424[0]=RxMessage1.Data[0];
CAN1_Modbus.ID_424[1]=RxMessage1.Data[1];
CAN1_Modbus.ID_424[2]=RxMessage1.Data[2];
CAN1_Modbus.ID_424[3]=RxMessage1.Data[3];
CAN1_Modbus.ID_424[4]=RxMessage1.Data[4];
CAN1_Modbus.ID_424[5]=RxMessage1.Data[5];
CAN1_Modbus.ID_424[6]=RxMessage1.Data[6];
CAN1_Modbus.ID_424[7]=RxMessage1.Data[7];
}
или так:
switch(RxMessage1.StdId)
case 424:

но это будет длинная портянка на 50 параметров
а потом еще чтение также на 50 параметров
с учетом 4-х каналов еще умножаем на 4

понимаю что это не феншуй
нужно ID также добавить как 1-й элемент массива данных
производить поиск по нему и писать/читать данные
нет понимания какой командой это сделать
т.к. со структурами не разобрался еще
может пример есть у кого подобный глянуть
Заранее благодарен!
Реклама:

Последний раз редактировалось olegprom19; 25.09.2018 в 09:07.
olegprom19 вне форума  
Непрочитано 25.09.2018, 10:48  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

olegprom19, а почему не копируете при помощи memcpy:
Код:
memcpy(CAN1_Modbus.ID_424, RxMessage1.Data, 8);
Все это можно упростить, если организовать массив с индексами, например:
Код:
static const uint16_t *idx = [424, 157, ...];
далее отыскиваем в этом массиве номер элемента, соответствующего принятому идентификатору и получаем индекс массива для модбаса.
__________________
Смерть бандеровской мразоте!
eddy вне форума  
Сказали "Спасибо" eddy
olegprom19 (25.09.2018)
Непрочитано 25.09.2018, 13:57  
olegprom19
Прописка
 
Регистрация: 08.04.2017
Сообщений: 100
Сказал спасибо: 40
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
olegprom19 на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от eddy Посмотреть сообщение
olegprom19, а почему не копируете при помощи memcpy:
пока не изучил эту функцию
она идентична простому "поэлементному" копированию как у меня в примере?
или циклу типа
if (RxMessage1.StdId == 424)
{for(int i = 0; i ‹ 8; i++)
{CAN1_Modbus.ID_424[i]=RxMessage1.Data[i];
}

Сообщение от eddy Посмотреть сообщение
Все это можно упростить, если организовать массив с индексами, например:
Код:
static const uint16_t *idx = [424, 157, ...];
далее отыскиваем в этом массиве номер элемента, соответствующего принятому идентификатору и получаем индекс массива для модбаса.
можно пример команды поиска
olegprom19 вне форума  
Непрочитано 25.09.2018, 14:03  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от olegprom19 Посмотреть сообщение
она идентична простому "поэлементному" копированию как у меня в примере?
да, но оптимизирована под конкретный камень.
Сообщение от olegprom19 Посмотреть сообщение
можно пример команды поиска
Если индексов много, то сортируйте и ищите бинарным поиском (алгоритм элементарный), если немного, можно просто "в лоб" линейным поиском, инкрементируя индекс и проверяя, равно ли содержимое массива идентификатору входного сообщения.
__________________
Смерть бандеровской мразоте!
eddy вне форума  
Сказали "Спасибо" eddy
olegprom19 (25.09.2018)
Непрочитано 26.09.2018, 08:05  
olegprom19
Прописка
 
Регистрация: 08.04.2017
Сообщений: 100
Сказал спасибо: 40
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
olegprom19 на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от eddy Посмотреть сообщение
Если индексов много, то сортируйте и ищите бинарным поиском (алгоритм элементарный), если немного, можно просто "в лоб" линейным поиском, инкрементируя индекс и проверяя, равно ли содержимое массива идентификатору входного сообщения.
Спасибо что уделяете время!
но с поисками как то не приходилось работать как и с массивами
киньте может пример кода для освоения
запутался немного
typedef struct {
uint16_t id;
uint8_t data[8];
} can_element;
can_element can1[50];
can_element can2[50];
can_element can3[50];
can_element can4[50];

for (int i = 0; i ‹ 50; i++)
{
if(can1[i].id == RxMessage1.StdId){
Нашли.
memcpy(can1.data, RxMessage1.data, ;
Выход из цикла.
break;
}
}

Последний раз редактировалось olegprom19; 26.09.2018 в 08:37.
olegprom19 вне форума  
Непрочитано 26.09.2018, 10:47  
neyvert
Прописка
 
Регистрация: 29.06.2010
Сообщений: 104
Сказал спасибо: 14
Сказали Спасибо 9 раз(а) в 7 сообщении(ях)
neyvert на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от olegprom19 Посмотреть сообщение
uint16_t id;
Для ID будет маловато, 29 битный ID не влезет!
Соответственно на простое копирование из 8 битного массива 4 байтов в 32 битную переменную id_data, таким способом:
id_data = moimassiv[0]‹‹8;
id_data = ( id_data + moimassiv[1])‹‹8;
id_data = ( id_data + moimassiv[2])‹‹8;
id_data = id_data + moimassiv[3];
Уходит 14 asm команд, если то же самое проделать применяя memcpy то получаем уже 47 команд а это в три раза дольше.
neyvert вне форума  
Непрочитано 26.09.2018, 11:15  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от neyvert Посмотреть сообщение
id_data = moimassiv[0]‹‹8;
id_data = ( id_data + moimassiv[1])‹‹8;
id_data = ( id_data + moimassiv[2])‹‹8;
id_data = id_data + moimassiv[3];
А можно было бы просто за один присест 32 бита переместить. Камушек-то 32-разрядный!!!
__________________
Смерть бандеровской мразоте!
eddy вне форума  
Непрочитано 26.09.2018, 11:17  
olegprom19
Прописка
 
Регистрация: 08.04.2017
Сообщений: 100
Сказал спасибо: 40
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
olegprom19 на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от neyvert Посмотреть сообщение
Для ID будет маловато, 29 битный ID не влезет!
Соответственно на простое копирование из 8 битного массива 4 байтов в 32 битную переменную id_data, таким способом:
id_data = moimassiv[0]‹‹8;
id_data = ( id_data + moimassiv[1])‹‹8;
id_data = ( id_data + moimassiv[2])‹‹8;
id_data = id_data + moimassiv[3];
Уходит 14 asm команд, если то же самое проделать применяя memcpy то получаем уже 47 команд а это в три раза дольше.
не совсем понял про data
ID У меня 11-бит, я знаю что бывают расширенные ID 29 бит
думал вначале сделать uint32_t id только зачем;
а данные там и там 8 битные
olegprom19 вне форума  
Непрочитано 26.09.2018, 11:19  
olegprom19
Прописка
 
Регистрация: 08.04.2017
Сообщений: 100
Сказал спасибо: 40
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
olegprom19 на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от eddy Посмотреть сообщение
А можно было бы просто за один присест 32 бита переместить. Камушек-то 32-разрядный!!!
а зачем?
с кана прилетают 8-битные данные
и в модбас пулять те же самые
зачем из преобразовывать?
или вы имели ввиду аппаратный DMA?

По поводу поиска ID
функция сравнения все равно 32-битная, если не ошибаюсь
т.е. МК без разницы че сравнивать 32-битные данные или 16-битные

Последний раз редактировалось olegprom19; 26.09.2018 в 11:26.
olegprom19 вне форума  
Непрочитано 26.09.2018, 11:28  
eddy
Почётный гражданин KAZUS.RU
 
Аватар для eddy
 
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,581
Сказал спасибо: 115
Сказали Спасибо 806 раз(а) в 583 сообщении(ях)
eddy на пути к лучшему
По умолчанию Re: Изучаем STM32 Cortex M3

Сообщение от olegprom19 Посмотреть сообщение
с кана прилетают 8-битные данные
хранящиеся в виде 64-битного "конгломерата"!
Сообщение от olegprom19 Посмотреть сообщение
зачем их преобразовывать?
чтобы вместо полутора десятка операций потратить две-три!

Ну и насчет 29 бит вы тоже неправы: очень редко встречаются такие извращения, обычно короткие идентификаторы используются (т.к. по-любому в физический уровень CAN столько устройств не влезет, разве что каждое устройство будет занимать несколько миллионов идентификаторов, но это решается проще - более высоким транспортным уровнем).
__________________
Смерть бандеровской мразоте!
eddy вне форума  
 

Закладки
Опции темы

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

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Школа АRMрестлинга Uragan90 Микроконтроллеры, АЦП, память и т.д 54 22.08.2011 16:13
ARM Cortex M3 + Linux SiMiLya Микроконтроллеры, АЦП, память и т.д 10 17.06.2011 17:20
Помогите с STM32 - очень нужно... yakuzaa Микроконтроллеры, АЦП, память и т.д 60 04.08.2010 11:04
Как добавить поддержку для STM32 SFHK Микроконтроллеры, АЦП, память и т.д 11 18.12.2009 18:09


Часовой пояс GMT +4, время: 09:04.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot