Связь двух Дуино
- Войдите на сайт для отправки комментариев
Вс, 08/01/2012 - 14:25
Всем привет!
Приобрел Craftduino и Freeduino. Регил их связать, чтобы те выполняли какие-то совместные задачи. Сразу уперся в проблему.
код передающего МК (передатчик)
#include <SoftwareSerial.h> SoftwareSerial Serial1(0, 1); unsigned int x = 0; void setup(){ Serial1.begin(9600); } void loop(){ Serial1.println(x); x += x == 1000 ? -1000 : 1; delay(1000); } ежику понятно, что передатчик раз в секунду передает число от 0 до 1000. передает на те же пины, что и обычный Serial
код передающего МК (передатчик)
#include <SoftwareSerial.h> SoftwareSerial Serial1(0, 1); SoftwareSerial Serial2(2, 3); void setup(){ Serial1.begin(9600); Serial2.begin(9600); } void loop(){ int ib = Serial2.read(); if(ib > 0){ Serial1.print(ib); Serial1.print(" -> "); Serial1.write(ib); Serial1.println(" "); } }
пин 1 (tx) передатчика подключил к пин 2 (rх) приемника, пин 0 (rx) передатчика к 3 (tx) приемника.
Собственно проблема в том, что на принимающей дуине я получаю мусор, например,
49 -> 1 3 -> 138 -> ┼ 50 -> 2 3 -> 138 -> ┼ 51 -> 3 3 -> 10 -> или 52 -> 4
150 -> √
153 -> ≥
133 -> ┘
133 -> ┘ то есть первый байт доходит без изменений, а все последующие как-то изменяются. Сначала подумал, что сдвиг на бит, но и тут оказалось, что ошибся. Подскажите, уважаемые спецы!
Админ, а почему нет редактирования сообщения? Криво как-то отпарсилось :(
Код приемника
ежику понятно, что передатчик раз в секунду передает число от 0 до 1000.
[...]
Собственно проблема в том, что на принимающей дуине я получаю мусор, например,
Никакого мусора там нет - что передаете, то и получаете. Это и ежику должно быть понятно.
Почитайте о функциях передачи класса Serial (print и println). Задайтесь вопросом, почему разработчик класса ввел в него целых две подобные функции - тоже поймете причины своих неудач.
ежику понятно, что передатчик раз в секунду передает число от 0 до 1000.
[...]
Собственно проблема в том, что на принимающей дуине я получаю мусор, например,
Никакого мусора там нет - что передаете, то и получаете. Это и ежику должно быть понятно.
Почитайте о функциях передачи класса Serial (print и println). Задайтесь вопросом, почему разработчик класса ввел в него целых две подобные функции - тоже поймете причины своих неудач.
внимательнее пожалуйста.
отправляю к примеру цифру. к примеру
х = 1;
Serial1.println(x);
тому же яжику ясно, что должно прийти три байта "1\r\n" или <49><13><10>, а приходит <49><3><138>
нужно резистором подтянуть вывод
внимательнее пожалуйста.
Посмотрел повнимательнее. Естественно, не ваш пост - уж больно креативное форматирование там использовано - а класс SoftwareSerial, а именно метод SoftwareSerial::read():
Шансы считать следующий за первым байт телеграммы у этого метода достаточно призрачные. Это возможно лишь в том случае, если время между очередными вызовами метода меньше паузы между очередными байтами телеграммы. А вы между чтениями очередных байтов отправляете по нескольку байтов через другой Serial-порт. Сколько времени это занимает и каково состояние на RX-пине в тот момент, когда вы наконец снова пытаетесь прочитать символ - одному микроконтроллеру и автору класса известно.
Так что еще раз повторяю - ищите разницу между Serial.print() и Serial.println() и используйте ее для обеспечения корректного приема пересылаемой информации.
тому же яжику ясно, что должно прийти три байта "1\r\n" или <49><13><10>, а приходит <49><3><138>
Приходит <49><13><10>. Вы неправильно обрабатываете поступающую информацию - не учитываете особенностей используемого класса.
ЗЫ: посмотрел метод SoftwareSerial::print(): за пересылаемым байтом выдерживается пауза всего в 1 bitDelay - около 1/10 миллисекунды (при скорости передачи 9600 bps). Только-только принятый байт в буфер записать...
Админ, а почему нет редактирования сообщения? Криво как-то отпарсилось :(
До тех пор, покам на ваш очередной пост никто не ответил, внизу справа доступна кнопка изменить. Пользуйтесь на здоровье.
carduino.ru пишет резистором подтяни :) полностью с ним согласен, а вобще я бы использовал связь по какому либо протоколу типа I2C, помехи и нестабильность при простой передаче по serial будут постоянно доставать. Нужна с связь с проверкой. Либо самому написать что то типа простого протокола связи.