8

我需要使用串行通信向 Arduino 发送一个整数,比如 0-10000 之间。这样做的最佳方法是什么?

我可以考虑将数字分解为一个字符数组(例如:500 为 '5'、'0'、'0')并将它们作为字节流发送(是的,这很难看)。然后在另一端重建。(任何东西都是作为字节流串行发送的,对吧?)

没有更好的方法吗?不知何故,它应该能够将值分配给int类型变量。

(如果可能的话,真的需要对字符串也有同样的了解)

4

5 回答 5

9

如果您正在寻找的是速度,那么您可以将您的数字分成两个字节,而不是发送 ASCII 编码的 int,这是一个示例:

uint16_t number = 5703;               // 0001 0110 0100 0111
uint16_t mask   = B11111111;          // 0000 0000 1111 1111
uint8_t first_half   = number >> 8;   // >>>> >>>> 0001 0110
uint8_t sencond_half = number & mask; // ____ ____ 0100 0111
    
Serial.write(first_half);
Serial.write(sencond_half);
于 2012-12-17T01:16:21.997 回答
3

Another way:

unsigned int number = 0x4142; //ASCII characters 'AB';
char *p;
    
p = (char*) &number;
    
Serial.write(p,2);

will return 'BA' on the console (LSB first).

于 2014-11-27T21:12:17.217 回答
3

您没有指定from环境,所以我认为您的麻烦在于在 Arduino 上读取串行数据?

无论如何,如Arduino 串行参考中所见,您可以使用Serial.parseInt()方法调用读取整数。您可以使用例如读取字符串。Serial.readBytes(buffer, length)但你真正的问题是知道什么时候需要一个字符串,什么时候需要一个整数(以及如果出现其他问题该怎么办,例如噪音等等......)

于 2012-12-14T10:00:11.053 回答
1

另一种方式:

char p[2];
*p = 0x4142; //ASCII characters 'AB'
Serial.write(p,2);

我喜欢这种方式。

于 2016-05-04T22:02:31.140 回答
0

我不是来自编码背景,今天我也在尝试同样的方法并让它工作..我只是按字节发送数字,并添加了开始和结束字节('a'和'b')。希望能帮助到你..enter code here

//sending end
unsigned char a,n[4],b;
int mynum=1023;// the integer i am sending
for(i=0;i<4;i++)
{
    n[i]='0'+mynum%10; // extract digit and store it as char
    mynum=mynum/10;
}

SendByteSerially(a);
_delay_ms(5);
SendByteSerially(n[3]);
_delay_ms(5);
SendByteSerially(n[2]);
_delay_ms(5);
SendByteSerially(n[1]);
_delay_ms(5);
SendByteSerially(n[0]);
_delay_ms(5);
SendByteSerially(b);
_delay_ms(100);


//at receiving end. 
while(portOne.available() > 0) 
{
    char inByte = portOne.read();
    if(inByte!='a' && inByte !='b')
    {
    Serial.print(inByte);
    }
    else if(inByte ='a')
        Serial.println();
    else if(inByte ='b')
        Serial.flush();
    }
delay(100);
于 2015-01-29T15:51:07.910 回答