这个问题在这篇文章之后:arduino - 如何从 serial.read(( 馈送结构
首先,我要感谢 Sol Arnu 之前在下面显示的代码。请注意,代码是有效的。到目前为止最好的尝试。即使我不认为有任何一点被送到桌子上。现在我可以打印一个"1"。但是,如果我更改发送的页面(2 而不是 1(,则没有变化。这部分x.b = val1 | (val2<<8); Serial.print(x.a.page);
让我感到困惑。它是否比较 2 个 var 位并将结果放在联合结构的实例中?
我没有说它是Arduino Uno(8位,内存和寄存器(。你能看到发生了什么吗?
#include <SoftwareSerial.h>
#define PACKED __attribute__((__packed__))
SoftwareSerial PORTone(8, 9); // port 1
SoftwareSerial PORTtwo(10, 11); // port 2
PACKED union {
PACKED struct {
unsigned int val1:
1; // (0,1)
unsigned int val2:
4; // 10 choices (4 bits)
unsigned int val3:
3; // 5 choices (3 bits)
unsigned int val4:
2; // 3 choices (2 bits)
}
*PtrStr;
uint8_t val_table[2];
uint16_t b;
}
*MegaUnion;
//*********************************SETUP***************
void setup() {
Serial.begin(9600);
PORTone.begin(9600);
}
//**********************************LOOP***************
void loop() {
while(PORTone.available()>0) {
delay(100);
for(int i = 0; i<=4; i++) {
for(int i = 0; i<=3; i++) {
for( int j = 0; j<=3; j++) {
int inByte = PORTone.read();
*MegaUnion.struct.val1[j] = inByte; // error: 'union<anonymous>' has no member named 'val1'
}
// I should that too
// u_structTable x;
// x.b = val1 | (val2<<8);
// Serial.print(x.a.page);
}
}
// what is coming from the table
Serial.print( (*MegaUnion).page);
}
}
我应该回答迈克尔·罗伊,(希望我能通过这第二个线程(。感谢您的宝贵回答。这似乎是我将测试的另一种方式。
"编辑"我还纠正了一个大错误,尼克·金蒙(Nick Gammon(很好地发现了这个错误,以便更好地看待这个主题。我的坏。
也许这个联盟涵盖了所有类型,并且由于它使用匿名结构,因此需要的点更少:):
#define PACKED __attribute__((__packed__))
PACKED union {
PACKED struct
{
unsigned int page:1; // (0,1)
unsigned int cric:4; // 10 choices (4 bits)
unsigned int crac:3; // 5 choices (3 bits)
unsigned int croc:2; // 3 choices (2 bits)
};
PACKED struct
{
uint8_t val1;
uint8_t val2;
};
uint8_t val_table[2];
uint16_t b;
}MegaUnion;
MegaUnion.val1 = PORTone.read();
MegaUnion.val2 = PORTone.read();
请记住,您的页面位域占据了并集的最年轻部分,因此要将其设置为one
您需要写入MegaUnion.val1 = 1
或MegaUnion.val_table[0] = 1
或MegaUnion.b = 1
原始代码:
while(PORTone.available()>0) {
volatile unsigned int val1, val2, val3, val4;
for(int i = 0; i<=4; i++){
val1 = PORTone.read();
val2 = PORTone.read();
val3 = PORTone.read();
val4 = PORTone.read();
}
PORTone.available()>0
保证单个字节可供读取。您正在读取 20 个字节。几乎可以肯定的是,其中19个将是-1(0xFFFF(。我不明白你为什么要把这四个值读五遍。
无需使 val1、val2、val3 和 val4 易失,因为它们不与中断服务例程共享。
修订后的代码:
while(PORTone.available()>0) {
delay(100);
for(int i = 0; i<=4; i++){
for(int i = 0; i<=3; i++){
for( int j = 0; j<=3; j++) {
int inByte = PORTone.read();
*MegaUnion.struct.val1[j] = inByte;
我看不出你在这里做什么,除了把东西放在一起,希望最好。现在,一旦找到一个可用字节,您将在内部循环中读取 80 个字节。"struct"一词不属于变量名称中。您有两个循环变量,都称为i
。
如果您不介意描述以及如何访问中断服务例程,那就太好了!
什么中断服务例程?你不需要volatile
,除非你正在使用中断,而你似乎没有这样做。
正如我到目前为止所经历的那样,结构成员可能无法通过 var 获得他的值。 反正只要我收到和分享(10位(,就不用玩结构了。一串 4 个单词就足够了。