Общение двух Atmega328p по COM порту

Тема в разделе "Arduino & Shields", создана пользователем Rauf, 6 окт 2016.

  1. Rauf

    Rauf Нерд

    так сразу бы и сказали что ваши советы платные!
     
  2. Rauf

    Rauf Нерд

    Здравствуйте! Благодарю за ссылку. 300 метров это временная локация затем переместится будка на 600-800 метров. RS485 Передача данных осуществляется на большие расстояния (длина линии связи до 1,2 км).
     
  3. DKo

    DKo Нерд

    RS-485 должен работать, однако это всего-лишь физический уровень интерфейса. Исходя из Вашего алгоритма не очень понятен один момент: Вы собираетесь протянуть Serial соединение через RS-485? Может быть стоит посмотреть в сторону классических промышленных протоколов, например Modbus, построенных как раз на RS-485, Мб в них уже будет функция проверки целостности пакета, как в TCP?
     
  4. Rauf

    Rauf Нерд

    За два дня прочёл много новой для меня информации!
    Вот
    Код (C++):
    Serial.begin(speed, config)
    и параметр для него выставил SERIAL_8N1.
    Как я понял этот параметр запускает алгоритм проверки чётности пакетов. Но в интернете не смог найти полной информации со всеми возможностями SERIAL.
    Может кто подскажет:
    1 - где достать полную информацию
    2 - правильно ли я понял что данный параметр включит проверку пакетов и в случае не совпадения будет требовать повторной пересылки? И будет ли это работать автоматом или ещё нужно включить и дописать для этого?
    3 - я выставил данный параметр на обеих устройствах. Правильно ли это?
     
  5. Onkel

    Onkel Гуру

    1 да хоть в вики
    2 Да, нет, просто выдаст ошибку если спросить модуль usart об ошибках.
    3 да
     
  6. Rauf

    Rauf Нерд

    https://www.arduino.cc/en/Serial/Begin
    много гуглю но не могу найти описание процесса при параметре 8N2 везде коротко написано что это параметр а как работает?
     
  7. Onkel

    Onkel Гуру

  8. Rauf

    Rauf Нерд

    Прошу подсказать какой из параметров активирует проверку чётности?

    Parameters

    speed: in bits per second (baud) - long
    config: sets data, parity, and stop bits. Valid values are :

    • SERIAL_5N1
    • SERIAL_6N1
    • SERIAL_7N1
    • SERIAL_8N1 (the default)
    • SERIAL_5N2
    • SERIAL_6N2
    • SERIAL_7N2
    • SERIAL_8N2
    • SERIAL_5E1
    • SERIAL_6E1
    • SERIAL_7E1
    • SERIAL_8E1
    • SERIAL_5E2
    • SERIAL_6E2
    • SERIAL_7E2
    • SERIAL_8E2
    • SERIAL_5O1
    • SERIAL_6O1
    • SERIAL_7O1
    • SERIAL_8O1
    • SERIAL_5O2
    • SERIAL_6O2
    • SERIAL_7O2
    • SERIAL_8O2
     
  9. Rauf

    Rauf Нерд

    Короткая запись параметров[править | править вики-текст]
    Был выработан и прижился короткий способ записи параметров UART, таких, как количество бит данных, наличие и тип бита четности, количество стоп-бит. Выглядит как запись вида цифра-буква-цифра, где:

    • Первая цифра обозначает количество бит данных, например, 8.
    • Буква обозначает наличие и тип бита четности. Встречаются N (No parity) — без бита четности; E (Even parity) — с битом проверки на четность, O (Odd parity) — с битом проверки на нечетность;
    • Последняя цифра обозначает длительность стоп-бита. Встречаются значения 1, 1.5 и 2 для длительности стоп-бита в 1, 1.5 и 2 битовых интервала соответственно.
    Например, запись 8-N-1 обозначает, что UART настроен на 8 бит данных без бита четности и один стоповый бит. Для полноты параметров эту запись снабжают указанием скорости UART, например, 9600/8-N-1.
     
  10. ostrov

    ostrov Гуру

    Не заметил тут упоминания rs485. Не она ли тут нужна?
     
  11. Rauf

    Rauf Нерд

    Подключил логический анализатор и получил следующую картинку. 1 байт это отправленная переменная, 2 байт \r и третий \n. Что означают они? Третий скорее всего о завершении трансляции а вот \r?
     

    Вложения:

    • 1.png
      1.png
      Размер файла:
      79,1 КБ
      Просмотров:
      493
  12. Rauf

    Rauf Нерд

    До того как посылать данные на RS485 я хочу полностью разобраться в передачи данных без них. А затем уже поставить RS485 для увеличения расстояния между ними.
     
  13. Rauf

    Rauf Нерд

    Serial.println()
    Передает данные через последовательное соединение как ASCII текст с следующим за ним символом переноса строки (ASCII символ 13 или '\r') и символом новой строки (ASCII 10 или '\n'). Пераметры и типы данных для этой функции такие же, как и для Serial.print().

    и в этом разобрался
     
  14. Onkel

    Onkel Гуру

    \n\r - перевод строки и возврат каретки, иногда перевод строки считается только комбинацией этих двух символов.
     
  15. Rauf

    Rauf Нерд

    Остаётся один вопрос при параметре
    Код (C++):
     Serial.begin(9600, SERIAL_8E1);
    в случае не совпадения чётности автоматически запрашивается повтор пересылки или нужно что то прописать ещё чтобы повторно запрашивать?
     
  16. Onkel

    Onkel Гуру

    нет, не запрашивает, просто выставляет бит ошибки четности в регистре usart.
     
  17. Rauf

    Rauf Нерд

    Получается нужно написать код который проверяет или срабатывает в случае записи бита ошибки? И в действии нужно опросить по новой отсылающее устройство? Если есть пример кода поделитесь пожалуйста. Мне обязательно нужно сделать повторную отправку команды в случае ошибки. Помогите кто чем может. За ранее благодарю.
     
  18. Onkel

    Onkel Гуру

    я делаю так
    мастер посылает команду (с контрольной суммой)
    slave по получении команды отвечает копией полученной команды (с кс)
    мастер ждет ответа х мс (также с контрольной суммой)
    если нет ответа (ответ с неправильной кс =нет ответа), то мастер перепосылает команду у раз или до получения ответа о принятии команды.
     
  19. Rauf

    Rauf Нерд

    Поделитесь пожалуйста кодом проверки контрольной суммы.
     
  20. Onkel

    Onkel Гуру

    в простейшем случае просто суммируете , потом оставляете последний байт и сравниваете его с переданной контрольной суммой. Сумма она и есть сумма. Есть более сложные варианты проверки правильности переданной посылки, но по мне контрольной суммы достаточно.