C 如何将值写入整个数据结构,而不仅仅是一个元素?

C How can I write a value to an entire data structure, rather than just an element?

我正在尝试编写一个小的 C 测试程序来从自动售货机读取数据。我已经连接好电路,现在最难的部分是代码。 该机器使用 UART,总共需要 9 个数据位。这是我的代码。尝试直接写入完整的 9 位数据类型不起作用,但写入其中的一个元素可以。

struct nineBit {        //To make 9 bit character types for an array.
unsigned int data : 8;  //8 data bits.
unsigned int mode : 1;  //1 'mode' bit.
} data[35];             //Make an array of 9 bit data to store the incoming data block.

void setup() {
Serial1.begin(9600, SERIAL_9N1);  //Start the UART.
}

void loop() {
data[0] = Serial1.read();  //Works if 'data[0].data is entered instead.
                           //How can I transfer this all in one command?
}

错误是 rx.cpp:在函数中'void loop()': rx.cpp:11:12: 错误:'operator=' 不匹配(操作数类型为 'nineBit' 和 'int') 无效设置(){ ^

rx.cpp:11:12: note: candidates are:
rx.cpp:1:8: note: nineBit& nineBit::operator=(const nineBit&)

    ^
rx.cpp:1:8: note:   no known conversion for argument 1 from 'int' to 'const nineBit&'
rx.cpp:1:8: note: nineBit& nineBit::operator=(nineBit&&)
rx.cpp:1:8: note:   no known conversion for argument 1 from 'int' to 'nineBit&&'
make[1]: *** [../build/target/user/platform-6rx.o] Error 1
make: *** [user] Error 2
Error: Could not compile. Please review your code.

我假设您使用的是 arduino 或类似的东西。所以Serial1.read()returnscharchar 是一个带符号的 1 字节(8 位)字段。而你的 struct nineBit 有 9 位。 8位写入9位结构,你怎么看?

关于您的结构的注释:它的大小不等于 9 位。任何变量的实例都只能以字节为单位计算大小。所以如果你想存储 9 位,你必须创建一个双字节结构或更多。

实际上 sizeof(nineBit) 等于 4 因为你的位域有 unsigned int 类型。如果您想减小结构的大小,则必须将位字段类型更改为 shortchar.

让我们假设您的串口为每个结构传输两个字节。所以你必须读取两个字节然后分配它们:

struct nineBit {        
    char data : 8;  //8 data bits.
    char mode : 1;  //1 'mode' bit.
} data[35];             

void setup() {
    Serial1.begin(9600, SERIAL_9N1);  //Start the UART.
}

void loop() {
    char byte1=Serial1.read();
    char byte2=Serial1.read();
    data[0].data=byte1;
    data[0].mode=byte2;
}

如果您只想使用一行,则必须编写 C 函数或重载 operator=(如果您使用 C++)。

C方式

struct nineBit {        
    char data : 8;  //8 data bits.
    char mode : 1;  //1 'mode' bit.
} data[35];    

void writeToNineBit(struct nineBit *value){
    char byte1=Serial1.read();
    char byte2=Serial1.read();
    value->data=byte1;
    value->mode=byte2;
}

void setup() {
    Serial1.begin(9600, SERIAL_9N1);  //Start the UART.
}

void loop() {
    writeToNineBit(data+0);   // or &data[0]..  0 is an index in array..
}

C++方式

struct nineBit {        
    char data : 8;  //8 data bits.
    char mode : 1;  //1 'mode' bit.

    //    assume you have to assign data without mode..
    nineBit& operator=(char b){
        this->data=b;
    }
} data[35];    

void setup() {
    Serial1.begin(9600, SERIAL_9N1);  //Start the UART.
}

void loop() {
    data[0]=Serial1.read();    //  now it works cause you have operator overloading in your structure..
}