|
Новая проблема с COM портом....
|
|||
---|---|---|---|
#18+
Вот, рано я радовался... Ситуация очень простая - работает,работает и... виснет наглухо! Вкратце сделано так: на форме кнопка "Взвесить" Вот код: 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? Но так там вообще все мельтешит, какие-то цифры прыгают с дикой скоростью и у оператора крыша едет... Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 10:11 |
|
Новая проблема с COM портом....
|
|||
---|---|---|---|
#18+
Jimy, В приложении класс работы с ком портом терминала тензл-м Попробуй разобраться. А то советов устану давать))) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 12:27 |
|
Новая проблема с COM портом....
|
|||
---|---|---|---|
#18+
Из-за файла вряд ли зависает, но он не нужен. Я тебе в файл советовал писать чтобы копия данных снятых с порта была для разбора. Сделай у формы свойство ThisForm.cData и дописывай туда. Т.е. вместо Код: sql 1.
напиши Код: sql 1.
ну и вместо чтения файла бери ThisForm.cData JimyНо так там вообще все мельтешит, какие-то цифры прыгают с дикой скоростью и у оператора крыша едет... Вроде в настройках твоего девайса есть режим передавать только "успокоившиеся" показания. Таймер не нужен. Как из порта получил инфу, так сразу и выводи. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 12:34 |
|
Новая проблема с COM портом....
|
|||
---|---|---|---|
#18+
Спасибо! А зачем ThisForm.cData = thisform.cData+c1 Разве нельзя ThisForm.cData = c1 ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 05:42 |
|
Новая проблема с COM портом....
|
|||
---|---|---|---|
#18+
А вот что получается - запускаю эмулятор весов, передаю одно значение 2050 (это типа вес). Режим передачи - постоянный (не после стабилизации весов). Получается такая картинка (см. файл). Это не хорошо, надо чтобы было одно значение. Таймер прикручивать? А он может повлиять на стабильность работы приложения? Что-то мне таймеры не очень нравятся... ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 05:50 |
|
Новая проблема с COM портом....
|
|||
---|---|---|---|
#18+
JimyСпасибо! А зачем ThisForm.cData = thisform.cData+c1 Разве нельзя ThisForm.cData = c1 ThisForm.cData = thisform.cData+c1 это аналог StrToFile(c1, 'c:\weight\com.dat', .t.) Не заметил что потом ты из файла читаешь последнюю строку. в принципе можешь сразу Код: sql 1.
Таймер вообще убери ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 06:34 |
|
Новая проблема с COM портом....
|
|||
---|---|---|---|
#18+
Я так подозреваю у тебя "висело" из-за этого Код: sql 1. 2. 3. 4.
Файл становится все больше и больше, а ты его постоянно читаешь целиком в поисках конца строки. Дурная работа сожрала все процессорное время. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 06:37 |
|
Новая проблема с COM портом....
|
|||
---|---|---|---|
#18+
Спасибо, я изначально так и пробовал... thisform.text1.value=Val(Chrtran(c1, Chrtran(c1, '0123456789', ''), '')) Но данные отображаются со страшной скоростью, потому что стоит режим постоянной передачи данных. А вот интересно, в самом MSCOMM можно как то задать интервал приема данных, например, чтобы получал, скажем через 1 сек.? ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 07:41 |
|
Новая проблема с COM портом....
|
|||
---|---|---|---|
#18+
JimyСпасибо, я изначально так и пробовал... thisform.text1.value=Val(Chrtran(c1, Chrtran(c1, '0123456789', ''), '')) Но данные отображаются со страшной скоростью, потому что стоит режим постоянной передачи данных. А вот интересно, в самом MSCOMM можно как то задать интервал приема данных, например, чтобы получал, скажем через 1 сек.? Не знаю. Думаю нет. Как понимаю он выдает по мере поступления данных. Если данные постоянно идут и все не надо, то просто добавь проверку времени. Добавь свойство ThisForm.nShowData = 0, а при выводе так проверяй Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 07:49 |
|
Новая проблема с COM портом....
|
|||
---|---|---|---|
#18+
Напутал немного, так правильно Код: sql 1. 2. 3. 4. 5.
[/quot] ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 08:24 |
|
Новая проблема с COM портом....
|
|||
---|---|---|---|
#18+
Ага, вот это, наверное, прокатит. Проверю в понедельник - весы 10 км от офиса, не наездишся каждый раз проверять :((. А вот с эмулятором вроде получается. Вдогонку тупой вопрос - как курсор (указатель мыши) поставить за данными в поле ввода? Открывается форма, там в поле ввода уже есть кое-что, а курсор стоит в самом начале поля. Оператор хочет сразу продолжить ввод в это поле, не гоняя мышь, т.е поставить курсор ЗА буквами... Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 09:56 |
|
Новая проблема с COM портом....
|
|||
---|---|---|---|
#18+
А с последними изменениями тоже иногда выдает типа 20502050205. Хрен его знает, как тут быть... Попробую на весах поставить передачу данных после стабилизации веса... Посмотрим, что получится. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 10:08 |
|
Новая проблема с COM портом....
|
|||
---|---|---|---|
#18+
JimyА с последними изменениями тоже иногда выдает типа 20502050205. Хрен его знает, как тут быть... Попробую на весах поставить передачу данных после стабилизации веса... Посмотрим, что получится. Скорее всего за раз читается несколько записей. Если я правильно понял по скриншоту разделитель перевод строки chr(13) + chr(10) Если так то попробуй предварительно оставить последнее Код: sql 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 10:25 |
|
Новая проблема с COM портом....
|
|||
---|---|---|---|
#18+
JimyАга, вот это, наверное, прокатит. Проверю в понедельник - весы 10 км от офиса, не наездишся каждый раз проверять :((. А вот с эмулятором вроде получается. Там инета чтоли нет? Если есть - цепляйся удаленно (Терминал, Ammi, TeamViewer и т.д.) JimyВдогонку тупой вопрос - как курсор (указатель мыши) поставить за данными в поле ввода? Открывается форма, там в поле ввода уже есть кое-что, а курсор стоит в самом начале поля. Оператор хочет сразу продолжить ввод в это поле, не гоняя мышь, т.е поставить курсор ЗА буквами... Спасибо! Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.09.2016, 10:30 |
|
|
start [/forum/search_topic.php?author=Maksimoz&author_mode=last_posts&do_search=1]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 10415ms |
total: | 10571ms |
0 / 0 |