Разработка, производство и продажа радиоэлектронной аппаратуры
|
Карта сайта
|
Пишите нам
|
В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:
jobsmp@pochta.ru
Телесистемы
|
Электроника
|
Конференция «Микроконтроллеры и их применение»
А точнее можно? Где затык конкретно - контроллер принимает неверно или комп?
Отправлено
Mk - 51
17 июня 2007 г. 13:40
В ответ на:
Как правильно использовать UART? У меня иногда передается ерунда, а иногда нормально. Не совсем понимаю, как происходит синхронизация передатчика (плата) и приемника (комп). Вот моя программа (точнее, она приведена вTechnical Note к LPC2148): (+)
отправлено <font color=gray>mayn</font> 17 июня 2007 г. 13:15
Составить ответ
|
Вернуться на конференцию
Ответы
Скорее комп. Я написал свою простенькую программу чтения, у нее были те же проблемы. Поэтому решил использовать готовую Tera Term Pro (типа Hyperterminal), которую использовали в Technical Note. Проблема следующая. (+)
—
mayn
(17.06.2007 14:00:26
87.245.133.19
, 361 байт)
Насколько я понял передача байт идет без пауз между ними? А может стоит ввести в цикл передачи паузу во время которой не будет передачи, длиной пару байт?
—
Laksus
(17.06.2007 21:07:26
88.214.122.250
,
пустое
)
На чем программа для компа написана? Если на Борланде, то лучший компонент TComPort и в нем куча настроек для COM-портов. А если через API пишешь, то обрати внимание на таймауты приемов пакетов.
—
Mk - 51
(17.06.2007 14:07:21
89.178.61.209
,
пустое
)
Я писал в VS 2005 и использовал чистый Win API. Таймауты сам не выставлял, разве что по умолчанию. А можно про эти таймауты по-подробнее? Таймауты чего и для чего они нужны?
—
mayn
(17.06.2007 14:10:47
87.245.133.19
,
пустое
)
Может готовые проги СОВРЕМЕННЫЕ использовать ? вот по линку
—
Kamila
(17.06.2007 14:19:36
69.41.173.145
, 350 байт,
ссылка
)
Использовал новую, проблема та же
—
mayn
(17.06.2007 14:41:38
87.245.133.19
,
пустое
)
Ну подробнее это в литературе, а в двух словах - если время таймаута выставлено меенее чем паузы между байтами в пакете, то после приема каждого байта будет событие "прем пакета", а если время таймаута выставлено больше чем пауза между пакетами, то все пакеты сольются в один, а если время таймаута выставлено где-то на границе, то будет то верный прием, то неверный.
—
Mk - 51
(17.06.2007 14:18:51
89.178.61.209
,
пустое
)
Наверно пока плохо смотрел, но где настраиваются эти таймауты? В структуре DCB их, кажется, нет. И неужели их можно с такой большой точностью выставить, скажем, для baudrate=128000 ?
—
mayn
(17.06.2007 14:25:27
87.245.133.19
,
пустое
)
Цитата из описания работы с COM-портом через API: "Основные параметры последовательного порта описываются структурой DCB. Временные параметры структурой COMMTIMEOUTS. Существует еще несколько информационных и управляющих структур, но они используются реже. Настройка порта заключается в заполнении управляющих структур и последующем вызове функций настройки."
—
Mk - 51
(17.06.2007 14:34:58
89.178.61.209
,
пустое
)
Хорошо, спасибо, я с этим поразбираюсь. Только до сих пор не могу понять, как комп опознает начало...ну хотя бы пакета, образующего байт?
—
mayn
(17.06.2007 14:43:40
87.245.133.19
,
пустое
)
Не "пакета образующего байт", а начало посылки. Это очень просто - после интервала времени соответствующего стоп биту (или 1.5, 2-м) порт приходит в ожидание старт бита. Вот этот-то старт бит и определяет начало посылки. Это аппаратная часть, а все остальное - часть программная, в том числе и таймауты.
—
Mk - 51
(17.06.2007 14:55:56
89.178.61.209
,
пустое
)
Правильно я понимаю, что пакет, посылка - это несколько бит между старт- и стоп-битами? А какие задавать значения параметров ReadIntervalTimeout, ReadTotalTimeoutMultiplier и ReadTotalTimeoutConstant структуры COMMTIMEOUTS? Не очень понятно и самому не получилось сделать.
—
mayn
(17.06.2007 19:53:33
87.245.133.19
,
пустое
)
Пакет - это N - ное число посылок из 6-9 бит, а посылка - это то, что между старт и стоп битами. Обычно посылка состоит из 8 бит (байт) с битом четности (9-тым) или без оного, поэтому будем называть посылку байтом. А значения параметров ReadIntervalTimeout, ReadTotalTimeoutMultiplier и ReadTotalTimeoutConstant структуры COMMTIMEOUTS относятся к пакету.
—
Mk - 51
(17.06.2007 20:27:42
89.178.61.209
,
пустое
)
А в MSDN написано, что ReadIntervalTimeout - Maximum time allowed to elapse BETWEEN the arrival of TWO BYTES on the communications line, in milliseconds.
—
mayn
(17.06.2007 21:35:45
87.245.133.19
,
пустое
)
А чему равно N - это что, 16 для 16-байтного стека FIFO в UART? Или это величина переменная, условная - какую зададим, такое число байт и считаем (в ReadFile)?
—
mayn
(17.06.2007 21:30:55
87.245.133.19
,
пустое
)
Я не знаю как объяснить элементарные вещи. Все что могу - N - это то, что сам определяешь, а стек FIFO в UART - это аппаратная часть, для предотвращения потерь при задержках выборки. Читайте литературу, а я иссяк.
—
Mk - 51
(17.06.2007 21:56:49
89.178.61.209
,
пустое
)
Спасибо за помощь!
—
mayn
(17.06.2007 22:03:18
87.245.133.19
,
пустое
)
Херня это все, вон болгарский коллега дело подсказывает -->
—
=AVR=
(17.06.2007 21:49:39
80.92.96.19
,
пустое
,
ссылка
)
Если честно (хотя вроде из вышесказанного ясно), я просто не до конца врубаюсь в работу UART. Мне бы какой-нибудь рабочий, надежный пример посмотреть. Я, например, не пойму, чему равно N у меня в программе для мк, притом, что он передает данные непрерывно. Или это число байт в буфере чтения для ReadFile?
—
mayn
(17.06.2007 22:10:32
87.245.133.19
,
пустое
)
Это не помогает, все равно далеко не всегда передается то, что надо
—
mayn
(17.06.2007 22:04:16
87.245.133.19
,
пустое
)
Задав правильно таймауты, я смогу надежно получать все посылки. А как лучше отмечать начало "сообщений" компу - только программно какими-то специальными символами? А если я хочу передавать бинарные данные?
—
mayn
(17.06.2007 15:24:45
87.245.133.19
,
пустое
)
Ну, есть куча всевозможных приемов! Например - конец пакета отмечать каким либо байтом с инверсным битом четности, тогда как данные с прямым битом четности и т.д. и т.п.
—
Mk - 51
(17.06.2007 15:40:51
89.178.61.209
,
пустое
)
и как тогда предлагаете на стороне PC это разгребать?
—
nestandart
(17.06.2007 15:46:5
87.180.1.237
,
пустое
)
Проще простого - будет выработана ошибка паритета и проверен байт (например 0xaa). Если да - конец обмена. Ну, а как быть, если ошибка будет в пакете, я думаю и без меня разберетесь! И чего здесь сложного-то! У меня на Delphi это занимает 15 строк в процедуре!
—
Mk - 51
(17.06.2007 17:24:53
89.178.61.209
,
пустое
)
Посомотрите, может, пригодится.
—
Леонид Иванович
(17.06.2007 16:19:9
87.252.227.57
,
пустое
,
ссылка
)
а как то можно это прикрутить к любимой терминалке ?
—
nestandart
(17.06.2007 16:39:39
87.180.1.237
,
пустое
)
Никак. В качестве терминалки там свой софт - WakeUp!
—
Леонид Иванович
(18.06.2007 12:16:48
87.252.227.57
,
пустое
)
Тут, может, и нет никакой проблемы. Программа для мк, скорее всего, сырая. Но тогда как ее улучшить(и/или программу чтения на компе), чтобы все было надежно.Как это ни странно,только начинаю работать с UART
—
mayn
(17.06.2007 14:04:7
87.245.133.19
,
пустое
)
Да и просьба откликнуться того дебила, что мой ник "Mk-51" запаролил. Редкий даун, видимо!
—
Mk - 51
(17.06.2007 13:42:57
89.178.61.209
,
пустое
)
Отправка ответа
Имя*:
Пароль:
E-mail:
Тема*:
Сообщение:
Ссылка на URL:
URL изображения:
если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
поделите 6 на два:
Перейти к списку ответов
|
Конференция
|
Раздел "Электроника"
|
Главная страница
|
Карта сайта
Web
telesys.ru