在Arduino中串行发送一个整数

时间:2012-12-14 08:59:11

标签: integer char byte arduino serial-communication

我需要使用串行通信向Arduino发送一个整数,比如介于0到1200之间。最好的方法是什么?

我可以考虑将数字分成字符数组(例如:500作为&#39; 5&#39;,&#39; 0&#39;,&#39; 0&#39;)< / em>并将它们作为字节流发送(是的,这很难看)。然后在另一端重建。 (任何东西都是作为字节流串行发送的,对吗?)

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

(如果可能的话,真的需要知道关于字符串的相同事情)

5 个答案:

答案 0 :(得分:7)

如果您要寻找的是速度,那么您可以将数字分成两个字节,而不是发送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);

答案 1 :(得分:3)

你没有指定来自环境,所以我认为你的麻烦是读取Arduino上的串行数据?

无论如何,在Arduino Serial reference中可以看到,您可以使用Serial.parseInt()方法调用读取整数。你可以用例如读取字符串。 Serial.readBytes(buffer, length)但你真正的问题是要知道何时期望一个字符串以及何时期望一个整数(以及如果出现其他事情该怎么办,例如噪音等......)

答案 2 :(得分:2)

另一种方式:

unsigned int number = 0x4142; //ASCII characters 'AB';
char *p;

p = (char*) &number;

Serial.write(p,2);

将返回&#39; BA&#39;在控制台上(LSB优先)。

答案 3 :(得分:1)

其他方式:

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

我喜欢这样。

答案 4 :(得分:-1)

我不是来自编码背景,今天我正在尝试相同并使其正常工作..我只是按字节顺序发送数字,添加了开始和结束字节(&#39; a&#39;和&#39; b&#39)。希望它有所帮助.. 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);