Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Теряются биты при обмене через СОМ-порт 
:(
    Опции темы
3EHbKA
Дата 19.11.2004, 23:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 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 раза с ошибкой, может чередоваться.

Пишу в порт просто:

Код

WriteFile(CommHandle, strg[1], Length(strg), KolByte, @Ovr);


Настройки порта:
Код


  GetCommState(CommHandle,DCB);
  DCB.BaudRate:=100;
  DCB.Parity:=NOPARITY;
  DCB.ByteSize:=7;
  DCB.StopBits:=ONESTOPBIT;
  DCB.Flags:=RTS_CONTROL_ENABLE;
  EscapeCommFunction(CommHandle,SETDTR);


Подскажите, кто что может, третий день от компа не отхожу, не могу разобтаться в чем проблема.
PM MAIL   Вверх
maxim1000
Дата 20.11.2004, 00:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



вот одна из возможных причин:
частота, на которой работает COM-порт, получается делением одной и той же частоты на разные делители
это приводит к тому, что реальная частота не так-то и часто совпадает с "заказанной"
если посмотреть спецификацию протокола UART, можно заметить, что для корректной работы необходимо, чтобы частоты устройств отличались не более, чем на 10% (если учесть наличие переходных процессов, условие, наверное, будет еще более жестким)
гипотеза такая: ПК не может обеспечить частоту 100 с нужной точностью
это легко проверить с помощью осциллографа...


--------------------
qqq
PM WWW   Вверх
3EHbKA
Дата 20.11.2004, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.11.2004

Репутация: нет
Всего: нет



Про частоту устройств я знаю, только читал, что отличие должно быть не более 5% на малых скоростях (у меня 100 бод), но это не суть важно.
Дело в том, что с этим же устройством работает программа, написаная на асме, работает нормально без сбоев!
Я пробовал менять частоту от 98 до 110 при скорости отличной от 100 прием/передача дополняется другими ошибками: пропадают и появляются другие биты, например отсылаю 0000111, а приходит 0000110.
А с помощью асцилографа обязательно проверю, как только найду его.

И еще забыл уточнить. Если я ставлю "заглушку" и передаю сам себе, то никаких проблем не возникает, все работает нормально, сбоев не обнаруживается.
PM MAIL   Вверх
maxim1000
Дата 20.11.2004, 11:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



очень странно... UART не располагает к появлению лишних битов...
а как с временными промежутками между последовательными пакетами? (будет ли ошибка, если их увеличить)
еще неплохо бы попробовать передавать все время одно и то же значение (возможно, ошибка станет чуть-чуть понятнее)
Цитата
Дело в том, что с этим же устройством работает программа, написаная на асме, работает нормально без сбоев!

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


--------------------
qqq
PM WWW   Вверх
3EHbKA
Дата 20.11.2004, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.11.2004

Репутация: нет
Всего: нет



Дело в том, что биты не появляются, а пропадает 1 бит, а вот появляется дополнительный байт.
Устройство подключено через адаптер:
--Resize_Images_Alt_Text--
Что Вы имеете в виду под "одним и тем же значением"? Всегда передавать один и тот же символ? К примеру я передаю 0001111, а принимается 000111, т.е. пропал последний бит.

PM MAIL   Вверх
p0s0l
Дата 20.11.2004, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Г-н Посол
****


Профиль
Группа: Экс. модератор
Сообщений: 3668
Регистрация: 13.7.2003
Где: 58°38' с.ш. 4 9°41' в.д.

Репутация: 14
Всего: 112



Я этим никогда не занимался... Поэтому только спрошу (возможно очень глупые вопросы smile, но хоть знать буду ):
Может SetCommState забыл ? smile
Что значит DCB.ByteSize:=7 ? Почему не 8 ? Может из-за этого "съедается" 1 бит (младший или старший в байте...) ?
В примере передаются куски по 5 бит. А в памяти хранится байтами по 8 бит... При передаче "обрезаются" 3 бита в каждом байте или как ? И как ты узнаешь, что получило устройство ?



--------------------
С уважением, г-н Посол.
PM   Вверх
3EHbKA
Дата 20.11.2004, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.11.2004

Репутация: нет
Всего: нет



1. SetCommState я не забыл, просто скопировал на одну строчку меньше, а на сайте у меня глюк какой-то со скриптами, поэтому не могу изменить.

2. DCB.ByteSize:=7 потому что принимается 7 битное слово, а значемые только 5, почему так я не знаю, не я устройство делал. Принимаю я все без проблем, а вот с отправкой проблеммы, делаю все по аналогии - записываю 5 бит, остальные не трогаю.

3. У устройства есть такая возможность - смотреть полученную информацию.
PM MAIL   Вверх
DonPager
Дата 20.11.2004, 16:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Колдырь
**


Профиль
Группа: Участник
Сообщений: 327
Регистрация: 28.3.2003
Где: Воронеж

Репутация: нет
Всего: 2



возможно ты "перегоняешь устройство" попробуй делать перед отправкой каждого байта задержку исходя из скорости передачи (для 19200 - 1024микросекунд(!), 38400 - 512 )- в общем определи экспереиментально


--------------------
кодер + лодырь = колдырь
PM MAIL ICQ Skype GTalk   Вверх
maxim1000
Дата 20.11.2004, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 3334
Регистрация: 11.1.2003
Где: Киев

Репутация: нет
Всего: 110



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


--------------------
qqq
PM WWW   Вверх
3EHbKA
Дата 20.11.2004, 18:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.11.2004

Репутация: нет
Всего: нет



Задержку делать тоже пробовал, только не по Вашей формуле, а наобум, ничего не получилось.
При установке зедержли в 196608 микросекунд = 196 милесекунд тоже ничего не выходит.
PM MAIL   Вверх
3EHbKA
Дата 20.11.2004, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 12.11.2004

Репутация: нет
Всего: нет



to maxim1000:
в том то и проблема, что нет какой-то закономерности появления ошибки, ошибки появляются непонятно из-за чего. Шлю одно и тоже примерно через равные промежутки времени(шлю в ручную путем нажатия на кнопку). Причем нет какой закономерности шлю я сразу после ответа или же через 20-30 секунд.
Цитата
еще при просмотре переданных и принятых данных у меня появилось ощущение, что неплохо бы попробовать разное количество стартовых бит...

Вы наверное имели в виду стоповые биты?

УРАААААААААА!!!!
Пока писал этописьмо эксперементировал с задержками, количеством стоповых битов, длиной слова... и О ЧУДО!!! Все заработало!!!

Дело было вот в чем:
т.к. у меня нет никакой документации по этому девайсу прием и передачу приходилось писать в слепую! Начинал писать с приема. Т.к. получилось с 7 битами и 1 стопом я решил, что так все и работает. НО сейчас попробовал 6 бит и 2 стоповых и все заработало!!!
Непонятно лишь одно. Почему ошибка у меня была динамическая. Но это уже не важно, главное что истина обнаружена!!! Надо это отметить. Пойду за винцом сгоняю.

ВСЕМ ОГРОМНОЕ СПАСИБО ЗА ПОМОЩЬ В ЭТОМ НЕ ЛЕГКОМ ДЕЛЕ.
ДАЖЕ НЕ ЗНАЮ КАК ВЫРАЗИТЬ ВАМ СВОЮ БЛАГОДАРНОСТЬ.
БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО.

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.1115 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.