我目前正在研究一个主/从,其中Master是一个C#程序而Slave是一个Arduino Uno。 Arduino正在阅读几个值并按预期工作,但我在C#方面遇到了一些麻烦。我正从AD转换器(AD7680)读取3个字节,它返回以下列方式构造的3个字节的数据:
<00> 0000 | 16位数| 0000我的C#程序正在以double的形式读取返回的值,这是预期的值。但我没有找到如何摆脱最后四个0并获得我需要的2字节数。
在不丢失数据的情况下,获得正确价值的最佳方法是什么?我试过'BitConverter',但这不是我所期待的,我不知道如何继续。不幸的是,我目前无法附加代码,但如果需要,我可以在其上引用任何内容。
感谢阅读!
编辑:这是C#方面的功能:
public double result(byte[] command)
{
try
{
byte[] buffer = command;
arduinoBoard.Open();
arduinoBoard.Write(buffer, 0, 3);
int intReturnASCII = 0;
char charReturnValue = (Char)intReturnASCII;
Thread.Sleep(200);
int count = arduinoBoard.BytesToRead;
double returnResult = 0;
string returnMessage = "";
while (count > 0)
{
intReturnASCII = arduinoBoard.ReadByte();
//string str = char.ConvertFromUtf32(intReturnASCII);
returnMessage = returnMessage + Convert.ToChar(intReturnASCII);
count--;
}
returnResult = double.Parse(returnMessage, System.Globalization.CultureInfo.InvariantCulture);
arduinoBoard.Close();
return returnResult;
}
catch (Exception e)
{
return 0;
}
}
与之通信的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;
}
答案 0 :(得分:0)
好的,你必须做几个步骤:
首先:更容易将字节保存在这样的数组中:
byte Received = new byte[3];
for(int i = 0; i < 3; i++)
{
Received[i] = (byte)arduinoBoard.ReadByte();
}
收到三个字节后,将它们一起移位(检查三个字节的顺序是否正确:最重要的字节在索引0处)
UInt64 Shifted = (UInt64)(Received[0] << 16) | (UInt64)(Received[1] << 8) | (UInt64)(Received[0])
现在移出四个结束的零:
UInt64 Shifted = Shifted >> 4;
要了解您的电压是多少,您必须知道转换器的规模。 Data sheet表示,&#34; LSB大小为VDD / 65536&#34;。你可以定义一个常量
const double VDD = 5; //For example 5V
之后,您可以使用
计算所需的双倍数return Shifted * (VDD / 65539); //Your voltage
希望这有帮助。