Wire.write(distance);
хочет записать long
на шину I2C. Для Arduino Это 32 бита, 4 байта данных. Я не совсем уверен, что именно делает wire.write
, потому что документация, которую я могу найти, не соответствует стандартам и может быть мусором, но документация выглядит так, как будто она отправит ровно 1 из 4 байтов, которые вы хотелиОтправить. Для отправки более одного байта похоже, что вам нужно использовать версию массива: Wire.write(&distance, sizeof (distance));
, но даже этого может быть недостаточно. Я вернусь к этому позже.
Wire.write("Why No Work?");
записывает строку с нулевым символом в конце (в частности, const char[13]
) на шину I2C. Я недостаточно хорошо знаю arduino, чтобы знать, посылает ли это также завершающий ноль.
, поэтому
Wire.write(distance);
Wire.write("Why No Work?");
Wire.write(distance);
необходимо записать как минимум 4 + 12 + 4 байта на шину I2C. и, вероятно, написал только 1 + 12 + 1.
На стороне Pi
read(file,buf, 3);
зачитал 3 байта. Этого недостаточно для получения всего distance
, не говоря уже о массиве символов и второй записи distance
. Вам нужно прочитать все данные, которые вы написали, по крайней мере 20 байтов.
Кроме того,
char buf[0];
определяет массив длины 0. Вы ничего не можете с этим поделать, так как здесь нет места для хранения чего-либо. Он не может содержать 3 символа, не говоря уже о 20 или 21, необходимых. read
из 3 байтов, записанных в недопустимую память, и программа больше не может рассчитывать на нормальные результаты .
Это означает, что в лучшем случае
float distance= (int) buf[0];
dd= buf[1];
float dist=(int) buf[2];
получил только один байт из четырех байтов distance
, и это глупое счастье, что результат оказался таким же, как ожидалось. dd
получил ровно один символ, а не всю строку, и это оказывается чепухой из-за одной из предыдущих ошибок. dist
аналогично фигня.
Чтобы успешно переместить данные с одного компьютера на другой, вам необходимо установить протокол связи. Вы не можете просто написать long
на провод. long
не имеет одинакового размера на всех платформах и не всегда имеет одинаковую кодировку . Вы должны быть абсолютно уверены, что обе стороны согласны с тем, как записать long
(размер и порядок байтов) и прочитать.
Как именно вы собираетесь это сделать, решать только вам, но вот несколько указателей и поисковый термин serialization , чтобы помочь вам в дальнейших исследованиях.