|
Вопрос по USART |
|
|
|
Feb 9 2007, 13:59
|
Участник

Группа: Новичок
Сообщений: 20
Регистрация: 22-12-06
Пользователь №: 23 802

|
Здравствуйте, есть маленький вопрос по USART. Мне нужно передавать по USART некую переменную int a (изменяется от 0 до 20000) в формате hex, причём так, чтобы длинна пакета передачи в любом случае оставалась неизменной. Тоесть при передаче числа a=18654 должна быть посылка 48DE, при а=3578 ->0DFA, при a=12 ->000C, при a=0 -> 0000. Первое что пришло в голову это вывод вот таким образом, дописывая недостающие ноли: Код if (а/256<16)printf("0"); printf("%X",а/256); if (а%256<16)printf("0"); printf("%X",а%256); Работает, но мне самому это жутко ненравится, наверняка для решения такой задачи есть способы поизящнее. Подскажите пожалуста как мне правильно выводить hex- значения. Компилятор CodeVision.
|
|
|
|
|
 |
Ответов
|
Feb 9 2007, 18:11
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(defunct @ Feb 9 2007, 16:53)  Цитата(prottoss @ Feb 9 2007, 14:26)  А почему нельзя просто в UDR записать старший и, по завершении отправки, младший байты???
И как это потом смотреть в терминале? раз автор использует printf видимо на то есть причины. Ну а чтобы смотреть в терминале прибавить "0" к цифре. Примерно так: uint16_t i; dig0 = (i >> 12) + '0'; dig1 = ((i >> 8) & 0xf) + '0'; dig2 = ((i >> 4) & 0xf) + '0'; dig3 = (i & 0xf) + '0'; Компилятор будет напрямую к байтам обращаться. Можно вместо переменных dig напрямую в UART.
|
|
|
|
|
Feb 9 2007, 18:52
|
Участник

Группа: Участник
Сообщений: 44
Регистрация: 22-06-06
Из: Kharkiv, UA
Пользователь №: 18 284

|
Цитата(SasaVitebsk @ Feb 9 2007, 17:11)  dig0 = (i >> 24) + '0'; dig1 = ((i >> 16) & 0xf) + '0'; dig2 = ((i >> 8) & 0xf) + '0'; dig3 = (i & 0xf) + '0'; Для хексов так не получится - в таблице символов между '9' и 'A' идут ':', ';'... Так что, наверное, проще всего перекодировать черем массив char HEX[16]={'0'... 'E','F'};
|
|
|
|
|
Feb 10 2007, 00:33
|
Гуру
     
Группа: Свой
Сообщений: 2 712
Регистрация: 28-11-05
Из: Беларусь, Витебск, Строителей 18-4-220
Пользователь №: 11 521

|
Цитата(ahulap @ Feb 9 2007, 19:52)  Цитата(SasaVitebsk @ Feb 9 2007, 17:11)  dig0 = (i >> 24) + '0'; dig1 = ((i >> 16) & 0xf) + '0'; dig2 = ((i >> 8) & 0xf) + '0'; dig3 = (i & 0xf) + '0';
Для хексов так не получится - в таблице символов между '9' и 'A' идут ':', ';'... Так что, наверное, проще всего перекодировать черем массив char HEX[16]={'0'... 'E','F'};  Да, чё то переклинило dig0 = (i >> 24) + '0'; if(dig0>'9') dig0 +=7; ну и так далее 2 defunct. Цитата Вы часто так поступаете? Подозреваю что нет.  Если честно, то совсем так не поступаю. Так поступаю в ASM, при отладочном выводе. У меня и задачи такой не было не разу. Я, обычно передаю бинарные данные, естественно в рамках какого-нибудь протокола, а на другом конце обрабатываю и представляю данные так, как мне нужно. Безусловно, я легко оперирую HEX данными (сказывается моя долгая практика работы). Нет - нет и проскакивает мысль, что человечеству давно пора на неё перейти.  Но, даже общаясь с сыном, и наблюдая за его затруднениями, понимаю, что отнюдь не все люди меня безоговорочно поддержат. Поскольку проги пишу не для внутреннего пользования, то редко приходится использовать такой формат данных. Из внешних протоколов он узаконен только в MODBUS, на сколько помню.
|
|
|
|
Сообщений в этой теме
Alex@ndr Вопрос по USART Feb 9 2007, 13:59 zltigo Цитата(Alex@ndr @ Feb 9 2007, 12:59) Здра... Feb 9 2007, 14:05 Alex@ndr Цитата(zltigo @ Feb 9 2007, 13:05) Цитата... Feb 9 2007, 14:28  Сергей Борщ Цитата(Alex@ndr @ Feb 9 2007, 13:28) Спас... Feb 9 2007, 14:34   Alex@ndr Цитата(Сергей Борщ @ Feb 9 2007, 13:34) А... Feb 10 2007, 01:44    defunct Цитата(Alex@ndr @ Feb 10 2007, 00:44) А п... Feb 10 2007, 06:38    Сергей Борщ Цитата(Alex@ndr @ Feb 10 2007, 00:44) А п... Feb 11 2007, 01:09   defunct Цитата(SasaVitebsk @ Feb 9 2007, 17:11) Н... Feb 9 2007, 19:08  prottoss Цитата(defunct @ Feb 9 2007, 19:53) Цитат... Feb 10 2007, 15:05 Kirill Frolov Цитата(Alex@ndr @ Feb 9 2007, 13:59) Тоес... Feb 11 2007, 00:21
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|