Я пытаюсь создать несколько массивоподобных структур для обработки данных и адресов MODBUS.
Я делаю это внутри структуры, поэтому позже будет проще установить определенные значения, а не ссылаться на таблицу данных, чтобы узнать, какой адрес связан с данными.
Некоторые адреса оставлены пустымии зарезервированы для будущего использования (я знаю, что это не указано в стандарте MODBUS, данные не должны быть точно привязаны к MODBUS).
Я создал структуру, которая компилируется в программном обеспечении длявстроенное устройство, на котором оно должно работать.Однако я не был уверен, что все будет работать так, как я себе представлял, поэтому я запустил некоторый тестовый код на 2 разных компиляторах.Я являюсь онлайн-компилятором, который работает так, как я ожидал, с одним предупреждением в зарезервированном байте.Второе запускается в консольном приложении visual studio c ++, которое не запускается, поскольку выдает ошибку:
Ошибка C2208 «unsigned short»: нет членов, определенных с использованием этого типа
Thisэто полный код, который должен выполняться:
#include <stdio.h>
#include <stdint.h>
#define U16 uint16_t
#define UI unsigned int
struct t {
U16 t1;
union {
struct {
UI b_f1 : 2;
UI b_f2 : 2;
UI b_f3 : 2;
UI b_f4 : 2;
UI b_f5 : 2;
UI b_f6 : 2;
UI b_f7 : 2;
UI b_f8 : 2;
}f;
U16 c;
}t2;
U16; //Reserved space for later use <- this gives me the compiler error
U16 t3;
}test;
int main()
{
test.t3 = 12;
test.t2.f.b_f1 = 0; //0
test.t2.f.b_f2 = 2; //4 (8)
test.t2.f.b_f3 = 0; //16
test.t2.f.b_f4 = 0; //64
test.t2.f.b_f5 = 0; //256
test.t2.f.b_f6 = 0; //1024
test.t2.f.b_f7 = 2; //4096 (8192)
test.t2.f.b_f8 = 0; //16384
//tot: 8200
test.t1 = 3000;
int h; //test variable
for (int i = 0; i < (sizeof(test) / sizeof(U16)); i++) {
h = *(&test.t1 + (i*sizeof(U16));
printf("%d", h); //here I can now send every MODBUS address & data
}
return 0;
}
Установка переменных не требуется, это просто для целей тестирования
Я ожидал, что это просто сгенерирует структуру из 4 элементов, один из которыхуказатель 0, так что адресация правильная, так что адрес 3 не используется, и поэтому 0, в то время как адрес 4 (t3) будет содержать больше данных.
Есть ли способ выполнить эту работу, которую я планировал сделатьделать, или я должен просто создать некоторые переменные между ними под названием Reserved1..Reserverd2..etc?