реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Передача по USART длинных чисел
MarYuriy
сообщение May 26 2012, 16:18
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 20-11-10
Пользователь №: 61 036



Здравствуйте!

Как можно отправить по 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

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

Go to the top of the page
 
+Quote Post
_Артём_
сообщение May 26 2012, 16:46
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(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?

Go to the top of the page
 
+Quote Post
Gorby
сообщение May 26 2012, 16:53
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 449
Регистрация: 28-10-04
Из: Украина
Пользователь №: 1 002



Код
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]);



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


--------------------
Умею молчать на 37 языках...
Go to the top of the page
 
+Quote Post
Xenia
сообщение May 26 2012, 16:55
Сообщение #4


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Лучше посылайте и принимайте в бинарном виде - будет быстрее и проще.

Объявите как 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]; }
Go to the top of the page
 
+Quote Post
MarYuriy
сообщение May 26 2012, 17:23
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 59
Регистрация: 20-11-10
Пользователь №: 61 036



Спасибо, Gorby и Xenia!

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

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

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

А я весь день просидел и ничего не мог сделать...

Сообщение отредактировал MarYuriy - May 26 2012, 17:25
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 02:48
Рейтинг@Mail.ru


Страница сгенерированна за 0.0139 секунд с 7
ELECTRONIX ©2004-2016