2015-08-26 2 views
0

Im интерфейс с акселерометром с TivaC и отображением RAW-данных на UART.Чтение отрицательных значений акселерометра

void main(){ 

    signed int accelerationX; 

    accelerationX = getAcceleration_X(); 
    if (accelerationX>=0){ 
    UART_OutString("\r\nX Axl: "); 
    UART_OutUDec((unsigned short) accelerationX); 
    } else { 
    UART_OutString("\r\nX Axl: - "); 
    UART_OutUDec((unsigned short) (accelerationX*-1)); 
    } 
} 

Такой тип кода, который я получил на каком-то форуме. Я не понимаю, почему «ускорениеX * -1» выполняется, когда ускорение отрицательно.

+0

'ускорениеX * -1' является просто неясным представлением' -accelerationX' – j123b567

ответ

0

accelerationX - целое число со знаком, но, похоже, UART_OutUDec ожидает целое число без знака. Поэтому они должны печатать знак минуса, за которым следует абсолютное значение accelerationX (знак удален).

0

Это потому, что число отправляется как unsigned short вместо знакового количества. Было бы полезно посмотреть, что делает UART_OutUDec, но это также не имеет большого значения, потому что UART просто отправит все, что было сброшено в его регистре данных. В стороне, UART_OutUDec, скорее всего, переводит unsigned short в ASCII. Приемник вряд ли поймет, что значение должно быть отрицательным, поэтому знак минус передается с тем, что фактически является абсолютным значением ускорения.

Что-то нужно учитывать, что не все приемники равны. Многие люди предполагают, что устройство на другом конце - компьютер или что-то, что понимает ASCII, но это не всегда так. Я работал над встроенными системами, которые передавали символы ASCII, смешанные с символами, отличными от ASCII, которые сбивают с толку и их трудно поддерживать, но эти системы существуют. Это почти наверняка не относится к вашей ситуации просто потому, что это редко, но в будущем, если вы дадите дополнительные сведения о получателе, это поможет прояснить, как данные должны быть отформатированы и переданы.

+0

В случае вывода ASCII, который будет отображаться в терминале, типы данных имеют значение. Я подозреваю, что это имеет место здесь, иначе процедуры UART просто возьмут массив необработанных байтов данных. – Lundin

+0

Я знаю это, и это ничего не меняет, что я сказал. UART отправит независимо от типа данных, поэтому пользователю придется иметь дело с типизацией, поэтому я сказал, что приемник вряд ли поймет отрицательное значение, учитывая наличие структуры управления в первую очередь. Кроме того, OutUDec явно переводит unsigned short в ASCII, поэтому код не использует необработанную функцию передачи. – Anthony

Смежные вопросы