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()
returnschar
。 char
是一个带符号的 1 字节(8 位)字段。而你的 struct nineBit
有 9 位。 8位写入9位结构,你怎么看?
关于您的结构的注释:它的大小不等于 9 位。任何变量的实例都只能以字节为单位计算大小。所以如果你想存储 9 位,你必须创建一个双字节结构或更多。
实际上 sizeof(nineBit)
等于 4 因为你的位域有 unsigned int
类型。如果您想减小结构的大小,则必须将位字段类型更改为 short
或 char
.
让我们假设您的串口为每个结构传输两个字节。所以你必须读取两个字节然后分配它们:
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..
}
我正在尝试编写一个小的 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()
returnschar
。 char
是一个带符号的 1 字节(8 位)字段。而你的 struct nineBit
有 9 位。 8位写入9位结构,你怎么看?
关于您的结构的注释:它的大小不等于 9 位。任何变量的实例都只能以字节为单位计算大小。所以如果你想存储 9 位,你必须创建一个双字节结构或更多。
实际上 sizeof(nineBit)
等于 4 因为你的位域有 unsigned int
类型。如果您想减小结构的大小,则必须将位字段类型更改为 short
或 char
.
让我们假设您的串口为每个结构传输两个字节。所以你必须读取两个字节然后分配它们:
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..
}