1

Тема: VBS: Ожидание данных из COM порта

Написал скрипт для перехвата данных из COM порта и пересылке их на кнопки. Нужно это для того, чтобы сканеры штрих-кодов COM портовые работали как клавиатурные.
Скрипт вполне работоспособен, но грузит проц на 50% А если их запустить 2 то на 100%.
Вопрос, что можно сделать, чтобы он не был столь ресурсоемким:


On Error Resume Next
set WshShell = CreateObject("WScript.Shell")
Set scan = CreateObject("MSCOMMLib.MSComm") ' Используется MSCOMM32.OCX
Set objArgs = WScript.Arguments
For I = 0 to objArgs.Count - 1
  Comand=objArgs(I)
Next
    If (scan Is Nothing) Then 
        MsgBox "Компонента не установлена",  vbCritical
    End If
scan.Settings = "9600,n,8,1"
if Comand ="" then 
scan.CommPort = 2 ' По умолчанию слушаем 2-й порт
Else 
scan.CommPort =  Comand
End If
While 1
call listen
If Err.Number <> 0 Then 'Обработчик ошибок
    MsgBox "Так не пойдет. Описание ошибки: "& Err.Description, vbCritical
	wscript.quit
Else
    On Error GoTo 0
End If
Wend

sub listen()
scan.PortOpen = True
scan.InputLen = 0
Do Until len(bcod)=14 ' Именно эта часть вызывает загрузку процессора
bcod=bcod+scan.Input
loop
bcod=trim(Right(bcod, Len(bcod)-1))
WshShell.SendKeys "{F12}"+bcod+"{ENTER}" 'Отсылаем команду в клавиатуру с префиксом и постфиксом
bcod=""
scan.PortOpen = False
End sub

Может есть другой способ получить данные из COM порта?

Автоматизирую торговлю. Не 1С

2 (изменено: Евген, 2012-02-02 20:58:38)

Re: VBS: Ожидание данных из COM порта

wscript.sleep 100

не поможет ?

Do Until len(bcod)=14 ' Именно эта часть вызывает загрузку процессора
bcod=bcod+scan.Input
wscript.sleep 100
loop

Не ?

Времени не хватает... :-(

3

Re: VBS: Ожидание данных из COM порта

Примеры здесь: MSComm Control (MSComm Control) смотрели? Может такое сгодится?

OFF:

но грузит проц на 50% А если их запустить 2 то на 100%. Вопрос, что можно сделать…

Добавить ядер на процессоре ?

4 (изменено: Mat Skywalker, 2012-02-03 06:28:40)

Re: VBS: Ожидание данных из COM порта

Пока что ничего не помогает, даже это:


...
While 1
 If (scan.CommEvent <>0) Then call listen 'Ждем данных с порта
If Err.Number <> 0 Then
    MsgBox "Так не пойдет. Описание ошибки: "& Err.Description, vbCritical
	wscript.quit
Else
    On Error GoTo 0
End If
Wend
...

И вообще CommEvent всегда 0

Автоматизирую торговлю. Не 1С

5

Re: VBS: Ожидание данных из COM порта

Mat Skywalker, на события подписались при создании объекта?

6

Re: VBS: Ожидание данных из COM порта

Нет, а это как?

Автоматизирую торговлю. Не 1С

7

Re: VBS: Ожидание данных из COM порта

Не уверен, что правильно написал, т.к потестировать не на чем. Но как то так. А дальше в событии обрабатывать сами данные через Input


Option Explicit
Dim MSComm
Set MSComm = WScript.CreateObject("MSCOMMLib.MSComm","MSComm_")
With MSComm
    .Settings = "9600,n,8,1"
    .CommPort = 2
    .PortOpen = True
End With

Private Sub MSComm_OnComm()
    MsgBox "EVENT !"
End Sub

Do
    WScript.Sleep 10
Loop
Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

8

Re: VBS: Ожидание данных из COM порта

Использовать либо форму:

WScript.CreateObject(strProgID, strPrefix)

либо форму:

WScript.ConnectObject(objEventSource, strPrefix)

где «strPrefix» — префикс процедур обработки событий.

CreateObject Method
ConnectObject Method

Sesame Script: Getting - or Creating - an Object

Пример использования на форуме.

9 (изменено: Mat Skywalker, 2012-02-06 09:06:24)

Re: VBS: Ожидание данных из COM порта

Не помогает. Событие не приходит.


Private Sub MSComm_OnComm()

Не отрабатывает. Пробую сделать тоже самое из HTA, тот же результат. 50% загрузка проца.


On Error Resume Next
set WshShell = CreateObject("WScript.Shell")
Set scan = CreateObject("MSCOMMLib.MSComm")
Set objArgs = WScript.Arguments
For I = 0 to objArgs.Count - 1
  Comand=objArgs(I)
Next
    If (scan Is Nothing) Then 
        MsgBox "Компонента не установлена",  vbCritical
    End If
scan.Settings = "9600,n,8,1"
if Comand ="" then 
scan.CommPort = 2
Else 
scan.CommPort =  Comand
End If
scan.PortOpen = True
scan.InputLen = 0
While 1
if scan.InBufferCount>0 then 
call listen
scan.PortOpen = True
End if
If Err.Number <> 0 Then
    MsgBox "Так не пойдет. Описание ошибки: "& Err.Description, vbCritical
	wscript.quit
Else
    On Error GoTo 0
End If
WScript.Sleep 10
Wend

sub listen()
Do Until len(bcod)=15
bcod=bcod+scan.Input
loop
bcod=trim(Right(bcod, Len(bcod)-1))
WshShell.SendKeys "{F12}"+bcod+"{ENTER}"
bcod=""
scan.PortOpen = False
scan.InputLen = 0
End sub

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

Автоматизирую торговлю. Не 1С

10

Re: VBS: Ожидание данных из COM порта

Доброго времени суток.
Искал информацию по ошибкам с ком портов и попал к вам на страницу...
Себе инфу не нашел, но помочь с вашими проблемами могу...
я подключал весы через ком порт. тоже опрос портов, тоже висла система....
у меня были весы, которые должны были отправлять инфу на ком порт после получения команды от ком порта....
отправлял, и ждал получения.... иногда даже получал...
а потом разобрался в проблеме...
1. все события получения инфы с ком порта должны  генерироваться в :

Private Sub MSComm_OnComm()
    A = MSComm.Input
    MsgBox "Наш порт прислал следующую строку = " & A
End Sub

Зацикливать что либо и постоянно опрашивать порт - не метод!!
С таким успехом можно просто ставить бесконечный цикл и просто ничего не делать в нем...

2. для такого события должны быть наcтройки....


With MSComm
    .Settings = "9600,n,8,1" ' скорость, четность, бит, что то там еще (не помню толком)
    .CommPort = 2                ' назначеный порт
    .Handshaking = comNone 'генерировать событие при получение инфы с ком порта в Sub MSComm_OnComm()
    .InputLen = 0                    ' длина получаемой строки с ком порта, если = 0 - значит без ограничений
    .PortOpen = True              ' ну и собственно открытие порта
End With

более конкретно расписаны все настройки на сайте Firststeps.ru в разделе Visual Basic

Надеюсь кому - то поможет.
Извините если нарушил правила форума, здесь впервые и просто решил помочь.
кроме того я не скриптовик - пишу на VB и VBA.