1

我混合了 python 代码和 arduino 代码来完成这项工作。我通过蓝牙(bluetoothsocket(RFCOMM))从python发送一个范围从0-65353的数字数组作为字符串。它们在 arduino 中逐个字符地接收并读入一个数组,该数组会将 char 数组转换为单个原始 int。我想知道这是否应该是要走的路。理想情况下,整数应介于 0-65353 之间。

# define ledPinr 4



void setup() {
pinMode(ledPinr, OUTPUT);
digitalWrite(ledPinr, LOW);
Serial.begin(115200);
Serial.setTimeout(10000);   // for now, not too important
}

void loop() {
// Read serial input:
char val[5]; // 


if (Serial.available()){
digitalWrite(ledPinr, LOW);


Serial.readBytesUntil(',', val, 5);  



unsigned int num = atol(val);
}
if (Serial.available()==0){
digitalWrite(ledPinr, HIGH);
}
}

我对这种方法的问题是,为了使它工作,我必须首先用 0 填充我发送的整数,所以它们的长度都是 5,例如:ints2send=['00001','65353','01000']。然后将它们设置为 arduino 中的 char 数组,例如:{'0','0','0','0','1'} 并且 atol 在转换为 int 1 时会忽略前导 0。 arduino 的新手我想知道是否有办法将字符读入可变长度数组?,例如:{'1'},{'6','5','3','5','3'}。 或者,如果我只发送没有填充的值,是否有一种方法可以初始化一个不会出错的 char 数组? 或者我想知道解决这个问题是否值得,但我只是好奇是否可以从改进此代码中学到一些东西。我意识到我真的忽略了 Serial.readBytesUntil 参数,该参数在找到“,”时停止读取,但理想情况下我想在某个时候暂停发送,所以我看不到 ints2send=['00012,00034']作为解决方案。

4

1 回答 1

0

读取缓冲区时,您想检查字符是否为数字。然后你想把它转换成一个整数左右。

首先要知道的是,int在 arduino 上是用两个字节编码的,并且是有符号的。这意味着它的值介于 -2^15=-32768 和 2^15 - 1=32767 之间。https://www.arduino.cc/reference/en/language/variables/data-types/int/ 如果您想存储 0 到 65535(2^16) 之间的值,您应该使用unsigned int. https://www.arduino.cc/reference/en/language/variables/data-types/unsignedint/

然后你可以这样阅读:

unsigned char byte;
unsigned int value = 0;
while (Serial.available() > 0) {
  // read the incoming byte:
  byte = Serial.read();

  //stop if you read a comma
  if (byte == ',')
    break;
  //update the value if you read a digit
  if (byte >= '0' && byte <= '9')
    value = 10 * value + (byte - '0');
}

该值的计算使用了这样一个事实,即每次您读取另一个数字时,这意味着您移动了之前读取的数字。这意味着以 10 为底乘以 10。然后要获得字符的值,您只需减去 的 ASCII 值0,因为幸运的是,数字以正确的顺序编码。

请注意,只要不溢出最大值,无论字符串中数字的长度如何,此解决方案都有效unsigned int

于 2018-07-23T08:37:09.530 回答