2012-10-28 61 views
3

我有一个3字节的数组,通过串口缓存传入字节。一旦它满了,我想用字节来调用一个函数,它需要一个字节和一个int作为参数。这在理论上应该不成问题,但由于某些原因,字节不能正确转换为int。这里是我的代码:在Arduino上将字节转换为int时数据丢失

// for serialEvent() 
uint8_t buffer[3] = {0, 0, 0}; 
uint8_t index = 0; 

void serialEvent() { 
    while (Serial.available()) { 
    if (index > 2) { 
     // buffer is full so process it 
     uint16_t argument = (uint16_t)buffer[1]; 
     argument <<= 8; 
     argument |= buffer[2]; 

     processSerial(buffer[0], argument); 

     index = 0; 
    } 

    buffer[index] = Serial.read(); 

    index++; 
    } 
} 

void processSerial(uint8_t action, uint16_t argument) { ... } 

的问题似乎是在第一位向左移,以腾出空间为第二个行。我试图再次通过串行端口输出变量,并且在移位操作之后,它是0.

当我尝试用乘法256代替位移操作时(同样的结果)理论上)。

不快,当我分配一个静态值,像这样,一切工作正常:

uint16_t argument = 0x00CD; 
argument <<= 8; 

这是一个类型转换的问题?我在这里错过了什么吗?

+0

'说法| = buffer [2];'你可能想在这里使用buffer [0]? – wildplasser

+0

除了没有用3个解码字节进行真正的呼叫,直到第4个字节可用,并且在收到第3个字节之后没有立即进行,这是有道理的,我看不到任何明显的奇怪。 –

+0

感谢Joachim,我会重新排列这个功能。缓冲区指数是正确的。 –

回答

0

还没有找到解决办法,为什么出现这种情况,但使用这个词()函数不正是我想要的:

uint16_t argument = word(buffer[1], buffer[2]); 
processSerial(buffer[0], argument); 

烦人,它被定义为:

unsigned int makeWord(unsigned char h, unsigned char l) { return (h << 8) | l; } 
相关问题