我正在尝试编写一个小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.
答案 0 :(得分:2)
我假设你正在使用arduino或类似的东西。因此Serial1.read()
会返回char
。 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函数,或者如果使用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..
}