Режимы работы SoftwareSerial

Radjah
Offline
Зарегистрирован: 06.08.2014

При запуске аппаратного последовательного порта можно указать кроме скорости еще и формат данных типа SERIAL_8N2.

Я так понял, что программная реализация умеет только скорость менять. Может есть какая библиотека для этого? Полдня гугл сегодня мучил.

Да, 4 порта на Mega мне не хватает, нужно 5.

Ну или подскажите, как добавить еще один порт, который умеет 2 стоповых бита. :)

Собственно проблема состоят в добавлении еще одного порта и проёме на него данных в формате 8-N-2

leshak
Offline
Зарегистрирован: 29.09.2011

Вот тут http://forum.pjrc.com/threads/24199-AltSoftSerial-amp-parity-e-g-begin(9600-SERIAL_8E1)
Человек пытался "допилить подобную поддержку" в AltSoftSerial....  с помощью автора AltSoftSerial.
Но не вникал особо "что там у него в итоге вышло"

 

Radjah
Offline
Зарегистрирован: 06.08.2014

Короче, SoftwareSerial принимает SERIAL_8N2 нормально. Вопрос закрыт :)

alfik777
alfik777 аватар
Offline
Зарегистрирован: 29.06.2015

Если разобрались, подскажите, подалуйста,  где что подкрутить... Нужно подружить  Softwareserial  с  данными в формате с контролем четности  8/1/1 .

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Тут полный список : https://forum.pjrc.com/threads/24199-AltSoftSerial-amp-parity-e-g-begin%289600-SERIAL_8E1%29?p=69902&viewfull=1#post69902

 case SERIAL_8O1
 parity = 1;
 data_bits = 8;

alfik777
alfik777 аватар
Offline
Зарегистрирован: 29.06.2015

Что-то мудрёно...Т.е. штатным образом имеющийся SoftwareSerial  на такое не способен? Вроде же ТС  запустил:

Radjah пишет:
Короче, SoftwareSerial принимает SERIAL_8N2 нормально....

Radjah
Offline
Зарегистрирован: 06.08.2014

Ну по крайней мере на 9600 он у меня хавал всё нормально.

alfik777
alfik777 аватар
Offline
Зарегистрирован: 29.06.2015

Ну так мне 9600 и надо. Что и где  конкретно нужно прикрутить?

Radjah
Offline
Зарегистрирован: 06.08.2014

Ничего не надо. Только пины правильно задать.

alfik777
alfik777 аватар
Offline
Зарегистрирован: 29.06.2015

SoftwareSerial SIM(2,3);

Я так понимаю - это неправильно.

Radjah
Offline
Зарегистрирован: 06.08.2014

На Mega я делал так:

SoftwareSerial swSerial(10, 11); // RX - 10, TX - 11

Главное, чтобы RX висел на порту, который умеет прерывание.

alfik777
alfik777 аватар
Offline
Зарегистрирован: 29.06.2015

Или я чего-то не понимаю или... я не понимаю ничего...И где здесь задается формат данных? Откуда SOFTWARESERIAL узнает про директора кроватной фабрики? Я считал, что по аналогии с hard должна быть запись что-то типа SoftwareSerial swSerial.begin(9600, SERIAL_8O1) , но так не пройдет.

Radjah
Offline
Зарегистрирован: 06.08.2014

Нету тут такого.

Смотри ответ #6.

alfik777
alfik777 аватар
Offline
Зарегистрирован: 29.06.2015

А как же  он проглотил Ваш  SERIAL_8N2 ? Он сам автоматом  "подстроился" ?

Datak
Offline
Зарегистрирован: 09.10.2014

alfik777 пишет:

А как же  он проглотил Ваш  SERIAL_8N2 ? Он сам автоматом  "подстроился" ?

Заданное количество стоповых битов, в любых com-портах, и программных и аппаратных, влияет только на передачу - то есть, может немного увеличить паузу между передаваемыми байтами.

Но на приёме всегда проверяется наличие одного стопового бита. Поэтому и "подстроился", скорей всего. 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Глупость.
Особенно про "подстроился"  
Совпало- да.
Чётность-нечётность и количество стопов не зря задают чтобы принять вообще и ошибку поймать в частности.

Все в основном юзают 8N1, но это не факт что все юзают.

Например как вы отличите на приёме 8N1  и 7O2
Ваш восьмой бит будет  или данными или чётностью предыдущих семи.

Успехов с чтении......   ;)

Datak
Offline
Зарегистрирован: 09.10.2014

Но 8N1 и 8N2 будут свобдно взаимно передаваться/приниматься. Количество стоповых битов, при приёме, значения не имеет - во всех аппаратных com-портах которые я встречал, и надеюсь в программных тоже.

К информационным битам, и биту чётности, это не относится - их количество в настройках передачи и приёма должно, разумеется, полностью совпадать.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Не спорю, 8N1 и 8N2 будут приниматься 99.9% нормально.
0.1% на то, что между окончанием 8N1 и стартом передачи следующего байта не будет паузы от слова совсем.
Тут уж как приёмная сторона решит: вдруг она увидив один стоп и ожидая второго выбьет ошибку приняв старт
( сорри, всё время путаю марк и спэйс, поэтому пишу старт-стоп)

Datak
Offline
Зарегистрирован: 09.10.2014

trembo, в документации, например, на "стандартный" 16550 UART указано явно, что второго стоп-бита приёмник ждать не будет - одного ему вполне достаточно, независимо от установленного режима работы.
Поэтому я тут и упираюсь. :)

Цитата:
The Receiver checks the first Stop-bit only, regardless of the
number of Stop bits selected.

Насчёт других микросхем, и тем более программных реализаций - да, согласен, нужно уточнять для каждого конкретного случая.

duser
Offline
Зарегистрирован: 27.08.2018

Radjah пишет:

Короче, SoftwareSerial принимает SERIAL_8N2 нормально. Вопрос закрыт :)

Уважаемые знатоки !
 
Помогите советами по правильному построению сети Modbus на основе NodeMcu V3 Lua WI-FI.
Необходимо считывать данные по RS485 (модуль на MAX485) с 4-х Modbus-устройств с двумя вариантами настройки параметров  последовательного порта (9600-SERIAL_8N1 и 9600-SERIAL_8N2) и отправлять данные в Blynk и через Modbus TCP на удалённый OPC-сервер.
Не смог задать параметры 8N2 (кроме скорости 9600) в  FLProg, поскольку автором программы был задан единственный вариант конфигурации: 8N1 .
Пришлось править скетч в Arduino IDE, добавляя запись типа SoftwareSerial swSerial.begin(9600, SERIAL_8N2).
Далее в ходе реализации проекта на основе аппаратного последовательного порта столкнулся с проблемой компиляции (см. фрагмент скетча). 
error: 'UCSR0A' was not declared in this scope
 UCSR0A=UCSR0A |(1 << TXC0);
 ^
pr7:372: error: 'TXC0' was not declared in this scope
 UCSR0A=UCSR0A |(1 << TXC0);
                     ^
exit status 1
'UCSR0A' was not declared in this scope

Пытался реализовать проект на программном последовательном порту, и понял, что программная реализация умеет только скорость менять. Может уже есть какая библиотека для этого ?

В общем, требуется подключить к контроллеру две платы RS485 (модуль на MAX485) и развернуть на двух последовательных портах NodeMcu две сети Modbus с двумя вариантами настройки параметров  последовательного порта (9600-SERIAL_8N1 и 9600-SERIAL_8N2). 
 
Ну или подскажите, как решить проблему компиляции и как добавить ещё один порт, который умеет работать с двумя стоповыми битами. :)
ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Так всё же есть альтернативный SoftwareSerial в котором можно задавать параметры данных?

Нашёл вот здесь

MaksVV
Offline
Зарегистрирован: 06.08.2015

да , опоздал )

Radjah
Offline
Зарегистрирован: 06.08.2014

ua6em пишет:

Так всё же есть альтернативный SoftwareSerial в котором можно задавать параметры данных?

Нашёл вот здесь

Initial commit

ledongthuc committed on 3 May 2015

Жаль, что на момент создания темы ещё не было. Добавил в закладки.

Green
Онлайн
Зарегистрирован: 01.10.2015

Проблемы softSerial-ов в том, что одни долго торчат в обработчике прерываний. Со всеми вытекающими... С другой стороны, других решений не видно.(

Logik
Offline
Зарегистрирован: 05.08.2014

Green пишет:

Проблемы softSerial-ов в том, что одни долго торчат в обработчике прерываний. Со всеми вытекающими... 

Да.

Green пишет:

С другой стороны, других решений не видно.(

Нет. Реализуемо для небольших скоростей, до 4800.

Green
Онлайн
Зарегистрирован: 01.10.2015

Logik пишет:

Нет. Реализуемо для небольших скоростей, до 4800.


Ну да. Наверно можно играться с таймером, попадая в средину бита. Но, опять таки, если тебе не портят жизнь другие прерывания.)
А из за этих SoftSerial-ов даже tone нельзя нормально сформировать. Хрипит по чём зря.)

Logik
Offline
Зарегистрирован: 05.08.2014

Ну типа. 4 прерывания таймера на бит. Обработчик короткий как выстрел. Остальные прерывания тоже не длинные должны быть.

Green
Онлайн
Зарегистрирован: 01.10.2015

Ну 4 прерывания на бит - это совсем хорошо, как учат в школе.) Думаю, одним можно обойтись, чай не графья.) Опять таки - от серьёзности зависит.

Logik
Offline
Зарегистрирован: 05.08.2014

Если одновременно прием и передача - никак одним.  Разве что два таймера, один принимает, другой передает. Но это явно не лучше чем 4 прерывания на бит на одном таймере.

 

//Ну 4 прерывания на бит - это совсем хорошо, как учат в школе.) 

Бля, меня чето в школе такому не учили, даже в высшей. Может школа не та была... )))

 

Можно еще пытатся перенастраивать интервал таймера по ходу прием и передачи. Тогда два прерывания на бит при двустороннем обмене, но сам расчет интервала в обработчике прерывания будет занимать время, удлинять обработчик. В общем не факт что так удастся быстрей работать.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

на библиотеке, что дал ссылку заработало, иногда, на десять пакетов проскакивает сбой приёма, но это можно в скетче отфильтровать, на  SoftwareSerial вообще не взлетело

Green
Онлайн
Зарегистрирован: 01.10.2015

Logik пишет:

Бля, меня чето в школе такому не учили, даже в высшей. Может школа не та была... )))


Ну это образно.) Насколько помню, Атмел учит обходиться тремя выборками на бит. Потому и школа.))

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Одолел DetSimen_а библиотеку под YAESU девайсы, обернул в правленный SomeSerial CustomSoftwareSerial, нужны были параметры 8N2