Здравствуйте! у меня небольшой опыт в программировании, поэтому прошу совета у бывалых форумчан.
Суть вопроса в том, что бы передать считанное значение с аналогового входа от 0 до 1023 по uart на компьютер, где это значение далее будет преобразовано с помощью среды процессинг.
Необходимо что бы с принятыми значениями можно было далее работать т.е. осуществлять математические операции. Просто как строку через Serial.println передать получается, а вот как int уже проблема. Так как для того что бы передать 1023 необходимо использовать 4 байта и побайтно их передать а потом обратно собрать.
Много перечитал таких примеров на различных форумах но конкретно для моего случая ни чего не нашел. Поэтому если не сложно подскажите как примерно это сделать. И если это возможно то с помощью стандартных функций IDE.
только два, да и тех много, 1023 помещается в 10 бит, а в двух байтах 16.
А передать, например, так
int val = analogRead(A0);
byte lowByte = val & 0xFF;
byte highByte = (val >> 8) & 0xFF;
Serial.write(lowByte); Serial.write(highByte);
только работать это будет, только если вы ничего другого по этой линии передавать не будете. Иначе надо придумывать протокол.
Маски лишние.)
А что бы не путать старший/младший на приёмной стороне, байты можно пометить.
int val = analogRead(A0);
val = val<<1 | 1; //младший с младшим битом
byte lowByte = val;
byte highByte = val >> 8;
highByte <<= 1; //старший без
Serial.write(lowByte); Serial.write(highByte);
Теперь ТС-у задачка - написать приёмную часть.)
без шифрования, электронной подписи, контроля доставки - вааще нещитово!
Подозреваю, что конкретно для Вашего случая,
(подозреваю, что имеется в виду "от 0 до 1023) - это написать 1024 функции: (передача числа 0, передача числа 1, … передача числа 1023) и каждый раз вызывать нужную из них.
Никакого другого варианта в словах “конкретно для моего случая” я усмотреть не могу.
Я имел ввиду что любое от 0 до 1023 так сказать 10 бит к примеру раз в секунду.
Тут бы хоть как нибудь передать данные что бы они корректно приходили. Я так понимаю вы про CRC?
И в чем проблема, примеры кода выше
Если например analogRead выдаст число 500 чем является переменной val с типом данных int , то в младший байт lowByte(правый ) запишется значение 0b11110100, а в старший байт highByte (левый ) 0b00000001 после чего функция Serial.write(lowByte) ,Serial.write(highByte) передаст в порт значение младшего и старшего байта поочередно я все правильно понял ? Или мое мое понимание в корне не верно?
Вообще-то UART подразумевает, что данные могут передаваться только побайтно, т.е. порциями по 8 бит. Соответственно, 10 бит передать нельзя, можно только 16. Что, собственно, и нужно сделать. (строго говоря, 8-битный байт передается как раз как 10 бит, два из которых - служебные)
Так что Вы все-таки подразумевали под “конкретно Вашим случаем”, для чего в И-нете невозможно найти примеров?
Как Вы напишете, так и будет передавать.
А вообще, у меня подозрение, что Ваши проблемы связаны с непониманием того, что тип int может на разных архитектурах иметь разный размер. В частности, на 8-разрядных AVR - это два байта, а на ПК - четыре байта. Соответственно, Вам мало передать два байта через UART, Вам нужно еще уже в ПК поместить эти два байта в нужное место 4-байтового числа.
Есть ещё 2-байтный short int и можно не думать о “лишних” двух байтах.
Ну ребяты, ну пользуйтесь же там и там явными типами (типа int16_t, uint32_t) и не имейте проблем ни на одной из сторон.
А то пока до вас дойдет, что вы написали под видом long long unsigned char, модуль уже мимо Луны пролетит
И чем же short int отличается от двух младших байтов int? (кстати, размер short int точно так же не определен стандартом, как и int)