Проще всего программировать 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.