Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LoRa的Arduino SAMD整数到字节转换_Arduino_Integer_Byte_Lora - Fatal编程技术网

LoRa的Arduino SAMD整数到字节转换

LoRa的Arduino SAMD整数到字节转换,arduino,integer,byte,lora,Arduino,Integer,Byte,Lora,我正在为MKRWAN LoRa arduino董事会写一段代码。 使用MKRWAN库,这不是很好的文档 这段代码的目标是接受一些整数,并返回字节,以便它们可以存储在字节数组中,我应该能够通过LoRa网络发送这些字节 在arduino文档中,它描述了带有SAMD芯片的arduinos将整数存储在4个字节中 在Arduino Uno(和其他基于ATmega的板)上,int存储16位(2字节)的值。这将产生-32768到32767的范围(最小值为-2^15,最大值为(2^15)-1)。在Arduino

我正在为MKRWAN LoRa arduino董事会写一段代码。 使用MKRWAN库,这不是很好的文档

这段代码的目标是接受一些整数,并返回字节,以便它们可以存储在字节数组中,我应该能够通过LoRa网络发送这些字节

在arduino文档中,它描述了带有SAMD芯片的arduinos将整数存储在4个字节中

在Arduino Uno(和其他基于ATmega的板)上,int存储16位(2字节)的值。这将产生-32768到32767的范围(最小值为-2^15,最大值为(2^15)-1)。在Arduino Due和基于SAMD的板(如MKR1000和Zero)上,int存储32位(4字节)值。这将产生-2147483648到2147483647的范围(最小值为-2^31,最大值为(2^31)-1)

资料来源:

MKRWAN 1310板使用SAMD21芯片

MKR WAN 1310与其前身MKR WAN 1300相比,带来了一系列改进。MKR WAN 1310仍然基于Microchip®SAMD21低功耗处理器、Murata CMWX1ZZABZ LoRa®模块和MKR系列的特色加密芯片(ECC508),但它包括一个新的电池充电器、一个2字节的SPI闪存,并改进了对电路板功耗的控制

资料来源:

然而,当我运行代码时,它会将一些整数表示为4字节,而另一些则表示为更少的字节

-9001 in BINARY = 11010111 11011100 11111111 11111111 
newInt = -9001
13 in BINARY = 1101 0 0 0 
newInt = 13
-1 in BINARY = 11111111 11111111 11111111 11111111 
newInt = -1
250 in BINARY = 11111010 0 0 0 
newInt = 250
-1950 in BINARY = 1100010 11111000 11111111 11111111 
newInt = -1950
13450 in BINARY = 10001010 110100 0 0 
newInt = 13450
我正在使用并集将整数转换为字节

SAMD板是否动态存储整数? 我的代码错了吗

#define ArraySize 4

byte ATA[ArraySize];                      // Air temperature array
byte AHA[ArraySize];                      // Air humidity array
byte GT1A[ArraySize];                     // Ground temperature sensor 1 array
byte GT2A[ArraySize];                     // Ground temperature sensor 2 array
byte GT3A[ArraySize];                     // Ground temperature sensor 3 array
byte GHA[ArraySize];                      // Ground humidty sensor array
byte master[24];                          // message array

union unionForm {                         // werkt naar behoren
  byte myBytes[ArraySize];
  int myInt;
} myUnion;

void setup() {
  // put your setup code here, to run once:
  int int1 = -9001;
  int int2 = 13;
  int int3 = -1;
  int int4 = float_to_int(2.5);
  int int5 = float_to_int(-19.5);
  int int6 = float_to_int(134.5);

  
  
  Serial.begin(115200);
  while(!Serial);

  int_to_bytes(int1, ATA);
  int_to_bytes(int2, AHA);
  int_to_bytes(int3, GT1A);
  int_to_bytes(int4, GT2A);
  int_to_bytes(int5, GT3A);
  int_to_bytes(int6, GHA);

  Combine_Arrays();
  for (int i = 0; i < 24; i++){
    Serial.print(master[i], BIN);
    Serial.print(" ");
  }
  
  Serial.println();
}

void loop(){
  
}

int float_to_int(float floatyboi){
  Serial.print("Float:\t");
  Serial.println(floatyboi);
  int newInt = floatyboi * 100;                     // convert 2 decimal float to int by multiplying by 100 and saving as int
  Serial.print("New Int:\t");
  Serial.println(newInt);
  
  return newInt;
}

void int_to_bytes(int ConvertInt, byte (& MyArray)[ArraySize]){
  myUnion.myInt = ConvertInt;                         // Save int into union
  Serial.print(ConvertInt);
  Serial.print(" in BINARY = ");
  for (int i = 0; i < sizeof(int); i++) {
    Serial.print(myUnion.myBytes[i], BIN);
    Serial.print(" ");

    MyArray[i] = myUnion.myBytes[i];                  // save bits out of union in corresponding array
  }
  Serial.println();
  
  int newInt = myUnion.myInt;
  Serial.print("newInt = ");
  Serial.println(newInt);
}

void Combine_Arrays(){
  Serial.println("Combining Arrays");
  master[0] = ATA[0];
  master[1] = ATA[1];
  master[2] = ATA[2];
  master[3] = ATA[3];
  master[4] = AHA[0];
  master[5] = AHA[1];
  master[6] = AHA[2];
  master[7] = AHA[3];
  master[8] = GT1A[0];
  master[9] = GT1A[1];
  master[10] = GT1A[2];
  master[11] = GT1A[3];
  master[12] = GT2A[0];
  master[13] = GT2A[1];
  master[14] = GT2A[2];
  master[15] = GT2A[3];
  master[16] = GT3A[0];
  master[17] = GT3A[1];
  master[18] = GT3A[2];
  master[19] = GT3A[3];
  master[20] = GHA[0];
  master[21] = GHA[1];
  master[22] = GHA[2];
  master[23] = GHA[3];
}
#定义数组大小4
字节ATA[ArraySize];//空气温度阵列
字节AHA[ArraySize];//空气湿度阵列
字节GT1A[ArraySize];//地面温度传感器1阵列
字节GT2A[阵列化];//地温传感器2阵列
字节GT3A[ArraySize];//地面温度传感器3阵列
字节GHA[ArraySize];//地面湿度传感器阵列
字节主控[24];//消息数组
工会形式{//werkt naar behoren
字节myBytes[ArraySize];
int-myInt;
}我的联盟;
无效设置(){
//将安装代码放在此处,以便运行一次:
int1=-9001;
int2=13;
int3=-1;
int int4=浮动至int(2.5);
int int5=浮动至int(-19.5);
int int6=浮动至int(134.5);
序列号开始(115200);
而(!串行);
int_到_字节(int1,ATA);
int-to-u字节(int2,AHA);
int_到_字节(int3,GT1A);
int_至_字节(int4,GT2A);
int_至_字节(int5,GT3A);
int_到_字节(int6,GHA);
组合_数组();
对于(int i=0;i<24;i++){
串行打印(主文件[i],BIN);
连续打印(“”);
}
Serial.println();
}
void循环(){
}
int float_to_int(float floatyboi){
Serial.print(“Float:\t”);
Serial.println(floatyboi);
int newInt=floatyboi*100;//通过乘以100并另存为int,将2个十进制浮点转换为int
Serial.print(“新Int:\t”);
Serial.println(newInt);
返回newInt;
}
void int_to_字节(int-convertin,byte(&MyArray)[ArraySize]){
myUnion.myInt=ConvertInt;//将int保存到union中
串行打印(ConvertInt);
Serial.print(“二进制=”);
对于(int i=0;i

以这种方式使用工会并不是最好的方式。它会让你有未定义的行为。这是一种类型双关语

最好将值移出并移入32位字中

byte values[4] = {0xff, 0xff, 0xff, 0xff};
int output = values[3] << 24 | values[2] << 16 | values[1] << 8 | values[0];

values[0] = output;
values[1] = output >> 8;
values[2] = output >> 8;
values[3] = output >> 8;
字节值[4]={0xff,0xff,0xff,0xff};
int输出=值[3]>8;
值[3]=输出>>8;

您还应该查看值的符号性,因为它们可能会导致问题。

什么是“它将一些整数表示为4字节,而另一些则表示为更少”的确切含义。你的问题到底是什么?请举例说明出现了什么问题以及您的期望。请注意,Arduino中的
byte
unsigned char
,这是
uint8\u t
,而您正在使用
int
进行转换,这可能是一个负数。我已经添加了我得到的输出。在重新设计时,我会记住未签名的问题。根据您更新的帖子,数据以正确的格式存储(Arduino使用little endian),这意味着首先存储LSB,最后存储MSB。您需要注意,您的Lora msg的接收端是一台big-endian或little-endian机器,在研究将整数转换为字节的过程中,如果在本项目开始时我的技能范围内出现的几件事让我感到困惑,那么这就是其中之一。我会避开工会,记住签名!