2017-01-28 10 views
2

Я пытаюсь отправить строку JSON через I2C от Arduino Uno до RaspPi, запускающего Win IOT Core.Отправка строки JSON через I2C между Arduino и RPi IOT C#

Соединение работает нормально, я зарегистрировал обработчик событий на стороне 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 

Метод C# на RPi выглядит следующим образом:

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() с тем же результатом.

Может кто-нибудь указать мне в правильном направлении, что я делаю неправильно?

+0

вы пробовали removin g 'Serial.println (« Полученный запрос I2C »);' в 'I2CRequest()'? –

+0

Я пробовал (конечно) с тем же результатом ... Как следует удалить сообщение журнала? –

ответ

1

write() команда на платформе Arduino только записывает один байт. Вы пытаетесь написать всю строку в одной команде. Вам нужно будет пройти через массив и отправить каждый байт отдельно.

Однако, как только вы это сделаете, вы столкнетесь с 32-байтовым ограничением буфера. Можно увеличить буфер до 64 байтов, но это предел для Uno (Atmel 328).

Я добавил код, чтобы показать, как установить связь между Uno и малиной Pi, которая может передавать строку JSON разных размеров. Код находится в GitHub по адресу https://github.com/porrey/i2c.

Если вы хотите увидеть больше способов использования I2C для связи между Arduino и Raspberry Pi под управлением Windows IoT Ядро видеть мои проекты Hackster на https://www.hackster.io/porrey:

  • Преодоление Raspberry Pi и Arduino
  • DHT Крошка Breakout для Raspberry Pi
  • Discover устройств I2C на Raspberry Pi
0

Возможно, это массив байтов в строку предоставит больше информации.

String myString = (char*)myByteArray 
Смежные вопросы