Я пытаюсь создать встроенный c-проект, в котором я буду вводить 7 символов и делать с ними некоторые вычисления — теперь у меня возникла проблема с переводом на работу — я работаю с ATMEGA 2560, где выводю символы на uart.
Вот код:
volatile char daata[8] = "123:456\0";
volatile char recdata[8];
volatile char data = 0;
volatile char byte;
volatile int minimum;
volatile int maximum;
volatile char mx;
volatile char mi;
и моя функция использует:
void putsUSART0(char *ptr)
{
while(*ptr)
{
putchUSART0(*ptr);
ptr++;
}
}
а также
void putchUSART0(char tx)
{
while(!(UCSR0A & (1 << UDRE0))); // wait for empty transmit buffer
UDR0 = tx;
}
где код, над которым я работаю:
minimum = (100 * (daata[0] - 0x30) + 10 * (daata[1] - 0x30) + daata[2] - 0x30);
maximum = daata[6] - 0x30 + 10 * (daata[5] - 0x30) + 100 * (daata[4]);
mi = minimum + 0x30;
putsUSART0("mimimum is:");
//putchUSART0(minimum );
putsUSART0(mi);
putsUSART0("maximum is:");
putchUSART0(maximum);
_delay_ms(5000);
status = requestsample;
Проблема в том, что мой вывод
mimimum is: максимум is: ˆ
Может кто-нибудь объяснить странное поведение.
char buf[15];
...
mi = minimum + 0x30;
sprintf(buf, "%d", mi);
putsUSART0("mimimum is:");
//putchUSART0(minimum );
putsUSART0(buf);
Сделайте подобное для максимума также
Вы отправляете значение символа ASCII (и пытаетесь преобразовать его в символ путем добавления 0x30
что не является правильным способом, вам нужно преобразовать все цифры) и, возможно, распечатать его без преобразования на другом конце.
Из любезного комментария Лундин
sprintf (), вероятно, не вариант, так как это встроенный проект,
где эта функция обычно слишком медленная и занимает много памяти.
Вы также можете написать свою собственную функцию, которая может преобразовать число в строку:
const char *numToStr(int n) {
/* Non-reentrant, returned buffer will be invalidated on subsequent call */
#define BUF_SIZE 15
static char buf[BUF_SIZE] = {0};
int pos = BUF_SIZE - 1;
int neg = 0;
if(n < 0) {
neg = 1;
n *= -1;
}
do {
buf[--pos] = (n % 10) + '0';
n /= 10;
} while(n);
if(neg) buf[--pos] = '-';
return &buf[pos];
}
И используйте это, чтобы преобразовать число в строку.
Из любезного комментария Chux
Сбой для numToStr (INT_MIN) Suggest
if(n < 0) { neg = 1; } else { n =
-n; } do { buf[--pos] = '0' - (n % 10); n /= 10; } while(n);
Версия для обработки INT_MIN
можно записать как:
const char *numToStr(int n) {
/* Non-reentrant, returned buffer will be invalidated on subsequent call */
#define BUF_SIZE 15
static char buf[BUF_SIZE] = {0};
int pos = BUF_SIZE - 1;
int neg = 0;
if(n < 0) {
neg = 1;
} else {
n = -n;
}
do {
buf[--pos] = '0' - (n % 10);
n /= 10;
} while(n);
if(neg) buf[--pos] = '-';
return &buf[pos];
}
daata[4]
должно быть daata[4] - 0x30
, Это заставляет вас получить 100 * 52 вместо 100 * 4, как задумано.
Способ избежать простых ошибок, подобных этой, заключается в некоторой дисциплине кодирования: не помещайте все в одну строку, будьте последовательны и избегайте «магических чисел».
minimum = (100 * (data[0] - '0')
+ ( 10 * (data[1] - '0')
+ ( 1 * (data[2] - '0');
maximum = (100 * (data[4] - '0'))
+ ( 10 * (data[5] - '0'))
+ ( 1 * (data[6] - '0'));