C#和Arduino主/从机从AD读取3个字节

C#和Arduino主/从机从AD读取3个字节,c#,arduino,C#,Arduino,我目前正在研究一个主/从程序,其中主程序是C#程序,从程序是Arduino Uno。Arduino正在读取多个值并按预期工作,但我在C#端遇到了一些问题。我正在从AD转换器(AD7680)读取3个字节,该转换器返回3个字节的数据,数据结构如下: 0000 | 16位数字| 0000 我的C#程序正在以双精度读取返回值,这是预期值。但我没有找到如何摆脱最后四个0并获得所需的2字节数字 在不丢失数据的情况下获得正确值的最佳方法是什么?我试过“比特转换器”,但它不是我所期望的,我也不知道如何继续。不幸

我目前正在研究一个主/从程序,其中主程序是C#程序,从程序是Arduino Uno。Arduino正在读取多个值并按预期工作,但我在C#端遇到了一些问题。我正在从AD转换器(AD7680)读取3个字节,该转换器返回3个字节的数据,数据结构如下:

0000 | 16位数字| 0000

我的C#程序正在以双精度读取返回值,这是预期值。但我没有找到如何摆脱最后四个0并获得所需的2字节数字

在不丢失数据的情况下获得正确值的最佳方法是什么?我试过“比特转换器”,但它不是我所期望的,我也不知道如何继续。不幸的是,我目前无法附加代码,但如果需要,我可以引用其中的任何内容

谢谢你的阅读

编辑:这是C端的函数:

与之通信的Arduino功能是:

unsigned long ReturnPressure(){
long lBuffer = 0;
byte rtnVal[3];
digitalWrite(SLAVESELECT , LOW);
delayMicroseconds(1);

rtnVal[0] = SPI.transfer(0x00);
delayMicroseconds(1);
rtnVal[1] = SPI.transfer(0x00);
delayMicroseconds(1);
rtnVal[2] = SPI.transfer(0x00);
delayMicroseconds(1);
digitalWrite(SLAVESELECT, HIGH);
// assemble into long type
lBuffer = lBuffer | rtnVal[0];
lBuffer = lBuffer << 8;
lBuffer = lBuffer | rtnVal[1];
lBuffer = lBuffer << 8;
lBuffer = lBuffer | rtnVal[2];

return lBuffer;
}
unsigned long ReturnPressure(){
长lBuffer=0;
字节rtnVal[3];
数字写入(SLAVESELECT,低位);
延迟微秒(1);
rtnVal[0]=SPI.transfer(0x00);
延迟微秒(1);
rtnVal[1]=SPI.传输(0x00);
延迟微秒(1);
rtnVal[2]=SPI.传输(0x00);
延迟微秒(1);
数字写入(SLAVESELECT,高);
//组装成长型
lBuffer=lBuffer | rtnVal[0];

lBuffer=lBuffer好的,您必须执行以下几个步骤:

首先:在数组中保存字节要容易得多,如下所示:

byte Received = new byte[3];
for(int i = 0; i < 3; i++)
{
  Received[i] = (byte)arduinoBoard.ReadByte();
}
要知道电压是多少,你必须知道转换器的刻度。上面写着“LSB大小是VDD/65536”。你可以定义一个常数

const double VDD = 5; //For example 5V
之后,您可以使用

return Shifted * (VDD / 65539); //Your voltage

希望这能有所帮助。

请说明您是如何在C代码中接收来自arduino的数据的……它是串行的吗?是双精度的吗?如何在双精度中读取数据?使用字节数组存储三个字节,然后将它们放在32位int中,最后将值移位。最重要的是,
请说明您是如何在yo中接收来自arduino的数据的ur C#code
@Fruchtzwerg这是串行通信是的……我用询问的代码编辑了主要问题。我在C#端使用double,因为该函数还调用Arduino来获取从不同传感器读取的其他参数,因此我需要它们读取的数值。我可以在我们开始时为它创建一个新函数LH:是的,不过我一直在努力使这项工作简单化。谢谢你的支持!
UInt64 Shifted = Shifted >> 4;
const double VDD = 5; //For example 5V
return Shifted * (VDD / 65539); //Your voltage