C#和Arduino Master / Slave从AD读取3个字节

时间:2016-03-29 13:55:53

标签: c# arduino

我目前正在研究一个主/从,其中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;
}

1 个答案:

答案 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

希望这有帮助。