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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как работать с ком-портом из под Delphi? 
:(
    Опции темы
Alexzz
Дата 2.10.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Возникла необходимость работать с устройством подключенным через ком-порт. Искал в хелпах, искал тут по форуму но что-то ничего не нашёл. Предполагаю что где-то есть эта инфа, просто не умею найти. Не судите строго, просто ткните меня в неё носом.
PM WWW ICQ MSN   Вверх
Alexeis
Дата 2.10.2007, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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





--------------------
Vit вечная память.

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

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Felan
Дата 3.10.2007, 08:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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





--------------------
// Любая сложная система - это темный лес. Каждый в этом лесу протаптывает свои тропинки, по ним и бегает. Лишь изредка, сходя с них, мы находим много интересного, а порою и страшного.
PM MAIL WWW ICQ   Вверх
Alexzz
Дата 3.10.2007, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ага, спасибки, на досуге буду разбираться.
PM WWW ICQ MSN   Вверх
Alexzz
Дата 6.10.2007, 11:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну вот, удалось мне заставить моё внешнее устройство мне ответить. Примерно как в том анекдоте про кгбшников и тутанхамона - "Сам сознался".
Но вот есть ещё одна маленькая проблемка. Устройство оказалось капризное, и если ему посылать байты сразу скопом, то оно их "не ест". Ему понимаешь подавай байтики с интервалами по 18мс.
Что я сделал - организовал отправку байтов из выходного буфера по событию таймера. На каждом событии проверяется длина буфера, если не ноль - первый байт из буфера отправляется в порт, буфер сдвигается на 1 байт и на 1 уменьшается размер. Ну вобщем всё простенько. Проблема заключается в том, что невозможно даже близко подогнать интервал к 18мс. Самый меньший интервал которого удаётся добиться около 200мс. Это 5 байт уходят за секунду. Если я меняю значение интервала таймера меньше 200, то это абсолютно ничего не меняет. Такое ощущение, что таймер просто не умеет срабатывать чаще 5ти раз в секунду.

Вопрос к знатокам: Есть ли другая возможность отсылать байты в ком-порт с интервалом 18мс? Может какое свойство ком-порта установить, или ещё что...
PM WWW ICQ MSN   Вверх
Alexeis
Дата 6.10.2007, 12:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Таймер способен генерировать события с частотой не чаще 100 запусков в секунду с точностью 10мс, т.е. можно через каждые 20мс.


--------------------
Vit вечная память.

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

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexzz
Дата 6.10.2007, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Ну вот не даёт он 20мс. Только 200. Какой-то неправильный таймер... 
PM WWW ICQ MSN   Вверх
Alexeis
Дата 6.10.2007, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



  Таймер то правильный и 1000 раз проверенный. Значит ошибка не в таймере.


--------------------
Vit вечная память.

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

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Alexzz
Дата 6.10.2007, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Таймер не таймер, но через таймер не получается.
PM WWW ICQ MSN   Вверх
ivan219
  Дата 6.10.2007, 18:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

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



Возможно что само устройство перестаёт принимать байты если проходит больше чем время на отпровление одного байта после стоп бита предидущего байта попробуй поиграть со скоростью обмена, также может нет синхронизации.
А что за устройство?
И если можно то код в студию.
PM MAIL ICQ   Вверх
Alexzz
Дата 6.10.2007, 23:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Нет, устройство то работает. Оно не воспринимает байты только если их отсылать слишком часто. Оригинальный софт для этого устройства позволяет менять интервал, и если выставить интервал 10мс то устройство больше не отвечает. Написанная мной программа уже работает с этим устройством, но намнооого медленнее чем хотелось бы.
Устройство это микроконтроллер, управляющий неким прибором. Интервал между посылками нужен очевидно просто для того, чтобы процессор успевал считывать данные из регистров и обрабатывать их.

Код я взял из первых ссылок, что дал Alexeis. Буквально немного подправил.
Код

procedure TForm1.Timer1Timer(Sender: TObject);
var i: integer;
  actual: cardinal;
begin
    if nbyte>0 then begin  // nbyte - количество байт в буфере
      for i:=0 to nbyte do sb[i]:=sb[i+1];
      dec(nbyte);
      if not WriteFile(hPort, sb, 1, actual, nil) then begin
        ShowMessage('Can not write to port, error '+IntToStr(GetLastError));
        Exit;
      end;
    end;
end;



Это сообщение отредактировал(а) Alexzz - 7.10.2007, 00:09
PM WWW ICQ MSN   Вверх
ivan219
  Дата 7.10.2007, 08:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

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



А верхняя граница времени после которой МК сщитае что весь пакет пришол есть? или он ждёт пока непредёт определённое количество байт.
Сколько байт в пакете?
А какая скорость обмена у МК и COM порта?

Скорей всего таймер срабатывает чётко а вот сам поток немного задержевается что приводит к TimeOut у МК и он считает что пакет битый.
В какой Windows работаешь?

Это сообщение отредактировал(а) ivan219 - 7.10.2007, 08:53
PM MAIL ICQ   Вверх
Alexzz
Дата 7.10.2007, 09:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Опять ты не понял. РАБОТАЕТ моя программа. Не считает никто ничего битым. ВСЁ РАБОТАЕТ. Только очень медленно.
На верхний предел не испытывал. Скорость 9600. Пакеты разные, но все нормально проходят. Только медленно. Пакет из 5 байт идёт секунду. А если учесть что нужно передать всего 8кб данных разбив их по пакетам и снабдив всеми начальными и конечными байтиками, да ещё и ответы надо принять, вот и сидим, пол часа ждём пока всё запишется.
Винды - проверял и под 98 и под ХРенью. Работает одинаково. Очень медленно. 

PM WWW ICQ MSN   Вверх
ivan219
Дата 7.10.2007, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

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



Ну хорошо не допонял.
В таймере свойство Interval 200 а при меньших значениях ничего не работает, тогда проблема гдето в коде.

Это сообщение отредактировал(а) ivan219 - 7.10.2007, 09:39
PM MAIL ICQ   Вверх
ivan219
  Дата 7.10.2007, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1121
Регистрация: 19.11.2005
Где: Планета земля

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



Попробуй этот компонент http://calculator2006.narod.ru/file/AsyncFree104.rar
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Для новичков"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

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

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

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


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

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


 




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


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

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