通过 I2C 在 Arduino 和 RPi IOT C# 之间发送 JSON 字符串
Sending a JSON String via I2C between Arduino and RPi IOT C#
我正在尝试通过 I2C 从 Arduino Uno 发送一个 JSON 字符串到 RaspPi 运行 Win IOT Core。
连接工作正常,我在 Arduino 端注册了一个事件处理程序,当主机 (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
a 00
作为第一个字节,后跟 FF
s.
我也尝试了 Device.ReadPartial()
而不是 Device.Read()
,结果相同。
任何人都可以指出我做错了什么的正确方向吗?
也许将此字节数组转换为字符串会提供更多信息。
String myString = (char*)myByteArray
Arduino平台上的write()
命令只写入一个字节。您正试图在单个命令中写入整个字符串。您将需要遍历数组并分别发送每个字节。
但是,一旦执行此操作,您将 运行 进入 32 字节缓冲区限制。可以将缓冲区增加到 64 字节,但这是 Uno (Atmel 328) 的限制。
我将一些代码放在一起来展示如何在 Uno 和 Raspberry Pi 之间建立关系,该关系可以传输不同大小的 JSON 字符串。代码在 GitHub https://github.com/porrey/i2c.
如果您想了解更多使用 I2C 在 Arduino 和 Raspberry Pi 运行ning Windows IoT Core 之间进行通信的方法,请参阅我的 Hackster 项目 https://www.hackster.io/porrey:
- 桥接 Raspberry Pi 和 Arduino
- Raspberry Pi
的 DHT 小突破
- 在 Raspberry Pi
上发现 i2c 设备
我正在尝试通过 I2C 从 Arduino Uno 发送一个 JSON 字符串到 RaspPi 运行 Win IOT Core。
连接工作正常,我在 Arduino 端注册了一个事件处理程序,当主机 (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
a 00
作为第一个字节,后跟 FF
s.
我也尝试了 Device.ReadPartial()
而不是 Device.Read()
,结果相同。
任何人都可以指出我做错了什么的正确方向吗?
也许将此字节数组转换为字符串会提供更多信息。
String myString = (char*)myByteArray
Arduino平台上的write()
命令只写入一个字节。您正试图在单个命令中写入整个字符串。您将需要遍历数组并分别发送每个字节。
但是,一旦执行此操作,您将 运行 进入 32 字节缓冲区限制。可以将缓冲区增加到 64 字节,但这是 Uno (Atmel 328) 的限制。
我将一些代码放在一起来展示如何在 Uno 和 Raspberry Pi 之间建立关系,该关系可以传输不同大小的 JSON 字符串。代码在 GitHub https://github.com/porrey/i2c.
如果您想了解更多使用 I2C 在 Arduino 和 Raspberry Pi 运行ning Windows IoT Core 之间进行通信的方法,请参阅我的 Hackster 项目 https://www.hackster.io/porrey:
- 桥接 Raspberry Pi 和 Arduino
- Raspberry Pi 的 DHT 小突破
- 在 Raspberry Pi 上发现 i2c 设备