Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Проблема со считыванием данных из com- порта. [D7, WinXP]


tria ©   (2006-07-20 19:29:00) 

Добрый день.
Пишу внешнюю компоненту 1С для подключения весов.
Весы постоянно выдают в com-порт посылку из 8 байт с текущим весом.
Запускается отдельный поток, в котором с помощью комманд типа:
hCom:=CreateFile( 'COM1',GENERIC_READ....
ReadFile(hCom,boof,...
sleep(_SleepInterval);
происходит постоянный опрос порта.
Вроде как все считывается нормально. Если я из этого же потока передаю данные в 1С (с помощью внешнего события), то данные передаются нормально.
Если же я из 1С по обработке ожидания (аналог таймера) обращаюсь к компоненте к общим переменным, куда пишется текущий вес, то я получаю устаревший вес, с отставанием где-то в секунд 20-30. При чем отставание не ровное, а скачками, т.е. могут быть пропуски в весах.
Кто-то может подсказать, отчего это может быть?


tesseract   (2006-07-21 13:24:00) [1]


> Я ж больше 1С-ник чем делфист...


Я наоборот :-)


tria   (2006-07-21 13:19:00) [2]

Инет - источник информации :)
Я ж больше 1С-ник чем делфист...


tesseract   (2006-07-21 12:46:00) [3]


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


где-то такое видел, прога записывает протокол а потом воспроизводит.

А без интернета программа не работает?


tria   (2006-07-21 12:35:00) [4]

Для меня проблема еще в следующем.
Там, где есть весы - нет инета.
Там где есть инет (работа) - нет весов.

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


tesseract   (2006-07-21 10:32:00) [5]

После каждого считывания чисть порт!  - Из буфера же т

Используй маску ожидания, и отложенное чтение. Т.К при чтении ты прочитаешь всё, что весы тебе в буфер надавали.

К тому же отложенное чтение легко убивается CancelIO(handle).


tria   (2006-07-21 10:27:00) [6]

Седал простейший эмулятор. Код потока, который должен читать данные из порта:
repeat
  CurWeight:=Random(10);
  For i:=0 to 10000000 do _CurWeight:=CurWeight;
  MyObject.iEvent.ExternalEvent(c_AddinName, 'ScaleWeight',FloatToStr(_CurWeight));
  sleep(1000);
until;

Соответственно, по ОбработкеОжидания считываю данные из CurWeight. Никакого такого эффекта не наблюдается.
Проверял с помощью внешнего отчета, где по ОбработкаВнешнегоСобытия и ОбработкеОжидания дается команда показа текущего веса.

п.с.
ОбработкаВнешнегоСобытия не совсем хороша. Если войти в меню, а в это время идет ее вызов, то меню закрывается. Происходит какое-то "передергивание" всей 1С, работать при этом невозможно.
Весы какой-то Днепропетровской фирмы (покрайней мере они устанавливали). Звонили с предприятия, они уже сгорели :)


tesseract   (2006-07-20 22:06:00) [7]

> Кто-то может подсказать, отчего это может быть?

от Sleep. Лучше поищи по Winapi - там совсем недавно была ветка про это.

И кстати лучше использовать ОбработкаВнешнегоСобытия.

ЗЫ: Петровес?


Наверх

Титульная страница Поиск, карта сайта Написать письмо