|
Об RS232, Как узнать конец посылки? |
|
|
|
Sep 2 2009, 08:41
|
Местный
  
Группа: Свой
Сообщений: 435
Регистрация: 12-09-07
Пользователь №: 30 482

|
Цитата(MrYuran @ Sep 2 2009, 11:17)  При использовании EV_TXEMPTY есть одна подлая особенность - то, что буфер пуст, не означает, что последний байт передан. Поэтому, например, когда мне нужно было переключать направление в полудуплексном RS-485, я добавлял в конец пакета фиктивный байт, по опустошению буфера переключал направление (ногой DTR) и последний байт "улетал в пустоту". Можно отсчитать паузу от эвента, но это дополнительная морока. Какую задержку нужно выставить, пару милисекунд? У меня тоже полудуплексный RS-485. Сделал так (без отслеживвания EV_TXEMPTY ): поставил задержку после запуска передачи 10 мс, потом переключаю направление ногой RTS. Так не всегда успевает или все передать, или все принять. Добавил еще задержку 20 мс ответа в приборе. Пока помогло, но что будет на другом ПК, или если операционка еще что-то будет делать. Это заставило поискать альтернаттиву.
|
|
|
|
|
Sep 2 2009, 08:49
|

Гуру
     
Группа: Свой
Сообщений: 3 615
Регистрация: 12-01-09
Из: США, Главное разведовательное управление
Пользователь №: 43 230

|
Цитата(kolisnichenko_r @ Sep 2 2009, 11:41)  Какую задержку нужно выставить, пару милисекунд? У меня тоже полудуплексный RS-485. Сделал так (без отслеживвания EV_TXEMPTY ): поставил задержку после запуска передачи 10 мс, потом переключаю направление ногой RTS. Так не всегда успевает или все передать, или все принять. Добавил еще задержку 20 мс ответа в приборе. Пока помогло, но что будет на другом ПК, или если операционка еще что-то будет делать. Это заставило поискать альтернаттиву. Самый мне понравившийся вариант, это просто слушать сам себя. Принимать сообщение, которое уходит в линию. Как только декодировал отправленное сообщение, сразу вырубать передачу.
|
|
|
|
|
Sep 2 2009, 09:24
|

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Блин, у меня тоже похожая , но немножко другая "беда"... Пишу сейчас маленькую "прогу" на Visual C++ , типа "оболочки". Программа обмена данными между компьютером и МК. Получается интересная вещь. Программа работает нормально, обмен идет, но стоит выключить "таргет" и включить его снова , как то-ли драйвер СОМ порта, то-ли сам СОМ порт впадает в интересный ступор. С компьютера все идет нормально, "таргет" на команды реагирует, только вот отвечать перестает... т.е. отвечать то он отвечает, но моя программа не видит ничего. Вывод из "ступора" происходит закрыванием моей программы, включением "терминала" и открыванием а затем закрыванием СОМ порта. использую библиотеку SerialGate.dll там тоже имеются команды Открытия порта, Закрытия порта, Очистки буфера... но не помогает  Возможно библиотека "кривая", возможно я "кривой" но вот такая петрушка... Может у кого ссылки есть на более продвинутые библиотеки+описание для Visual C++ ?
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
Sep 2 2009, 09:33
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(manul78 @ Sep 2 2009, 13:24)  использую библиотеку SerialGate.dll Вот., посмотрите. Третья ссылка сверху - удобный ПДФ. А потом решите, нужны ли ещё какие-то дополнительные обёртки к стандартному API
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 2 2009, 09:39
|

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Цитата(Dog Pawlowa @ Sep 2 2009, 13:32)  Это обычная реакция ПиСишного порта на брейк, который формируется при отключении устройства. Это состояние нужно обрабатывать. Каким образом ? И если не трудно объясните пожалуйста, что "там" происходит ? Я компьютеры на аппаратном уровне программировал только под ДОС лет 15 назад...  Возможно и сам-бы разобрался, но у XP Вындоуз заморочки с прямым доступом к портам, отсюда такие головоломки что приходится пользоваться чужими библиотекам...
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
Sep 2 2009, 09:54
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(manul78 @ Sep 2 2009, 13:39)  приходится пользоваться чужими библиотекам... пешыте на обшарпанном. Коллега вот писает кипятком по поводу тамошних готовых классов. Тем более всё равно в студии...
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 2 2009, 10:17
|

Местный
  
Группа: Участник
Сообщений: 403
Регистрация: 14-05-07
Из: Россия, г.Пенза
Пользователь №: 27 719

|
Цитата(MrYuran @ Sep 2 2009, 13:54)  пешыте на обшарпанном. Это на "Шарпе" что-ли ? Вникать долго, да и смысла нет, я просто "оболочку" пишу, раз в 100 лет. Вот нашел готовую библиотеку: public: enum IN_LINES_NAME {CTS, DSR, RING, RLSD}; enum OUT_LINES_NAME {DTR, RTS}; SerialGate(); ~SerialGate(); bool Open(int port, int baud); // открытие порта int Send(char* buff, int szBuff); // отправить int Recv(char* buff, int szBuff); // получить void SetLine(OUT_LINES_NAME ln, bool state); // установить линии bool GetLine(IN_LINES_NAME ln); // получить состояние линий void GetPortsInfo(PortInfo* pi); // проверка портов и их состояние void Close(); // закрыть порт void Clean(); // очистить буфер Может я что не так делаю ? Я думал, если открыть порт, очистить, закрыть и опять открыть - поможет. Не помогло  За API функции конечно спасибо, но я в них "зароюсь", квалификация не та
--------------------
" Многие вещи нам непонятны не потому, что наши понятия слабы; но потому, что сии вещи не входят в круг наших понятий." (с) К.Прутков.
|
|
|
|
|
Sep 2 2009, 10:22
|

Знающий
   
Группа: Свой
Сообщений: 648
Регистрация: 11-02-06
Из: Санкт-Петербург
Пользователь №: 14 237

|
Цитата(MrYuran @ Sep 2 2009, 12:59)  Мне вот почему-то кажется, что должен быть режим, в котором DTR (Data Transmit) сам обозначает время передачи. То есть автоматически. Правда, глубоко в этом вопросе не копал, а наскоком сделать не получилось. Довольствуюсь ранее описанными костылями У некоторых чипов UART (например, PCI-UART фирмы Exar) есть специальный режим работы, который называется "Auto RS485 Mode". Режим включается взведением бита в соотв. регистре, или через IOCTL драйвера. Суть режима в том, что он с помощью ножки RTS автоматически включает передатчик RS-485, с момента появления в передающем буфере данных до момента отправки последнего байта. В стандартном 16550А такой возможности, насколько мне известно, нет. P.S. Кстати, DTR - это не Data Transmitt ... это Data Terminal Ready, сигнализирует противоположной стороне готовность как раз принимать данные.
--------------------
Сделано в Китае. Упаковано в России.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|