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

时间:2016-05-29 06:47:17

标签: type-conversion structure 9-bit-serial

我正在尝试编写一个小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:错误:不匹配'运算符=' (操作数类型是' nineBit'和' int')     void setup(){             ^

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.

1 个答案:

答案 0 :(得分:2)

我假设你正在使用arduino或类似的东西。因此Serial1.read()会返回charchar是带符号的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函数,或者如果使用C ++则重载operator=

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..
}