Помогите с использованием 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);
}
}
@Johnny Derpp, 👍0
Обсуждение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()
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
- Что лучше использовать: #define или const int для констант?
- Функции со строковыми параметрами
- Как работать с аналоговыми контактами в цикле?
- Какие есть другие IDE для Arduino?
- Как использовать переменные и функции в нескольких файлах .ino
- Разница между void setup() и void setup(void)
- Будет ли .ino-скетч ардуино компилироваться непосредственно на GCC-AVR?
Что такое
буф
? Первые дваsendNEC
в вашем вопросе идентичны, но вы говорите, что один компилируется, а другой нет - возможно, это неправильная копия/вставка. Пожалуйста, [отредактируйте] свой вопрос, чтобы уточнить., @Matserial.print(...., 32)
. "32" [не является допустимым вторым параметром для функцииserial.print()
](https://www.arduino.cc/reference/en/language/functions/communication/serial/print/) при печати целочисленное значение. Просто оставьте его или замените на «BIN», «DEC», «OCT» или «HEX». Кстати, в чем именно заключается ваш вопрос?, @StarCatВчера я обновил свой пост, чтобы внести некоторую ясность и показать весь код, а не только конкретную функцию, с которой у меня возникла проблема. Любая помощь очень ценится., @Johnny Derpp