kil00 0 26 мая, 2012 Опубликовано 26 мая, 2012 · Жалоба Здравствуйте! Как можно отправить по USART переменную unsigned long равную, допустим, 4294967294 (0xFFFF FFFE) таким образом, чтобы получить на ПК эти значения в HEX. То есть поразрядно поочереди получить FF, FF, FF, FE? Пока ничего лучше я не придумал, чем это 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 Но это не совсем то, что хотелось бы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Артём__ 0 26 мая, 2012 Опубликовано 26 мая, 2012 · Жалоба [code del=del/10; [/code] Получаю: 04 02 09 04 00 06 07 00 02 04 02 09 04 Но это не совсем то, что хотелось бы. Ну, что написали то и получаете... И вам HEX нужен или DEC? Тогда причём тут деление на 10? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Gorby 6 26 мая, 2012 Опубликовано 26 мая, 2012 · Жалоба 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 38 26 мая, 2012 Опубликовано 26 мая, 2012 · Жалоба Лучше посылайте и принимайте в бинарном виде - будет быстрее и проще. Объявите как 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; } А когда принимать будете, делайте всё наоборот - принимайте в data.bytes, а числовой результат получите в 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; } Тогда через этот указатель можно таскать байты из long-переменной или, наоборот, в нее запихивать. А если не боитесь сложных выражений :), то можно таскать байты из переменной явным переопределением ее типа, не создавая для этого указатель: unsigned long mass = 4294967294; for(i=0; i<4; i++) { while (!(USART1->SR & USART_SR_TXE)) USART1->DR=((char*)&mass); } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kil00 0 26 мая, 2012 Опубликовано 26 мая, 2012 (изменено) · Жалоба Спасибо, Gorby и Xenia! Воспользовался объединением - это то, что надо. Всё работает. Удивила ваша скорость ответа.. :) Xenia, а со вторым вариантом буду разбираться. А я весь день просидел и ничего не мог сделать... Изменено 26 мая, 2012 пользователем MarYuriy Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться