Заказы на доработку 1С (сервис удаленной работы)

Хранилище

База знаний
Неназначенных незавершенных заказов: 1
Бесплатные отчеты, обработки, конфигурации, внешние компоненты для 1С Статьи, описание работы, методики по работе с 1С

Здравствуйте, гость ( Вход | Зарегистрироваться )



> Ожидание ответа с СОМ порта          
kosalex Подменю пользователя
сообщение 22.07.14, 7:17
Сообщение #1

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

Доброе утро! Подключаю Ж/Д весовую. Все хорошо,но есть одно НО! =(
Процедура ПриОткрытии()
    ДатаИВремя = ТекущаяДата();
    ПодключитьОбработчикОжидания("ПоказатьВремяИДату",1);
    Отказ = Ложь;
    ТекущийВес = 0;
    ИнициализацияСОМПорта(Отказ); //Инициализация СОМ-порта.
    Если Не Отказ Тогда
        ТекущийВес = ЧтениеСОМПорта("1",Неопределено); //Отправка в СОМ порт еденицы.          
    КонецЕсли;
    Если ТипЗнч(ТекущийВес) = Тип("Число") Тогда
        ВесБрутто = ПарсингОтветаСОМПорта(ТекущийВес);
        ПодключитьОбработчикОжидания("ОпросСОМПорта",1);
        //ПодключитьОбработчикОжидания("ПолучитьДанныеСПорта",1);
    КонецЕсли;
    УстановитьОтборВТабличнойЧасти(ТекущаяДата());
КонецПроцедуры

Процедура ИнициализацияСОМПорта(Отказ)
    ComPort = Новый COMОбъект("MsCommLib.MsComm");    
    Попытка
        ComPort.CommPort        = 1;
        ComPort.Settings        = "9600,N,8,1";
        ComPort.PortOpen = Истина;
        ЭлементыФормы.НадписьСвязь.Заголовок = "Связь есть..."
    Исключение
        ОчиститьСообщения();
        Сообщить("Не возможно открыть порт.",СтатусСообщения.ОченьВажное);
        Отказ = Истина;
    КонецПопытки;
КонецПроцедуры


Процедура ОпросСОМПорта()
ЧтениеСОМПорта("1",Неопределено);
КонецПроцедуры


Функция ЧтениеСОМПорта(Команда,Ответ)
    Если ComPort.PortOpen Тогда
        ДанныеСПорта = "";
        ComPort.Output = Команда;
        
        ПолучитьДанныеСПорта();
        
        Ответ = ДанныеСПорта;
        
        ЭлементыФормы.НадписьСвязь.Заголовок = "Связь есть...";
        Если Команда = "1" Тогда
        ЗаполнитьПоляНаФорме(Ответ);
        КонецЕсли;
        Возврат Ответ;
    Иначе
        ОчиститьСообщения();
        ИнициализацияСОМПорта(Ложь);
        ЭлементыФормы.НадписьСвязь.Заголовок = "Связи нет...";
        Возврат Неопределено;
    КонецЕсли;
    
КонецФункции

Процедура ПолучитьДанныеСПорта()
    Пока ComPort.InBufferCount < 14 Цикл
        
    КонецЦикла;
    ДанныеСПорта = ComPort.Input;
    
КонецПроцедуры


Вопрос по процедуре ПолучитьДанныеСПорта(), как уйти от цикла? Цикл подвешивает программу, не сильно конечно, но задержка видна.


andr_andrey Подменю пользователя
сообщение 22.07.14, 7:57
Сообщение #2

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 626
Спасибо сказали: 166 раз
Рейтинг: 130.8

Цитата(kosalex @ 22.07.14, 8:17) *
Доброе утро! Подключаю Ж/Д весовую. Все хорошо,но есть одно НО! =(
...


Вопрос по процедуре ПолучитьДанныеСПорта(), как уйти от цикла? Цикл подвешивает программу, не сильно конечно, но задержка видна.


Задержка между чем и чем? Долго не приходит 14 символов?


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

kosalex Подменю пользователя
сообщение 22.07.14, 8:00
Сообщение #3

Ветеран
*******
Группа: Пользователи
Сообщений: 805
Спасибо сказали: 14 раз
Рейтинг: 0

Цитата(andr_andrey @ 22.07.14, 8:57) *
Задержка между чем и чем? Долго не приходит 14 символов?



Они приходят быстро, но если убрать цикл, то не всегда приходит ответ. Может через раз, как бы там сделать, отправили в порт "1", дождались ответа, идем дальше?

цикл тормозит программу, пробую ПодключитьОбработчикОжидания, не допру куда его втулить...

andr_andrey Подменю пользователя
сообщение 22.07.14, 8:21
Сообщение #4

Почти ветеран
Иконка группы
Группа: Местный
Сообщений: 626
Спасибо сказали: 166 раз
Рейтинг: 130.8

Цитата(kosalex @ 22.07.14, 9:00) *
Они приходят быстро, но если убрать цикл, то не всегда приходит ответ. Может через раз, как бы там сделать, отправили в порт "1", дождались ответа, идем дальше?

цикл тормозит программу, пробую ПодключитьОбработчикОжидания, не допру куда его втулить...

Для обработчика ожидания надо устанавливать размер буфера приёма, после заполнения которого вызывается обработчик. И даже при простом опросе в цикле желательно выставлять размер буфера приёма больше 0.
Например, при инициализации компорта:
    ComPort.InBufferCount    = 0;        // Очистка буфера приёма
    ComPort.InBufferSize    = 28;        // Установка размера буфера приёма
    ComPort.InputLen        = 0;        // 0 - получить всё содержимое буфера приёма


Signature
#define private public
enum BOOL { FALSE, TRUE, FILENOTFOUND } is made my day

Не нашли ответа на свой вопрос?
Зарегистрируйтесь и задайте новый вопрос.


Ответить Новая тема
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

RSS Текстовая версия Сейчас: 16.04.24, 19:09
1С Предприятие 8.3, 1С Предприятие 8.2, 1С Предприятие 8.1, 1С Предприятие 8.0, 1С Предприятие 7.7, Литература 1С, Общие вопросы по администрированию 1С, Методическая поддержка 1С - всё в одном месте: на Украинском 1С форуме!