powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Новая проблема с COM портом....
15 сообщений из 15, страница 1 из 1
Новая проблема с COM портом....
    #39309476
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот, рано я радовался... Ситуация очень простая - работает,работает и... виснет наглухо! Вкратце сделано так: на форме кнопка "Взвесить" Вот код:

IF thisform.olecontrol1.portopen=.f.
thisform.olecontrol1.commPort=4

thisform.olecontrol1.rthreshold=1
thisform.olecontrol1.settings="9600,n,8,1"

thisform.olecontrol1.portOpen=.t.
ENDIF

Далее, объект olecontrol1, событие OnComm:

*** ActiveX Control Event ***
public c1


c1=this.input

StrToFile(c1, 'c:\weight\com.dat', .t.)
*
public gnFileHandle,nSize,cString
gnFileHandle = FOPEN('c:\weight\com.dat')
if gnFileHandle < 0
? 'Файл не открылся'
else
do while !feof(gnFileHandle)
cString = fgets(gnFileHandle)

enddo
endif
= FCLOSE(gnFileHandle)

А еще есть таймер, который и обновляет данные в форме (в Text1 показывается вес, полученый через порт):

IF thisform.olecontrol1.portopen=.t.
m.str = cstring


thisform.text1 .value=Val(Chrtran(m.str, Chrtran(m.str, '0123456789', ''), ''))
IF thisform.text1 .value=0
thisform.text1.ForeColor=RGB(255,0,0)
ELSE
thisform.text1.ForeColor=RGB(0,255,0)
ENDIF
IF thisform.text1.Value<>0
thisform.text3.Value=INT((thisform.text1.value/1000)*thisform.text9.value)
ELSE
thisform.text3.Value=0.00
ENDIF
endif

Вся эта система работает до поры до времени, а потом напрочь виснет. Понимаю, код кривоват, может кто подскажет решение красивее? Чего оно зависает? Подозреваю, что это связано с записью-чтением в файл .dat А может, вообще от него отказаться и сразу читать данные в text1? Но так там вообще все мельтешит, какие-то цифры прыгают с дикой скоростью и у оператора крыша едет...
Спасибо!
...
Рейтинг: 0 / 0
Новая проблема с COM портом....
    #39309596
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Jimy,

В приложении класс работы с ком портом терминала тензл-м
Попробуй разобраться.

А то советов устану давать)))
...
Рейтинг: 0 / 0
Новая проблема с COM портом....
    #39309611
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Из-за файла вряд ли зависает, но он не нужен. Я тебе в файл советовал писать чтобы копия данных снятых с порта была для разбора.
Сделай у формы свойство ThisForm.cData и дописывай туда. Т.е. вместо
Код: sql
1.
StrToFile(c1, 'c:\weight\com.dat', .t.)


напиши
Код: sql
1.
ThisForm.cData = ThisForm.cData + c1


ну и вместо чтения файла бери ThisForm.cData

JimyНо так там вообще все мельтешит, какие-то цифры прыгают с дикой скоростью и у оператора крыша едет...
Вроде в настройках твоего девайса есть режим передавать только "успокоившиеся" показания.

Таймер не нужен. Как из порта получил инфу, так сразу и выводи.
...
Рейтинг: 0 / 0
Новая проблема с COM портом....
    #39309966
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо! А зачем

ThisForm.cData = thisform.cData+c1
Разве нельзя
ThisForm.cData = c1
...
Рейтинг: 0 / 0
Новая проблема с COM портом....
    #39309968
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот что получается - запускаю эмулятор весов, передаю одно значение 2050 (это типа вес). Режим передачи - постоянный (не после стабилизации весов). Получается такая картинка (см. файл). Это не хорошо, надо чтобы было одно значение. Таймер прикручивать? А он может повлиять на стабильность работы приложения? Что-то мне таймеры не очень нравятся...
...
Рейтинг: 0 / 0
Новая проблема с COM портом....
    #39309971
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JimyСпасибо! А зачем

ThisForm.cData = thisform.cData+c1
Разве нельзя
ThisForm.cData = c1
ThisForm.cData = thisform.cData+c1 это аналог StrToFile(c1, 'c:\weight\com.dat', .t.)
Не заметил что потом ты из файла читаешь последнюю строку.

в принципе можешь сразу
Код: sql
1.
thisform.text1.value=Val(Chrtran(c1, Chrtran(c1, '0123456789', ''), ''))



Таймер вообще убери
...
Рейтинг: 0 / 0
Новая проблема с COM портом....
    #39309973
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я так подозреваю у тебя "висело" из-за этого
Код: sql
1.
2.
3.
4.
do while !feof(gnFileHandle)
cString = fgets(gnFileHandle)

enddo


Файл становится все больше и больше, а ты его постоянно читаешь целиком в поисках конца строки. Дурная работа сожрала все процессорное время.
...
Рейтинг: 0 / 0
Новая проблема с COM портом....
    #39309991
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо, я изначально так и пробовал...

thisform.text1.value=Val(Chrtran(c1, Chrtran(c1, '0123456789', ''), ''))

Но данные отображаются со страшной скоростью, потому что стоит режим постоянной передачи данных. А вот интересно, в самом MSCOMM можно как то задать интервал приема данных, например, чтобы получал, скажем через 1 сек.?
...
Рейтинг: 0 / 0
Новая проблема с COM портом....
    #39309996
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JimyСпасибо, я изначально так и пробовал...

thisform.text1.value=Val(Chrtran(c1, Chrtran(c1, '0123456789', ''), ''))

Но данные отображаются со страшной скоростью, потому что стоит режим постоянной передачи данных. А вот интересно, в самом MSCOMM можно как то задать интервал приема данных, например, чтобы получал, скажем через 1 сек.?
Не знаю. Думаю нет. Как понимаю он выдает по мере поступления данных.

Если данные постоянно идут и все не надо, то просто добавь проверку времени. Добавь свойство ThisForm.nShowData = 0, а при выводе так проверяй
Код: sql
1.
2.
3.
4.
5.
c1=this.input
if ThisForm.nShowData > seconds() + 1 && Прошла секунда
   ThisForm.nShowData = seconds()
   thisform.text1.value=Val(Chrtran(c1, Chrtran(c1, '0123456789', ''), ''))
endif
...
Рейтинг: 0 / 0
Новая проблема с COM портом....
    #39310004
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Напутал немного, так правильно
Код: sql
1.
2.
3.
4.
5.
c1=this.input
if ThisForm.nShowData < seconds()
   ThisForm.nShowData = seconds() + 1 && Следующий вывод через секунду
   thisform.text1.value=Val(Chrtran(c1, Chrtran(c1, '0123456789', ''), ''))
endif

[/quot]
...
Рейтинг: 0 / 0
Новая проблема с COM портом....
    #39310055
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ага, вот это, наверное, прокатит. Проверю в понедельник - весы 10 км от офиса, не наездишся каждый раз проверять :((. А вот с эмулятором вроде получается.
Вдогонку тупой вопрос - как курсор (указатель мыши) поставить за данными в поле ввода? Открывается форма, там в поле ввода уже есть кое-что, а курсор стоит в самом начале поля. Оператор хочет сразу продолжить ввод в это поле, не гоняя мышь, т.е поставить курсор ЗА буквами...
Спасибо!
...
Рейтинг: 0 / 0
Новая проблема с COM портом....
    #39310060
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с последними изменениями тоже иногда выдает типа 20502050205. Хрен его знает, как тут быть... Попробую на весах поставить передачу данных после стабилизации веса... Посмотрим, что получится.
...
Рейтинг: 0 / 0
Новая проблема с COM портом....
    #39310073
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JimyА с последними изменениями тоже иногда выдает типа 20502050205. Хрен его знает, как тут быть... Попробую на весах поставить передачу данных после стабилизации веса... Посмотрим, что получится.
Скорее всего за раз читается несколько записей. Если я правильно понял по скриншоту разделитель перевод строки chr(13) + chr(10)
Если так то попробуй предварительно оставить последнее
Код: sql
1.
2.
c1=this.input
c1=GetWordNum(c1, GetWordCount(c1, chr(13) + chr(10)), chr(13) + chr(10))
...
Рейтинг: 0 / 0
Новая проблема с COM портом....
    #39310076
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JimyАга, вот это, наверное, прокатит. Проверю в понедельник - весы 10 км от офиса, не наездишся каждый раз проверять :((. А вот с эмулятором вроде получается.
Там инета чтоли нет? Если есть - цепляйся удаленно (Терминал, Ammi, TeamViewer и т.д.)
JimyВдогонку тупой вопрос - как курсор (указатель мыши) поставить за данными в поле ввода? Открывается форма, там в поле ввода уже есть кое-что, а курсор стоит в самом начале поля. Оператор хочет сразу продолжить ввод в это поле, не гоняя мышь, т.е поставить курсор ЗА буквами...
Спасибо!
Код: sql
1.
ThisForm.Text1.SelStart = len(rtrim(ThisForm.Text1.Value))
...
Рейтинг: 0 / 0
Новая проблема с COM портом....
    #39310092
Jimy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Огромное спасибо! Походу то, что надо:) В понедельник проверю... (Нет там интернета - лес,тайга, паромная переправа ч/з Енисей:))
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Новая проблема с COM портом....
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]