Сопрягая разные железки, никогда не стоит забывать, что у каждого производителя свое королевство со своими правилами.
Если на AVR32 порядок байт — big-endian, то на x86 — интеловский, little-endian.
И, к примеру, тупо заслав от АЦП на cpc108 буфер unsigned short значений каналов, мы получим на процессоре совсем не то, что хотелось бы.
Магическая функция по конвертации из big-endian в little-endian нам поможет.
/*******************************************************************************
* sw16 - перевод 16-бит числа из Big Endian в Little Endian.
*
* INPUTS: item - значение для перевода.
*
* RETURNS: переведенное 16-бит значение
*/
UINT16 sw16(UINT16 item)
{
UINT16 temp = 0x0;
memcpy( (U8 *)&temp+1, (U8 *)&item, 1);
memcpy( (U8 *)&temp, (U8 *)&item+1, 1);
return (temp);
}
А у некоторых процессоров есть магический переключатель из Little-Orange в Big-Orange))
/*инлайн похорошему*/ UINT16 sw16(UINT16 item)
{
return ( ( (item & 0x00ff) <> 8) );
}
#define sw16(item) item=(((item & 0x00ff)<> 8))
ох же дрянь, не даёт мне бинарный сдвиг запостить.
«меньше — больше» подразумевалось как сдвиг влево, аналогичная операция была для старшего байта со сдвигом вправо
И правда…
Уведомление: swapBytes () на КБ 13