25.09.2018, 09:05
|
|
Прописка
Регистрация: 08.04.2017
Сообщений: 100
Сказал спасибо: 40
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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.
|
|
|
|
25.09.2018, 10:48
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,629
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
olegprom19, а почему не копируете при помощи memcpy:
Код:
|
memcpy(CAN1_Modbus.ID_424, RxMessage1.Data, 8); |
Все это можно упростить, если организовать массив с индексами, например:
Код:
|
static const uint16_t *idx = [424, 157, ...]; |
далее отыскиваем в этом массиве номер элемента, соответствующего принятому идентификатору и получаем индекс массива для модбаса.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
25.09.2018, 13:57
|
|
Прописка
Регистрация: 08.04.2017
Сообщений: 100
Сказал спасибо: 40
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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, ...]; |
далее отыскиваем в этом массиве номер элемента, соответствующего принятому идентификатору и получаем индекс массива для модбаса.
|
можно пример команды поиска
|
|
|
|
25.09.2018, 14:03
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,629
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от olegprom19
|
она идентична простому "поэлементному" копированию как у меня в примере?
|
да, но оптимизирована под конкретный камень.
Сообщение от olegprom19
|
можно пример команды поиска
|
Если индексов много, то сортируйте и ищите бинарным поиском (алгоритм элементарный), если немного, можно просто "в лоб" линейным поиском, инкрементируя индекс и проверяя, равно ли содержимое массива идентификатору входного сообщения.
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
26.09.2018, 08:05
|
|
Прописка
Регистрация: 08.04.2017
Сообщений: 100
Сказал спасибо: 40
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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.
|
|
|
|
26.09.2018, 10:47
|
|
Прописка
Регистрация: 29.06.2010
Сообщений: 104
Сказал спасибо: 14
Сказали Спасибо 9 раз(а) в 7 сообщении(ях)
|
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 команд а это в три раза дольше.
|
|
|
|
26.09.2018, 11:15
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,629
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
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-разрядный!!!
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
26.09.2018, 11:17
|
|
Прописка
Регистрация: 08.04.2017
Сообщений: 100
Сказал спасибо: 40
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
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 битные
|
|
|
|
26.09.2018, 11:19
|
|
Прописка
Регистрация: 08.04.2017
Сообщений: 100
Сказал спасибо: 40
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от eddy
|
А можно было бы просто за один присест 32 бита переместить. Камушек-то 32-разрядный!!!
|
а зачем?
с кана прилетают 8-битные данные
и в модбас пулять те же самые
зачем из преобразовывать?
или вы имели ввиду аппаратный DMA?
По поводу поиска ID
функция сравнения все равно 32-битная, если не ошибаюсь
т.е. МК без разницы че сравнивать 32-битные данные или 16-битные
Последний раз редактировалось olegprom19; 26.09.2018 в 11:26.
|
|
|
|
26.09.2018, 11:28
|
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,629
Сказал спасибо: 115
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Изучаем STM32 Cortex M3
Сообщение от olegprom19
|
с кана прилетают 8-битные данные
|
хранящиеся в виде 64-битного "конгломерата"!
Сообщение от olegprom19
|
зачем их преобразовывать?
|
чтобы вместо полутора десятка операций потратить две-три!
Ну и насчет 29 бит вы тоже неправы: очень редко встречаются такие извращения, обычно короткие идентификаторы используются (т.к. по-любому в физический уровень CAN столько устройств не влезет, разве что каждое устройство будет занимать несколько миллионов идентификаторов, но это решается проще - более высоким транспортным уровнем).
__________________
Союз Советских Социалистических Округов Северной Америки
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:10.
|
|