В этой статье я попробую описать простейшие приемы считывания информации с ключей DS1992 и им подобных.
Можно конечно использовать dll сторонних производителей, но они не всегда бесплатны, да и лично меня не привлекает использовать «кота в мешке», тем более как оказалось, написать собственные подпрограммы для чтения, не так уж сложно.
Для начала соберем адаптер считыватель для COM порта. Будем считать, что считыватель, собран верно и работает.
Ставим себе простейшую задачу, прочитать из «таблетки» ее уникальный номер.
В среде VB6 создадим форму с текстовым окном и кнопочкой. Добавим объект доступа к COM порту, который назовем mscDev.
Программа должна читать номер «таблетки» по нажатию кнопки. Поэтому весь программный код помещаем в процедуру Command1_Click().
Он состоит из нескольких последовательных шагов:
Настроить порт для работы с адаптером.
mscDev.PortOpen = True 'откроем порт
mscDev.DTREnable = True 'подадим питание на адаптер
mscDev.RTSEnable = True ' подадим питание на адаптер
mscDev.InBufferCount = 0 'обнуляем буфер порта
Создадим массив для приема номера «таблетки»
Dim ROM(7) As Byte 'массив для чтения ПЗУ таблетки
Теперь надо выдать сброс всех устройств на шину 1W
Call DSReset 'выдаем сброс
Даем команду подключенной «таблетки» на чтение ПЗУ
Call DSOutByte(&H33) 'команда на чтение ПЗУ таблетки
Осталось только считать идентификатор, что и делаем далее
For I% = 0 To 7 'считываем ПЗУ в массив
ROM(I%) = DSInByte
Next I%
А теперь все одним куском :
Private Sub Command1_Click()
Dim ROM(7) As Byte 'массив для чтения ПЗУ таблетки
Call DSReset 'выдаем сброс
Call DSOutByte(&H33) 'команда на чтение ПЗУ таблетки
For I% = 0 To 7 'считываем ПЗУ в массив
DSRROM(I%) = DSInByte
Next I%
End Sub
Теперь осталось вывести получившийся массив байт в текстовое окно, думаю совсем не сложная задача.
Ах да, не хватает процедур сброса, чтения и записи байт.
Вот они :
Private Sub DSReset() 'подпрограмма выдачи сброса
mscDev.Settings = "19200,N,8,2" 'устанавливаем скорость порта
mscDev.Output = Chr$(&H0) 'передаем сброс (h&0)
Do 'ждем когда выходной буфер очистится
Loop Until mscDev.OutBufferCount = 0
TMInTime# = Now + TimeSerial(0, 0, 1) ' 1 секунда на ответ
Do 'ждем когда на вход что нибудь придет, с учетом тайм-аута
Loop Until (mscDev.InBufferCount > 0) Or (TMInTime# < Now)
mscDev.InBufferCount = 0 'очишаем буфер
mscDev.Settings = "115200,N,8,2" 'устанавливаем скорость порта
End Sub
Private Sub DSOutByte(DSByte As Byte) 'подпрограмма вывода байта
For I% = 0 To 7
If (DSByte And (2 ^ I%)) / (2 ^ I%) Then
mscDev.Output = Chr$(&HFF) 'передаем 1
Else
mscDev.Output = Chr$(&H0) 'передаем 0
End If
Do 'ждем когда выходной буфер очистится
Loop Until mscDev.OutBufferCount = 0
Next I%
TMInTime# = Now + TimeSerial(0, 0, 1) / 18 ' 1/18 секунды на ответ
Do 'ждем когда придет все эхо, с учетом тайм-аута
Loop Until (mscDev.InBufferCount > 7) Or (TMInTime# < Now)
mscDev.InBufferCount = 0 'обнуляем эхо в приемном буфере
End Sub
Private Function DSInByte() As Byte 'подпрограмма ввода байта
Dim Buf() As Byte
Dim By As Byte
mscDev.InBufferCount = 0 'очищаем входной буфер
For I% = 0 To 7
Call DSOutBit(True)
Next I%
TMInTime# = Now + TimeSerial(0, 0, 1) / 18 ' 1/18 секунды на ответ
Do 'ждем когда на вход что нибудь придет, с учетом тайм-аута
Loop Until (mscDev.InBufferCount > 7) Or (TMInTime# < Now)
'проверяем, весь ли байт пришел
If mscDev.InBufferCount <= 7 Then
'байт не целиком, подставляем пучтой символ и выходим
mscDev.InBufferCount = 0 'обнуляем буфер
DSInByte = &HFF
Exit Function
End If
Buf = mscDev.Input 'читаем буфер
For I% = 0 To 7
If Buf(I%) = &HFF Then
By = By + 2 ^ I%
End If
Next I%
DSInByte = By
End Function
Private Sub DSOutBit(DSBit As Boolean) 'подпрограмма вывода бита
Do 'ждем когда выходной буфер очистится
Loop Until mscDev.OutBufferCount = 0
If DSBit Then
mscDev.Output = Chr$(&HFF) 'передаем 1
Else
mscDev.Output = Chr$(&H0) 'передаем 0
End If
Do 'ждем когда выходной буфер очистится
Loop Until mscDev.OutBufferCount = 0
End Sub
Скачать пример
Еще проекты
|