![]() |
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]() ![]() ![]() |
|
3EHbKA |
|
||||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 12.11.2004 Репутация: нет Всего: нет |
Здравствуйте, многоуважаемые.
Возникла у меня непонятная мне проблема: Есть устройство, которое передает и принимает информацию, подлючено она к СОМ-порту. Я написал прием, все работат нормально. Одноко при передаче ИНОГДА возникает такая непонятная ошибка: Отправляю: 00000 01010 11101 00100 11011 11100 01100 11000 0 A 1D 4 1B 1C C 18 приходит 0000 0101 1110 0010 1101 1110 0110 1100 11111 0 5 E 2 D E 6 C 1F т.е. приходит на 1 байт больше, а в предыдущих теряется 1 бит. Самое странное в том, что это динамическая ошибка и возникает примерно в 30% случаях. Никакой закономерности ее возникновения я не заметил. Может 10 раз выполниться без ошибки, а потом 3 раза с ошибкой, может чередоваться. Пишу в порт просто:
Настройки порта:
Подскажите, кто что может, третий день от компа не отхожу, не могу разобтаться в чем проблема. |
||||
|
|||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: нет Всего: 110 |
вот одна из возможных причин:
частота, на которой работает COM-порт, получается делением одной и той же частоты на разные делители это приводит к тому, что реальная частота не так-то и часто совпадает с "заказанной" если посмотреть спецификацию протокола UART, можно заметить, что для корректной работы необходимо, чтобы частоты устройств отличались не более, чем на 10% (если учесть наличие переходных процессов, условие, наверное, будет еще более жестким) гипотеза такая: ПК не может обеспечить частоту 100 с нужной точностью это легко проверить с помощью осциллографа... -------------------- qqq |
|||
|
||||
3EHbKA |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 12.11.2004 Репутация: нет Всего: нет |
Про частоту устройств я знаю, только читал, что отличие должно быть не более 5% на малых скоростях (у меня 100 бод), но это не суть важно.
Дело в том, что с этим же устройством работает программа, написаная на асме, работает нормально без сбоев! Я пробовал менять частоту от 98 до 110 при скорости отличной от 100 прием/передача дополняется другими ошибками: пропадают и появляются другие биты, например отсылаю 0000111, а приходит 0000110. А с помощью асцилографа обязательно проверю, как только найду его. И еще забыл уточнить. Если я ставлю "заглушку" и передаю сам себе, то никаких проблем не возникает, все работает нормально, сбоев не обнаруживается. |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: нет Всего: 110 |
очень странно... UART не располагает к появлению лишних битов...
а как с временными промежутками между последовательными пакетами? (будет ли ошибка, если их увеличить) еще неплохо бы попробовать передавать все время одно и то же значение (возможно, ошибка станет чуть-чуть понятнее)
тогда нужно смотреть, чем отличается механизм работы с COM-портом в двух программах -------------------- qqq |
|||
|
||||
3EHbKA |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 12.11.2004 Репутация: нет Всего: нет |
||||
|
||||
p0s0l |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: 14 Всего: 112 |
Я этим никогда не занимался... Поэтому только спрошу (возможно очень глупые вопросы
![]() Может SetCommState забыл ? ![]() Что значит DCB.ByteSize:=7 ? Почему не 8 ? Может из-за этого "съедается" 1 бит (младший или старший в байте...) ? В примере передаются куски по 5 бит. А в памяти хранится байтами по 8 бит... При передаче "обрезаются" 3 бита в каждом байте или как ? И как ты узнаешь, что получило устройство ? -------------------- С уважением, г-н Посол. |
|||
|
||||
3EHbKA |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 12.11.2004 Репутация: нет Всего: нет |
1. SetCommState я не забыл, просто скопировал на одну строчку меньше, а на сайте у меня глюк какой-то со скриптами, поэтому не могу изменить.
2. DCB.ByteSize:=7 потому что принимается 7 битное слово, а значемые только 5, почему так я не знаю, не я устройство делал. Принимаю я все без проблем, а вот с отправкой проблеммы, делаю все по аналогии - записываю 5 бит, остальные не трогаю. 3. У устройства есть такая возможность - смотреть полученную информацию. |
|||
|
||||
DonPager |
|
|||
![]() Колдырь ![]() ![]() Профиль Группа: Участник Сообщений: 327 Регистрация: 28.3.2003 Где: Воронеж Репутация: нет Всего: 2 |
возможно ты "перегоняешь устройство" попробуй делать перед отправкой каждого байта задержку исходя из скорости передачи (для 19200 - 1024микросекунд(!), 38400 - 512 )- в общем определи экспереиментально
-------------------- кодер + лодырь = колдырь |
|||
|
||||
maxim1000 |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: нет Всего: 110 |
можно попробовать определить зависимость ошибки от передаваемого значения, когда четко ясно, когда появляется ошибка, уже можно что-то думать...
еще при просмотре переданных и принятых данных у меня появилось ощущение, что неплохо бы попробовать разное количество стартовых бит... -------------------- qqq |
|||
|
||||
3EHbKA |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 12.11.2004 Репутация: нет Всего: нет |
Задержку делать тоже пробовал, только не по Вашей формуле, а наобум, ничего не получилось.
При установке зедержли в 196608 микросекунд = 196 милесекунд тоже ничего не выходит. |
|||
|
||||
3EHbKA |
|
|||
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 12.11.2004 Репутация: нет Всего: нет |
to maxim1000:
в том то и проблема, что нет какой-то закономерности появления ошибки, ошибки появляются непонятно из-за чего. Шлю одно и тоже примерно через равные промежутки времени(шлю в ручную путем нажатия на кнопку). Причем нет какой закономерности шлю я сразу после ответа или же через 20-30 секунд.
Вы наверное имели в виду стоповые биты? УРАААААААААА!!!! Пока писал этописьмо эксперементировал с задержками, количеством стоповых битов, длиной слова... и О ЧУДО!!! Все заработало!!! Дело было вот в чем: т.к. у меня нет никакой документации по этому девайсу прием и передачу приходилось писать в слепую! Начинал писать с приема. Т.к. получилось с 7 битами и 1 стопом я решил, что так все и работает. НО сейчас попробовал 6 бит и 2 стоповых и все заработало!!! Непонятно лишь одно. Почему ошибка у меня была динамическая. Но это уже не важно, главное что истина обнаружена!!! Надо это отметить. Пойду за винцом сгоняю. ВСЕМ ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ В ЭТОМ НЕ ЛЕГКОМ ДЕЛЕ. ДАЖЕ НЕ ЗНАЮ КАК ВЫРАЗИТЬ ВАМ СВОЮ БЛАГОДАРНОСТЬ. БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Delphi: WinAPI и системное программирование" | |
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |