Последовательная связь между двумя Arduino для аналогового чтения
У меня есть оптический датчик, подключенный к A0 на Arduino № 1 (Nano), который дает мне значения от 200 до 1010. Мне нужно получить эти значения в Arduino № 2 (Nano) через последовательную связь. Я использовал простой код для отправки и получения байтов, но я не понимаю, как получить фактические значения датчика как int. Я нашел несколько примеров, показывающих одиночные значения, но, насколько я понимаю, значения переменных более сложны.
Код передатчика:
void setup() {
pinMode(A0, INPUT);
Serial.begin(9600);
}
void loop() {
int sensorValue = analogRead(A0);
Serial.println(sensorValue);
}
Код получателя:
void setup() {
Serial.begin(9600);
}
void loop() {
if (Serial.available() > 0) {
int incomingByte = Serial.read();
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
}
@Chu, 👍0
Обсуждение2 ответа
Вам нужно ознакомиться со стандартной функцией C sscanf(). Он делает именно то, что вам нужно, преобразует строку ASCII в любой тип, который вам нравится.
API sscanf()
Код для чтения целого числа из последовательного порта будет выглядеть примерно так:
char recv_buf[10]; int recv_int;
Serial.readBytesUntil('\n', recv_buf, 9);
recv_buf[9] = 0; // убедитесь, что он завершается нулем
sscanf(recv_buf, "%d", &recv_int);
Serial.print("I received: ");
Serial.println(recv_int);
Один байт равен 8 битам, поэтому 2^8 равно 255. Один байт может содержать значение до 255. Поскольку у вас есть значение 1023 (максимально возможное), вам нужно разделить значение на два байта. Вот пример:
unsigned byte highValueByte(int value)
{
return (value >> 8);
}
unsigned byte lowValueByte(int value)
{
return (value - (highValueByte(value) << 8));
}
int giveValue(unsigned byte highByte, unsigned byte lowByte)
{
return ((highByte << 0) & 0xFF) + ((lowByte << 8) & 0xFFFF);
}
void loop()
{
int senValue = analogRead(/* PIN NUMBER */);
int byteOne = highValueByte(senValue);
senValue = lowValueByte(senValue);
}
Ваш код работает для одного байта (попробуйте), но не для двух байтов. Поскольку у вас есть два байта, вы должны ввести какой-то буфер.
Пример:
буфер байтов без знака[2] = { 0, 0 };
Также убедитесь, что вы правильно подключили контакты. RX от Arduino №1 переходит в TX от Arduino №2 и наоборот.
О синхронизации последовательной связи
- Как отправить несколько данных по последовательному каналу в одном байте?
- Каков наилучший (самый быстрый и надежный) способ отправки сообщений между Python на ПК и Arduino через последовательный порт?
- Проблемы при использовании SoftwareSerial
- Обработка данных, полученных по последовательному каналу
- Последовательная связь между ESP8266 и Arduino Uno
- Отправка последовательных данных в прерывании
- Почему люди используют 115200 вместо 9600?
- Как связаться с датчиком через порты RX/TX Arduino?
Возможно, вам следует замедлить последовательную печать на стороне передатчика. Arduino довольно быстро заполнит весь буфер, и каждая последовательная запись с полным буфером приведет к значениям, которые не будут переданы. Это также может быть проблемой с ответом Руди. Попробуйте добавить короткую задержку (100);, @chrisl