Собрал из примеров: 1)http://forum.gsmhosting.com/vbb/archive/index.php/t-141789.html
2)http://www.mev.co.uk/w32comms.bas
программу для работы с serial-портом (WinXP Sp2).
На разъем COM-порта, ногу 1(CD) внешним генератором подается меандр. -9v(125mSec), затем +9v(125mSec).
Программа не реагирует на прерывание при изменении сигнала CD. Не могу разобраться почему так!
Возможно, перевел команды из примера на Delphi > VB6 не правильно? Delphi я не знаю.
Еще вопрос: "Как узнать куда пойдет вектор прерывания когда возникнет условие прерывания?"
Фрагмет кода:
Private Declare Function SetCommMask Lib "kernel32" (ByVal hFile As Long, ByVal dwEvtMask As Long) As Long
Private Declare Function GetCommMask Lib "kernel32" (ByVal hFile As Long, lpEvtMask As Long) As Long
WaitCommEvent Lib "kernel32" (ByVal hFile As Long, lpEvtMask As Long, FILE_FLAG_OVERLAPPED As OVERLAPPED) As Long
typedef struct _OVERLAPPED {
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
HANDLE hEvent;
} OVERLAPPED, *LPOVERLAPPED;
--------------------------------
Private Type OVERLAPPED
Internal As Long
InternalHigh As Long
offset As Long
OffsetHigh As Long
hEvent As Long
End Type
--------------------------------
BOOL WaitCommEvent(
HANDLE hFile,
LPDWORD lpEvtMask,
LPOVERLAPPED lpOverlapped,
);
---------------------------------
Private Sub CommandButton5_Click()
'-------------------------------------------------------------------------------
Dim blnState As Byte
intPortID = 1
blnState = CommSetLine(intPortID, LINE_RTS, 1) 'Rabotaet Verno!
blnState = CommSetLine(intPortID, LINE_DTR, 1) 'Rabotaet Verno!
Dim lngModemStatus As Long
Dim msec1&, msec01&
'Delphi SetCommMask(port,EV_RXCHAR);
'Delphi WaitCommEvent(port,&mask,NULL);
lngStatus = SetCommMask(udtPorts(intPortID).lngHandle, LINE_CD)
MsgBox "SetCommMaskStatus = " & Str(lngStatus)
lngStatus = WaitCommEvent(udtPorts(intPortID).lngHandle, LINE_CD, udtCommOverlap)
MsgBox "WaitCommEventStatus = " & Str(lngStatus)
msec1& = GetTickCount&
Pause (5)
msec01& = GetTickCount&
MsgBox "Period (msec) = " & Str(msec01& - msec1& )
End Sub
Вариант
Do While State_Port(State) = 0
DoEvents
Loop
не устраивает, так как сильно загружает ЦП.
Буду рад получить полезный ответ!!