Проще всего программировать PowerAnt используя стандартный компонент mscomm32.ocx. Компонент этот был разработан в Microsoft, но не смотря на свою полезность не попал в дистрибутивы MS Windows. Возможно, виной тому наличие в нем некоторых ошибок, которые могут усложнить жизнь разработчикам программ (Официально зарегистрированная ошибка: Утечка памяти при открытии/закрытии RS-232 порта). Учитывая тот факт, что обычно в RS-232 порт следует открыть в начале выполненья всей программы и закрыть его только по её завершению, эту ошибку не следует считать серьезной.
Загрузите mscomm32.ocx (mscomm.zip, 51KB) компонент и скопируйте его в каталог C:\Windows\System.
Разумеется, компонент, без некоторой пляски с бубном, работать не будет. Потребуется поместить небольшое заклинание в системный Реестр:
REGEDIT4 [HKEY_CLASSES_ROOT\Licenses\4250E830-6AC2-11cf-8ADB-00AA00C00905] @ = "kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun"Для того, чтобы внести эту запись в реестр необходимо дважды кликнуть на файле mscomm.reg (который находится в архиве mscomm.zip) в проводнике. Редактор реестра спросит: следует ли вносить изменения в системный реестр, и после Вашего утвердительного ответа отчитается о том, что изменения успешно внесены.
Запустите MS Access, создайте форму. В режиме конструктора в форме создайте Кнопка0 и Поле3 (поле ввода текста). Нажмите правую кнопку мыши на Кнопка0 и выберите пункт меню "Обработка событий". Откроется редактор Microsof Visual Basic.
Теперь потребуется произвести еще одно магическое действие в редакторе Microsof Visual Basic. Открываем меню Tools/References. В открывшемся окне нажимаем кнопку Browse.... Находим в файловой системе mscomm32.ocx (C:\Windows\System). В результате в окне References в поле "Available References" появляется отмеченная галочкой строка "Microsoft Comm Control 6.0".
Дальше никакой магии, просто копируем в окно редактора приведенную ниже программу.
Option Compare Database
Dim PwrAntComm As New MSComm
' При нажатии кнопки 0 выполняется команда 14?? и в Поле3
' заносится результат её выполнения
Private Sub Кнопка0_Click()
' 2 - Номер COM порта (COM1 = 1, COM2 = 2, ... )
PwrAntOpen (2)
' Спросить у 14 PowerAnt кто он и что может
Поле3 = PwrAntCmd("14", "??")
End Sub
Sub Form_Unload(Cancel As Integer)
Call PwrAntClose
End Sub
' Метод открывает RS-232 порт (если он еще не открыт)
' PortNumber - Номер COM порта (COM1 = 1, COM2 = 2, ... )
Sub PwrAntOpen(PortNumber As Integer)
If Not PwrAntComm.PortOpen = True Then
PwrAntComm.CommPort = PortNumber
PwrAntComm.Settings = "9600,N,8,1"
PwrAntComm.Handshaking = comNone
PwrAntComm.InputLen = 0
PwrAntComm.InBufferSize = 40
PwrAntComm.OutBufferSize = 40
PwrAntComm.PortOpen = True
PwrAntComm.RThreshold = 0
PwrAntComm.Output = Chr(27) ' Сразу делаем команду прочистки буфера
End If
End Sub
' Метод закрывает RS-232 порт (если он был открыт)
Sub PwrAntClose()
If PwrAntComm.PortOpen = True Then
PwrAntComm.PortOpen = False
End If
End Sub
' Метод выполняет команду и возвращает результат её выполнения
' Если в результате выполнения команды ничего не произошло (например обратились не к тому
' PowerAnt - возвращает пустую строку, причем делает это по таймауту)
' На выполнение команды отводится максимум 2 секунды
Function PwrAntCmd(AntName As String, AntCmd As String) As String
Dim AntInStr As String
Dim TimeOut As Date
' Отсылка команды устройству
PwrAntComm.Output = AntName & AntCmd & Chr(13)
'Четние строки с ожиданием символа 0x0D в конце
AntInStr = ""
TimeOut = Time
Do
dummy = DoEvents() ' не вешаем систему
If PwrAntComm.InBufferCount > 0 Then
AntInStr = AntInStr & PwrAntComm.Input
End If
Loop Until (Right(AntInStr, 1) = Chr(13)) Or (Time - TimeOut > 1)
' Убрать лишний 0x0D в конце
AntInStr = Left(AntInStr, Len(AntInStr) - 1)
PwrAntCmd = AntInStr
End Function
Сохраните программу и закройте редактор Visual Basic
Теперь после нажатия кнопки отрабатывает команда 14??, результат её выполнения Будет помещен в поле Поле3.