在Arduino和RPi IOT C#之间通过I2C发送JSON字符串

时间:2017-01-28 10:57:09

标签: arduino raspberry-pi i2c windows-10-iot-core

我正在尝试通过I2C从Arduino Uno向运行Win IOT Core的RaspPi发送JSON字符串。

连接工作正常,我在Arduino端注册了一个事件处理程序,当master(rpi)请求数据时,它被称为正常。

void I2CRequest()
{
  Serial.println("I2C Request received");
 /*Send data to WinIoT */

 int bt = Wire.write(lastJSON.c_str());
 Serial.println(lastJSON);
 Serial.print("Send bytes: ");
 Serial.println(bt);
}

串行监视器上的输出看起来也很好......

I2C Request received
{"Sensor":"OneWire","data":["28ffc8675216451",23.9375,"28ff9feb521645e",24.0625]}
Send bytes: 81

RPi上的C#方法如下所示:

public static async Task<byte[]> GetI2CTemperatures()
    {
        var ReceivedData = new byte[1024];

        /* Arduino Nano's I2C SLAVE address */
        int SlaveAddress = 64;              // 0x40

        try
        {
            // Initialize I2C
            var Settings = new I2cConnectionSettings(SlaveAddress);
            Settings.BusSpeed = I2cBusSpeed.StandardMode;

            if (AQS == null || DIS == null)
            {
                AQS = I2cDevice.GetDeviceSelector("I2C1");
                DIS = await DeviceInformation.FindAllAsync(AQS);
            }


            using (I2cDevice Device = await I2cDevice.FromIdAsync(DIS[0].Id, Settings))
            {
                if (Device==null)
                {
                    Debug.Write("No access to I2C Device");
                }


                /* Read from Arduino  */
                Device.Read(ReceivedData);
            }
        }
        catch (Exception ex)
        {
            Debug.WriteLine("Exception occurred on reading I2C",ex);
            // SUPPRESS ANY ERROR
        }

        /* Return received data or ZERO on error */
        return ReceivedData;
    }
}

不幸的是,无论我做什么,我只会在ReceivedData 00作为第一个字节后跟FF s得到结果。 我也尝试了Device.ReadPartial()而不是Device.Read(),结果相同。

有人能指出我正确的方向,我做错了吗?

2 个答案:

答案 0 :(得分:1)

Arduino平台上的write()命令只写一个字节。您正尝试在单个命令中编写整个字符串。您需要遍历数组并分别发送每个字节。

但是,只要执行此操作,就会遇到32字节的缓冲区限制。可以将缓冲区增加到64字节,但这是Uno(Atmel 328)的限制。

我将一些代码放在一起,以展示如何在Uno和Raspberry Pi之间建立可以传输不同大小的JSON字符串的关系。该代码位于GitHub的 https://github.com/porrey/i2c

如果您想了解更多使用I2C在运行Windows IoT核心的Arduino和Raspberry Pi之间进行通信的方法,请参阅 https://www.hackster.io/porrey 中的我的Hackster项目:

  • 连接Raspberry Pi和Arduino
  • DHT Tiny Breakout for the Raspberry Pi
  • 在Raspberry Pi上发现i2c设备

答案 1 :(得分:0)

将这个字节数组转换为字符串可能会提供更多信息。

String myString = (char*)myByteArray