Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Передача по USART длинных чисел
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
MarYuriy
Здравствуйте!

Как можно отправить по USART переменную unsigned long равную, допустим, 4294967294 (0xFFFF FFFE) таким образом, чтобы получить на ПК эти значения в HEX. То есть поразрядно поочереди получить FF, FF, FF, FE?

Пока ничего лучше я не придумал, чем это
CODE
unsigned long TIM5secs=4294967294;

long del = 1000000000;
int sP=0;
char secsMass[10];
int i = 0;

while (del!=1)
{
sP=TIM5secs/del;
secsMass[i]=sP;
TIM5secs=TIM5secs-sP*del;


while (!(USART1->SR & USART_SR_TXE)) {}
USART1->DR=secsMass[i];
i++;
del=del/10;
}


Получаю:
04 02 09 04 00 06 07 00 02 04 02 09 04

Но это не совсем то, что хотелось бы.

_Артём_
Цитата(MarYuriy @ May 26 2012, 19:18) *
[code
del=del/10;
[/code]

Получаю:
04 02 09 04 00 06 07 00 02 04 02 09 04

Но это не совсем то, что хотелось бы.

Ну, что написали то и получаете...
И вам HEX нужен или DEC?
Тогда причём тут деление на 10?

Gorby
Код
unsigned long Mylong = 4294967294;
char buffer[9]; // 8+null terminator

sprintf (buffer, "%Xl", Mylong);
while(*buffer) TransmittChar(*buffer++);






union {
unsigned long Mylong;
char buf[4];
}MyUnion;

MyUnion.Mylong = 4294967294;

TransmittChar(MyUnion.buf[3]);
TransmittChar(MyUnion.buf[2]);
TransmittChar(MyUnion.buf[1]);
TransmittChar(MyUnion.buf[0]);



Действительно, не совсем понятно, что вам нужно. Привел два примера. В первом получите искомую текстовую строку. Во втором - настоящие хексы. Надеюсь, оно вам надо.
Xenia
Лучше посылайте и принимайте в бинарном виде - будет быстрее и проще.

Объявите как union переменную типа long и массив типа char:
union { unsigned long mass; char bytes[4]; } data;
Тогда они по памяти будут тождественными.
Потом кладете в long-переменную число, а из ее char-дубля отправляете по порядку 4 байта по UART.
data.mass = 4294967294;
for(i=0; i<4; i++) { while (!(USART1->SR & USART_SR_TXE)) USART1->DR=data.bytes[i]; }
А когда принимать будете, делайте всё наоборот - принимайте в data.bytes[i], а числовой результат получите в data.mass.

---

А можно соорудить то же самое, сформировав на log-переменную указатель типа char:
unsigned long mass = 4294967294;
char *pbytes = (char*)&mass;
for(i=0; i<4; i++) { while (!(USART1->SR & USART_SR_TXE)) USART1->DR=pbytes[i]; }
Тогда через этот указатель можно таскать байты из long-переменной или, наоборот, в нее запихивать.

А если не боитесь сложных выражений sm.gif, то можно таскать байты из переменной явным переопределением ее типа, не создавая для этого указатель:
unsigned long mass = 4294967294;
for(i=0; i<4; i++) { while (!(USART1->SR & USART_SR_TXE)) USART1->DR=((char*)&mass)[i]; }
MarYuriy
Спасибо, Gorby и Xenia!

Воспользовался объединением - это то, что надо. Всё работает.

Удивила ваша скорость ответа.. sm.gif

Xenia, а со вторым вариантом буду разбираться.

А я весь день просидел и ничего не мог сделать...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.