Перейти к содержанию
    

Передача по USART длинных чисел

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

 

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

 

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

[code

del=del/10;

[/code]

 

Получаю:

04 02 09 04 00 06 07 00 02 04 02 09 04

 

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

Ну, что написали то и получаете...

И вам HEX нужен или DEC?

Тогда причём тут деление на 10?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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]);

 

 

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Объявите как 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); }

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

Удивила ваша скорость ответа.. :)

 

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

 

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

Изменено пользователем MarYuriy

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...