Объединить 5 или более байтов и преобразовать их в десятичную, а затем в ASCII
У меня есть этот массив ниже:
dataIn[5] = 0x88;
dataIn[6] = 0x2A;
dataIn[7] = 0xC7;
dataIn[8] = 0x2B;
dataIn[9] = 0x00;
dataIn[10] = 0x28;
Мне нужно преобразовать эти значения в десятичные, потому что после этого мне нужно преобразовать десятичные значения в ASCII и отправить в UART.
Например:
| Hexa | Decimal | ASCII (I need to send this data to UART)
| 0x882AC72B00 | 584 833 248 000 | 35 38 34 38 33 33 32 34 38 30 30 30
| 0x5769345612 | 375 427 192 338 | 33 37 35 34 32 37 31 39 32 33 33 38
Моя проблема: эти данные должны собрать все вместе и преобразовать в десятичную, но мой компилятор только для 4 байтов, и я не знаю, как это сделать, потому что у меня 5 или более байтов.
Ps.: Я использую PIC18F46K80 и C18 компилятор
[Изменено]
Нажмите здесь, чтобы увидеть, что происходит, когда я пытаюсь использовать более 4 байтов. Это моя проблема
Кто-нибудь может мне помочь?
Заранее спасибо.
2 ответа
Если я хорошо понял, прежде всего вы должны определить союз следующим образом:
typedef union _DATA64
{
uint64_t dataIn64;
uint8_t dataIn8[8];
}tu_DATA64;
а затем скопируйте шестнадцатеричные значения в предыдущем определенном объединении:
uint8_t i;
tu_DATA64 data;
...
data.dataIn64=0;
for(i=0; i<5; i++)
data.dataIn8[4-i]=dataIn[i];
Теперь вы должны преобразовать 64-битную переменную в строку, используя lltoa
Функция, как предлагается в этом посте:
char *str;
...
str=lltoa(data.dataIn64,10);
str
строка буфера для отправки.
Рассматривали ли вы написать свою собственную функцию преобразования? Вот рабочий пример, который можно настроить на любую длину.
ВНИМАНИЕ: Мои навыки С не самые лучшие!
#include <stdio.h>
/******************************************************************************/
void base10_ascii(unsigned char data[], int data_size, char ans[], int ans_size) {
char done;
do {
char r = 0;
done = 1;
for (int i=0; i<data_size; i++) {
int b = (r<<8) + data[i]; //previous remainder and current byte
data[i] = b / 10;
if (data[i] > 0) done = 0; //if any digit is non-zero, not done yet
r = b % 10;
}
for (int i=ans_size-1; i>0; i--) ans[i] = ans[i-1]; //bump up result
ans[0] = r + '0'; //save next digit as ASCII (right to left)
} while (!done);
}
/******************************************************************************/
int main(){
char outputBuffer[15] = {0};
char data[] = { 0x88, 0x2A, 0xC7, 0x2B, 0x00 }; //584833248000
base10_ascii(data,sizeof data,outputBuffer,sizeof outputBuffer);
printf("Output: %s\n",outputBuffer);
return 0;
}