0

На вход будут поступать числа, значение датчика расстояния, мне нужно перевести их к виду 0x01, 0x20, 0xA0, 0x00 первые биты младшие

например число 400 должно быть в виде 0x90, 0x01

Что бы подставить в выражение: unsigned char stmp[8] = {0x90, 0x01};

#include <SPI.h>
#include "mcp_can.h"

const int SPI_CS_PIN = 10;

MCP_CAN CAN(SPI_CS_PIN);

void setup() { Serial.begin(115200); while (CAN_OK != CAN.begin(CAN_250KBPS, MCP_8MHz)) { Serial.println("CAN BUS Shield init fail"); Serial.println(" INit CAN BUS Shield again"); delay(100); }

Serial.println(&quot;CAN BUS Shield Init OK!&quot;);

} // Пробег unsigned char stmp[8] = {0x90, 0x01};

void loop() {
Serial.println("In loop"); CAN.sendMsgBuf(0x18FEC1EE, 1, 8, stmp); delay(100); }

Agros
  • 17
  • Вопрос - что вы собираетесь дальше с этим набором байт делать? – insolor Dec 15 '20 at 11:38
  • Кстати, байты 0x90, 0x01 - это 400, а не 200 – insolor Dec 15 '20 at 11:42
  • Да я забыл исправить) 200 занимает 1 байт, после unsigned char stmp[8] = {0x90, 0x01};

    void loop() {
    Serial.println("In loop"); CAN.sendMsgBuf(0x18FEC1EE, 1, 8, stmp); delay(100); }

    – Agros Dec 15 '20 at 11:49
  • Добавил код, программа для передачи данных для GPS модуля – Agros Dec 15 '20 at 11:56
  • Чисто в качестве идеи, попробуйте сделать массив unsigned int stmp[2] = {400, 0}; и отправку как CAN.sendMsgBuf(0x18FEC1EE, 1, 8, (unsigned char *)stmp); – insolor Dec 15 '20 at 11:57
  • Я правильно понял, что вам например из unsigned int number = 400 надо получить unsigned char stmp[8] = {0x90, 0x01, 0, 0, 0, 0, 0, 0};? – Павел Ериков stand with Russia Dec 15 '20 at 12:31
  • Стандартный алгоритм: бьёте чило на две части по 4 бита. Верхняя часть у = у / 16; или сдвиг на 4, нижняя часть y = x & 15; Далее 0-15 преобразуем в ASCII: y = ((x > 9) ?(65 - 10) : 48) + x; усё. – nick_n_a Dec 15 '20 at 14:23
  • 1
    https://ru.stackoverflow.com/a/453060/178988 – Qwertiy Dec 15 '20 at 14:36
  • В каком диапазоне значения поступающих чисел, могут ли они быть отрицательными? – Герман Борисов Dec 16 '20 at 04:33
  • 0 до 200 значения с датчика расстояния – Agros Dec 16 '20 at 04:35

1 Answers1

0
unsigned char stmp[8] = {0, 0, 0, 0, 0, 0, 0, 0};
int number = 400;
*((int*)stmp) = number;

Чтобы избежать приведения типа (вдруг компилятор так строго настроен), можно использовать более хитрый код:

typedef union {
    unsigned char uc_array[8];
    unsigned int ui_number;
} stmp_t;
stmp_t stmp;

number = 400;

stmp.ui_number = number;

CAN.sendMsgBuf(0x18FEC1EE, 1, 8, stmp.uc_array);

  • 1
    Нарушение strict aliasing → UB. – eanmos Dec 15 '20 at 14:54
  • Запись одного поля union, а чтение из другого — тоже UB. – wololo Dec 16 '20 at 05:43
  • @Vanyamba Electronics
    void loop()
    {   
      Serial.println("In loop");
      typedef union 
      {
      unsigned char uc_array[8];
      unsigned int ui_number;
      } stmp_t;
      stmp_t stmp;
      int number = 400;
      stmp.ui_number = number;
      CAN.sendMsgBuf(0x18FEC1EE, 1, 8, stmp.uc_array); 
      CAN.sendMsgBuf(0x18FEC1EE, 1, 8, stmp);
      delay(100);
    }
    

    Пишет ошибку

    can:28:40: error: no matching function for call to 'MCP_CAN::sendMsgBuf(long int, int, int, loop()::stmp_t&)' CAN.sendMsgBuf(0x18FEC1EE, 1, 8, stmp);

    – Agros Dec 16 '20 at 09:04