Помогите с использованием uint32_t? Пытаюсь скормить серийник arduino от raspberry pi. Любая помощь очень и очень ценится

Поэтому я не знаю C, поэтому я просто пытаюсь запустить очень простой код на моем Arduino, чтобы отправлять ему команды по последовательному порту.

Я загружаю серийный номер в buf

irsend.sendNEC(0x210704FB, 32)

это работает, но мне нужно читать из buf вместо жесткого кодирования для одного кода.

irsend.sendNEC(buf, 32) не будет компилироваться, но irsend.sendNEC((uint32_t) buf, 32) будет. Он просто ничего не делает.

Когда я использую

serial.print((uint32_t) buf, 32);

он печатает только кажущиеся случайными буквы?

Я пытаюсь передать ему серийный код на языке, который знаю немного лучше. Я могу отправить шестнадцатеричный код через последовательный порт с помощью python, но я ничего не знаю о C. Я не понимаю, почему я не могу просто передать ему переменную и прочитать ее как есть. вот мой код

#include <IRremote.h>

char buf[80];

int readline(int readch, char *buffer, int len) {
  static int pos = 0;
  int rpos;

  if (readch > 0) {
    switch (readch) {
      case '\r': // Игнорировать CR
        break;
      case '\n': // Возврат на новую строку
        rpos = pos;
        pos = 0; // Сбросить индекс позиции, готовый к следующему разу
        return rpos;
      default:
        if (pos < len-1) {
          buffer[pos++] = readch;
          buffer[pos] = 0;
        }
    }
  }
  return 0;
}


void setup() {
  Serial.begin(115200);
}

IRsend irsend;

void loop() {
  if (readline(Serial.read(), buf, 80) > 0) {
    //пытался настроить код, чтобы показать, что arduino получил и пробовал способы отправки
    //Serial.print("Вы ввели: >");
    //Серийный.принт(buf);
    //Serial.println("<");
    //похоже, ничего не делает irsend.sendNEC((uint32_t) buf, 32);
    //работает, но только для этой кнопки irsend.sendNEC(0x210704FB, 32);
    //хотим использовать irsend.sendNEC(buf, 32);
    //я пытаюсь выяснить, что irsend передается через buf Serial.print((uint32_t) buf, 32);
    
  }
}

, 👍0

Обсуждение

Что такое буф? Первые два sendNEC в вашем вопросе идентичны, но вы говорите, что один компилируется, а другой нет - возможно, это неправильная копия/вставка. Пожалуйста, [отредактируйте] свой вопрос, чтобы уточнить., @Mat

serial.print(...., 32). "32" [не является допустимым вторым параметром для функции serial.print()](https://www.arduino.cc/reference/en/language/functions/communication/serial/print/) при печати целочисленное значение. Просто оставьте его или замените на «BIN», «DEC», «OCT» или «HEX». Кстати, в чем именно заключается ваш вопрос?, @StarCat

Вчера я обновил свой пост, чтобы внести некоторую ясность и показать весь код, а не только конкретную функцию, с которой у меня возникла проблема. Любая помощь очень ценится., @Johnny Derpp


1 ответ


-1

Та же проблема у меня, но это мое решение.

Сопоставление между структурой python (упакованные данные) и структурой arduino выглядит следующим образом:

Python              Arduino
?                   boolean
i                   int32_t or uint32_t 
f                   float

Код Arduino:

// Структура, которую мы хотим отправить по последовательному соединению
struct Data {
  int32_t timer;
  float value2;
  uint32_t sensor1;
  uint32_t datasize;  
};
 Data data;
void setup() {
  // Инициализируем последовательное соединение
  Serial.begin(115200);
}

void loop() {
  // Создаем экземпляр структуры данных
 
  data.timer = micros();
  data.value2 = 3.14;
  // прочитать ввод на аналоговом выводе 0:
  data.sensor1 = analogRead(A0);
  

  // Рассчитываем размер структуры в байтах
  size_t size = sizeof(data);
  data.datasize = size; 
  // Выделяем буфер для упакованных данных
  uint8_t *buf = (uint8_t*)malloc(size);

  // Упакуем данные в буфер
  memcpy(buf, &data, size);

  // Отправляем упакованные данные по последовательному соединению
  Serial.write(buf, size);

  // Освобождаем буфер
  free(buf);

  // Подождите перед повторной отправкой данных
  delay(10);
  
}

Код Python:

Python              Arduino
?                   boolean
i                   int32_t or uint32_t 
f                   float

Arduino Code:

// The struct we want to send over the serial connection
struct Data {
  int32_t timer;
  float value2;
  uint32_t sensor1;
  uint32_t datasize;  
};
 Data data;
void setup() {
  // Initialize the serial connection
  Serial.begin(115200);
}

void loop() {
  // Create an instance of the Data struct
 
  data.timer = micros();
  data.value2 = 3.14;
  // read the input on analog pin 0:
  data.sensor1 = analogRead(A0);
  

  // Calculate the size of the struct in bytes
  size_t size = sizeof(data);
  data.datasize = size; 
  // Allocate a buffer for the packed data
  uint8_t *buf = (uint8_t*)malloc(size);

  // Pack the data into the buffer
  memcpy(buf, &data, size);

  // Send the packed data over the serial connection
  Serial.write(buf, size);

  // Free the buffer
  free(buf);

  // Wait before sending the data again
  delay(10);
  
}

Python Code:

#
# read struct from arduino / sample code above
#

import serial
import struct

# Open the serial port
ser = serial.Serial('/dev/ttyUSB0', 115200)

# The struct we expect to receive from the Arduino
#struct Data {
#  int32_t value1;
#  float value2;
#  uint32_t value3;
#}
expFormat = "i f i i"         # Format to match arduino struct
structDataLength = struct.calcsize(expFormat)
print(structDataLength)       # RESULT IS 12

while True:
# Read the data from the serial port
# We read until we have received all the bytes for the struct
    
    data = b''
    while len(data) < structDataLength:
        data += ser.read(structDataLength - len(data))
    # Unpack the data into an instance of the Data struct
    val = struct.unpack('i f i i', data)

# Print the values
    print(val)

# Close the serial port
ser.close()
,