Перейти к содержанию
    

А зачем два байта 0хF0?

Почему нельзя сделать так:

 

1.Включаем передатчик.

2.Ждём пока линия устаканится... (согласно DS).

3.Пауза длительностью 1 байт (что бы все приёмники закончили принимать (если начали) возможный мусор).

4.Передаём пакет.

Вспомнилось еще про <BREAK>

Очень удобен для frame sync, жаль только, что надо во фрейме либо явно длину пакета указывать либо два брэка делать, в начале и конце, что сильно избыточно.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему нельзя сделать так:

Почему нельзя? Можно конечно. Но обычно сделать паузу сложнее/накладнее, чем передать пару байт преамбулы.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я так понимаю, нет возможности (скорее - желания) у программера просто ПОДОЖДАТЬ

несколько коррелируется со связями на плате, когда нет возможности убрать звон и приходится такт-два добавлять к задержкам

Или я в другое уполз? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, для отсчёта паузы обычно нужен таймер, а их всегда жалко:)

Жалко... Кто их даст?! Своих кормить нечем, а тут протоколы всяки :)

Что до преамбулы - не пойму, чем может два подряд 0xF0 помочь? они что, frame error как-то помогают спровоцировать? Там нулей должно быть побольше...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, для отсчёта паузы обычно нужен таймер, а их всегда жалко:)

ну тогда мы приплываем где-то ко второму листу обсуждения

и вопрос, собственно, сводится к одному - как понять, что первый байт - самый первый

меня, например, F0 тоже не вдохновил никак

Удержать линию в любом уровне (желательно - неактивном для приемника, но стабильном) - пожалуйста

все равно с компа не получится (хотя.. RTS/CTS) управлять активностью передатчика

 

ТС, бейте индуса по маковке :)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что до преамбулы - не пойму, чем может два подряд 0xF0 помочь?

А вы нарисуйте картинку, станет понятно. 0xF0 - это пять нулей, затем 5 единиц. Если мы поймаем старт-бит за 8..5 бит до начала 0xF0, то получим стоп-бит в первых пяти нулях и framing error, если за 4..1 бит, то 5 eдиниц будут стопом. Таким образом, второй 0xF0 ловится всегда целым.

 

 

и вопрос, собственно, сводится к одному - как понять, что первый байт - самый первый

Дык, вот F0F0 как раз отлично подходит:)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы нарисуйте картинку, станет понятно. 0xF0 - это пять нулей, затем 5 единиц. Если мы поймаем старт-бит за 8..5 бит до начала 0xF0, то получим стоп-бит в первых пяти нулях и framing error, если за 4..1 бит, то 5 eдиниц будут стопом. Таким образом, второй 0xF0 ловится всегда целым.

 

 

 

Дык, вот F0F0 как раз отлично подходит:)

мы ждем уровня? или отрицательного фронта?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы нарисуйте картинку, станет понятно. 0xF0 - это пять нулей, затем 5 единиц. Если мы поймаем старт-бит за 8..5 бит до начала 0xF0, то получим стоп-бит в первых пяти нулях и framing error, если за 4..1 бит, то 5 eдиниц будут стопом. Таким образом, второй 0xF0 ловится всегда целым.

Убедили.

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Дык, вот F0F0 как раз отлично подходит:)

Правильно ли я понимаю:

Передатчик в начале всегда добавляет два байта F0.

Приёмники постоянно ждут F0, а следующий за F0 байт (если он не равен F0) считают первым?

Если так, то блок данных не может начинаться с F0.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правильно ли я понимаю:

Передатчик в начале всегда добавляет два байта F0.

Приёмники постоянно ждут F0, а следующий за F0 байт (если он не равен F0) считают первым?

Если так, то блок данных не может начинаться с F0.

Имеется в виду прием, называемый эскейп-последовательностью.

Например, в WAKE

И кстати, непонятно, чем 0xC0 так приглянулось :)

Изменено пользователем _Pasha

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Почему нельзя сделать так:

1.Включаем передатчик.

2.Ждём пока линия устаканится... (согласно DS).

3.Пауза длительностью 1 байт (что бы все приёмники закончили принимать (если начали) возможный мусор).

4.Передаём пакет.

Пауза перед началом пакета нужна не только для того, чтобы UARTы закончили прием мусора. Она еще служит сигналом сброса.

 

В Мобасе в начале пакета выдерживается пауза 3.5 байт-интервалов. А в самом пакете пауза между байтами не должна превышать 1.5 байт-интервалов, если склероз не подводит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А в самом пакете пауза между байтами не должна превышать 1.5 байт-интервалов, если склероз не подводит.

Этож проц только и будет шо паузы считать!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Правильно ли я понимаю:

Передатчик в начале всегда добавляет два байта F0.

Приёмники постоянно ждут F0, а следующий за F0 байт (если он не равен F0) считают первым?

Если так, то блок данных не может начинаться с F0.

 

В моем случае приемники ничего особенного не "ждут". Они реагируют на байты входного потока определенным образом, примерно так:

 

- Eсли байт равен 0xF0, то очищают приемный буфер

- Если байт равен ESC-символу 0x1B, то он выбрасывается, а на следующий за ним символ реакция такая:

-- если второй байт равен 0х01, то в приемный буфер записывается символ 0x1B

-- если второй байт равен 0х02, то в приемный буфер записывается символ 0xF0

-- если второй байт равен 0х03, то прием пакета (фрейма) заканчивается, проц начинает разбираться с содержимым приемного буфера

- Если ничего из вышеописанного, то входной символ просто записывается в приемный буфер

 

При передаче в самом пакете данных символы 0xF0 заменяются на пары 0x1B, 0х02, а символы 0x1B - на пары 0x1B, 0х01.

Перед началом пакете передается пара символов 0xF0, 0xF0, а по окончании передачи пакета - пара 0x1B, 0х03.

 

Этож проц только и будет шо паузы считать!

Делается по прерываниям и много процессорного времени не отнимает. Но приходится использовать два таймера.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В Мобасе в начале пакета выдерживается пауза 3.5 байт-интервалов.

Не в начале, а в конце, иначе как слейвы узнают, что пакет пришел?

 

Делается по прерываниям и много процессорного времени не отнимает. Но приходится использовать два таймера.

Не два, а один, с тиком 50мкс. Минимальный Т35 чудесным образом равен 35, Т15 = 15 тикам. Это, как Вы знаете, про FreeModbus, но не думаю, что другие решения более разумны.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...