Для кого там комментарий?puff wrote:кстати, что делает SWAP_UINT16?
Code: Select all
// http://en.wikipedia.org/wiki/Endianness
#define SWAP_UINT16(x) ((x) << 8) | ((x) >> 8)
Для кого там комментарий?puff wrote:кстати, что делает SWAP_UINT16?
Code: Select all
// http://en.wikipedia.org/wiki/Endianness
#define SWAP_UINT16(x) ((x) << 8) | ((x) >> 8)
Если там передаётся только один LSB (что странно само по себе!), и оно ловит переходы между сотнями, то тогда, может быть, попробовать сделать так:puff wrote:когда значение меняется с первой сотни на вторую и на третью - одометр увеличивается (проехали очередные 100м)
Code: Select all
lastSignalTimeNt = nowNt;
engine->engineState.mazdaOdoCounter = (engine->engineState.mazdaOdoCounter + tickOdoDistance) % 200;
Code: Select all
txmsg.data8[1] = (uint8_t)(engine->engineState.mazdaOdoCounter & 0xff);
Code: Select all
engine->engineState.mazdaOdoCounter = (engine->engineState.mazdaOdoCounter + tickOdoDistance) % 200;
Code: Select all
engine->engineState.mazdaOdoCounter = 0
Code: Select all
if ((char)(engine->engineState.mazdaOdoCounter + tickOdoDistance)> 255))
engine->engineState.mazdaOdoCounter=engine->engineState.mazdaOdoCounter - 255;
engine->engineState.mazdaOdoCounter = engine->engineState.mazdaOdoCounter + tickOdoDistance;
Если mazdaOdoCounter float, то тогда лучше сделать так:puff wrote:будет приводить к накоплению ошибки.
Code: Select all
engine->engineState.mazdaOdoCounter = fmodf(engine->engineState.mazdaOdoCounter + tickOdoDistance, 200.0f);
Проблемы нет, это просто вопрос соблюдения "type safety" - использовалось явное приведение к знаковому типу ("char"), а конечный тип был объявлен как беззнаковый ("uint8_t"). Такое поведение может вызвать предупреждение компилятора: "conversion from 'char' to 'uint8_t', signed/unsigned mismatch", и его лучше избегать.puff wrote:про "поскольку char может быть знаковым" - поподробнее бы, в чем проблема?
Code: Select all
engine->engineState.mazdaOdoCounter = fmodf(engine->engineState.mazdaOdoCounter + tickOdoDistance, 255.0f);
Code: Select all
if ((char)(engine->engineState.mazdaOdoCounter + tickOdoDistance)> 255))
engine->engineState.mazdaOdoCounter=engine->engineState.mazdaOdoCounter - 255;
engine->engineState.mazdaOdoCounter = engine->engineState.mazdaOdoCounter + tickOdoDistance;
не очень понятно что такое & 0xff (наверное что-то связанное со знаком?)txmsg.data8[1] = (uint8_t)(engine->engineState.mazdaOdoCounter & 0xff);
Code: Select all
./hw_layer/can_hw.cpp:157:65: error: invalid operands of types 'float' and 'int' to binary 'operator&'
txmsg.data8[1] = (uint8_t)(engine->engineState.mazdaOdoCounter & 0xff);
Да, если float, то "& 0xff" не нужно.puff wrote:тэкс. на эту строчку компилятор поругался:напомню, engineState.mazdaOdoCounter - float.Code: Select all
./hw_layer/can_hw.cpp:157:65: error: invalid operands of types 'float' and 'int' to binary 'operator&' txmsg.data8[1] = (uint8_t)(engine->engineState.mazdaOdoCounter & 0xff);
Строго говоря, это не эквивалент. Если tickOdoDistance > 255, то код с if не выполнит задачу. К тому же, в fmodf нужно указывать 256.0f, если нужно "уместить" значение в байт.puff wrote:engine->engineState.mazdaOdoCounter = fmodf(engine->engineState.mazdaOdoCounter + tickOdoDistance, 255.0f);
будет по результату как раз эквивалентом
if ((char)(engine->engineState.mazdaOdoCounter + tickOdoDistance)> 255))
engine->engineState.mazdaOdoCounter=engine->engineState.mazdaOdoCounter - 255;
engine->engineState.mazdaOdoCounter = engine->engineState.mazdaOdoCounter + tickOdoDistance;
Ну да ...puff wrote:катушку?
Code: Select all
uint16t i = 65535
i++;
Code: Select all
float delta; // тут приращение пути за импульс в метрах
uint16t inc;
inc=(uint16t) (delta/255); //а тут - уже целочисленное значение
да не нужны преобразования типов - вообще не нужны.про целочисленный дискрет:
Code: Select all
float delta; // тут приращение пути за импульс в метрах uint16t inc; inc=(uint16t) (delta/255); //а тут - уже целочисленное значение
ничего не путаю?
Преобразования типов как раз были у puff, да ещё и с floatа, как оказалось. Вот и пришлось это обсуждать - ничего не поделаешь (название темы обязывает )..Maxi wrote:Смешно читать как вы тут 2 страницы обсуждаете проблемы преобразования типов (которых вообще нет). &-0xff флоату делаете...