Получать и сохранять шестнадцатеричные значения в массивах [STM32] - PullRequest
0 голосов
/ 17 мая 2019

Я хочу получать и сохранять шестнадцатеричные значения с ПК на STM32-uC через UART.

Полученные HEX-значения выглядят следующим образом:

FF00 4a85 04b5 08aa 6b7r 00FF

(FF00 и00FF просто проверяют байты)

Я хочу сохранить много (разных) строк данных, которые выглядят так: 4a85 04b5 08aa 6b7r 4a85 04b5 08aa 6b7r 4a85 04b5 08aa 6b7r 4a85 04b5 08aa 6b7r 4a85 04b5 08aa 6b7r 4a85 04b5 08aa 6b7r ...................

Позже мне нужно читать память и получать значения int из каждого2 байта:

04D1 -> 1233

  1. Вопрос:

Я создаю несколько массивов

volatile uint8_t testarrays[8][5000]; //data storage

и инициализирую с помощью:

uint8_t received_str[12] //4 Bytes: `FF 00 and 00 FF` checksum
uint32_t h=0;
while(h<5000){
  if (receive_done_flag == TRUE) { //UART receive data
  testarrays[0][h]=received_str[2];
  testarrays[1][h]=received_str[3];
  testarrays[2][h]=received_str[4];
  testarrays[3][h]=received_str[5];
  testarrays[4][h]=received_str[6];
  testarrays[5][h]=received_str[7];
  testarrays[6][h]=received_str[8];
  testarrays[7][h]=received_str[9];
  }
  receive_done_flag == FALSE
  h++;
}

Верна ли моя идея?

Вопрос:

Как позже прочитать данные из хранилища?uint16_t x = 0;uint16_t y = 0;uint8_t motorspeed_hex [8];

uint16_t speed_hex_M1;
uint16_t speed_hex_M2;
uint16_t speed_hex_M3;
uint16_t speed_hex_M4;

while(y<vert_length){
   x=0;
   while(x<hor_length){
   motorspeed_hex[x] = testarrays[x][y];
   x++;
   }
uint16_t speed_hex_M1 >> 8 = motorspeed_hex[0]
uint16_t speed_hex_M1 = motorspeed_hex[1]
uint16_t speed_hex_M2 >> 8  = motorspeed_hex[2]
uint16_t speed_hex_M2 = motorspeed_hex[3]
uint16_t speed_hex_M3 >> 8  = motorspeed_hex[4]
uint16_t speed_hex_M3 = motorspeed_hex[5]
uint16_t speed_hex_M4 >> 8  = motorspeed_hex[6]
uint16_t speed_hex_M4 = motorspeed_hex[7]
y++;
}

Теперь я должен преобразовать speed_hex_M1 .. в int-значения, как я могу сделать это в c?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

О "receive_done_flag" - я использую подпрограмму прерывания для UART. Если данные получены, «receive_done_flag» будет установлен в TRUE, после того, как данные будут сохранены, я установил их в FALSE и ожидаю новых данных через UART.

Это была просто идея / вопрос, как я могу получить значения типа int из hex? Пример:

2 байта

uint16_t speed_hex_M1 = 04D1; 
uint16_t speed_hex_M2 = 04D1;
uint16_t speed_hex_M3 = 04D1;
uint16_t speed_hex_M4 = 04D1;

это неправильно, я знаю (правильный метод ниже?):

uint16_t speed_hex_M1 >> 8 = motorspeed_hex[0]
uint16_t speed_hex_M1 = motorspeed_hex[1]
uint16_t speed_hex_M2 >> 8  = motorspeed_hex[2]
uint16_t speed_hex_M2 = motorspeed_hex[3]
uint16_t speed_hex_M3 >> 8  = motorspeed_hex[4]
uint16_t speed_hex_M3 = motorspeed_hex[5]
uint16_t speed_hex_M4 >> 8  = motorspeed_hex[6]
uint16_t speed_hex_M4 = motorspeed_hex[7]

т. Е. 1 байт

uint8_t motorspeed_hex[0] = 0x04;
uint8_t motorspeed_hex[1] = 0xD1;
....................

и затем я могу сохранить его в нескольких массивах uint8_t, а затем прочитать и преобразовать шестнадцатеричные значения в десятичное 04D1 -> 1233.

РЕДАКТИРОВАТЬ:

motorspeed_hex [0] = motorspeed_hex [0] | ((speed_hex_M1 & 0xFF00) >> 8); motorspeed_hex [1] = motorspeed_hex [1] | (speed_hex_M1 & 0x00FF);

0 голосов
/ 18 мая 2019

Слишком много синтаксических ошибок, чтобы понять, что вы пытаетесь написать.Например, в первом фрагменте кода у вас есть «receive_done_flag == FALSE», это условное выражение, которое выдает 1 (true) или 0 (false), но значение условного выражения не используется.Вы хотите написать заявление о назначении?Или оператор if?Или ...?

Во втором фрагменте у вас есть "speed_hex_M1 >> 8 = motorspeed_hex [0]".Опять же, бессмысленно в C. Левая сторона - это «переменная (или единица хранения)», которой присваивается.Так что вы имеете в виду «motorspeed_hx [0] = speed_hex_M1 >> 8» или вы имеете в виду что-то еще>

...