Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 21.04.2020, 21:30   #1
petrd
Senior Member
 
Регистрация: 09.02.2008
Адрес: Воронеж
Возраст: 48
Сообщений: 1,842
Вес репутации: 2279/86
petrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond repute
Отправить сообщение для petrd с помощью ICQ
По умолчанию Эпидерсия

Всем привет!

Компилятор XC8, PIC18.
Принимаем поток из определенного количества и назначения байт B1, B2, B3 по UART, который принимается в буфер uint8_t buf[3] и потом его надо разобрать по полям. Данные идут от младшего байта к старшему. B1- месяц, B2 - ст.байт год, B3 - мл.байт год, B2-B3 в формате BCD. Байты шлет стороннее устройство, поэтому только так и не иначе.
B1 = 0x01;
B2 = 0x20;
B3 = 0x19;

Для упорядочивания используется структура.

Код:
typedef struct {
   uint8_t    month;
   uint16_t   year;
} _time;

_time time;
Берем стандартную функцию memcpy() и прямо копируем из buf[] в структуру time
Код:
memcpy(&time, buf, 3);
А потом берем и смотрим что получилось в структуре:
Код:
time.month - 0x01
time.year - 0x1920
С месяцем нормально, а год то я ждал 0х2019. Теперь надо еще байты в полях структуры переворачивать. А как все задумывалось красиво. И нафига разработчики по ходу пьесы смешали little-endian и big-endian. Вот такая эпидерсия с полями размером больше байта!!!
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3)
petrd вне форума   Ответить с цитированием
Старый 22.04.2020, 00:06   #2
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 3,240
Вес репутации: 4064/120
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: Эпидерсия

Так это проблема стороннего устройства. От него порядок следования от старшего к младшему, причем месяц старше года. А у компилятора и у МК - первый младший. И структура так объявлена. В чем проблема МК и компилятора? И причем тут memcpy? Копирование не изменяло порядок.
Марк вне форума   Ответить с цитированием
Старый 22.04.2020, 01:24   #3
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 34
Сообщений: 1,427
Вес репутации: 2632/86
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: Эпидерсия

Цитата:
Сообщение от petrd Посмотреть сообщение
Всем привет!

Компилятор XC8, PIC18.
Принимаем поток из определенного количества и назначения байт B1, B2, B3 по UART, который принимается в буфер uint8_t buf[3] и потом его надо разобрать по полям. Данные идут от младшего байта к старшему. B1- месяц, B2 - ст.байт год, B3 - мл.байт год, B2-B3 в формате BCD. Байты шлет стороннее устройство, поэтому только так и не иначе.
B1 = 0x01;
B2 = 0x20;
B3 = 0x19;

Для упорядочивания используется структура.

Код:
typedef struct {
   uint8_t    month;
   uint16_t   year;
} _time;

_time time;
Берем стандартную функцию memcpy() и прямо копируем из buf[] в структуру time
Код:
memcpy(&time, buf, 3);
А потом берем и смотрим что получилось в структуре:
Код:
time.month - 0x01
time.year - 0x1920
С месяцем нормально, а год то я ждал 0х2019. Теперь надо еще байты в полях структуры переворачивать. А как все задумывалось красиво. И нафига разработчики по ходу пьесы смешали little-endian и big-endian. Вот такая эпидерсия с полями размером больше байта!!!
Главное, что бы устройство всегда слало в нужном порядке. Остальное делается присваиванием байтов полям структуры. Играться с указателем на структуру можно в исключительных случаях на одинаковых архитектурах и то не стоит из-за переносимости.
Рак вне форума   Ответить с цитированием
Старый 22.04.2020, 07:02   #4
petrd
Senior Member
 
Регистрация: 09.02.2008
Адрес: Воронеж
Возраст: 48
Сообщений: 1,842
Вес репутации: 2279/86
petrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond reputepetrd has a reputation beyond repute
Отправить сообщение для petrd с помощью ICQ
По умолчанию Re: Эпидерсия

Пост мой был по факту риторическим. Никаких претензий к МК и компилятору, поля структуры мной выдуманы. Это к тому, как было бы красиво и просто, если бы в реальном устройстве разработчики не сделали так как сделали. Хотя если работать с буфером, как со строкой, то это многое объясняет.
__________________
License MikroC, MikroC PRO and EasyPIC5 by mikroElektronika (the dead mikroICD replaced PICKit2 & PICKit3)
petrd вне форума   Ответить с цитированием
Старый 22.04.2020, 10:05   #5
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,418
Вес репутации: 4577/99
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: Эпидерсия

petrd
если люди заместо posix выдумали свой bcd формат времени, то это уже многое объясняет.
besogon вне форума   Ответить с цитированием
Старый 22.04.2020, 11:41   #6
siarzhuk
Senior Member
 
Аватар для siarzhuk
 
Регистрация: 08.11.2014
Возраст: 49
Сообщений: 190
Вес репутации: 1617/39
siarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant futuresiarzhuk has a brilliant future
По умолчанию Re: Эпидерсия

Цитата:
Сообщение от petrd Посмотреть сообщение
И нафига разработчики по ходу пьесы смешали little-endian и big-endian.

Network byte order же.



А пьесу, кстати, ещё Джонатан Свифт первым написал. Про Гулливера в стране лиллипутов. ;-)
siarzhuk вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

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

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

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


Часовой пояс GMT +3, время: 02:22.


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