1

我正在尝试编写一个用于从自动售货机读取数据的小 C 测试程序。我已经连接了电路,现在最难的部分是代码。该机器使用需要 9 个总数据位的 UART。这是我的代码。尝试直接写入完整的 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: In function 'void loop()': rx.cpp:11:12: error: no match for 'operator=' (operand types are 'nineBit' and '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.
4

1 回答 1

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 函数,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..
}
于 2016-05-29T07:20:28.757 回答