Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Асинхронный режим COM порта. WaitCommEvent. Delphi > VB6  (Прочитано 10231 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Samodelkin
Гость
« : 02-06-2008 10:43 » 

 Не понял
Собрал из примеров: 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
не устраивает, так как сильно загружает ЦП.

Буду рад получить полезный ответ!!
Записан
Samodelkin
Гость
« Ответ #1 : 05-06-2008 19:30 » 

Кому на VB6 удалось победить Асинхронный режим COM-порта?
Поделитесь кодом. Здесь была моя ладья... Я уже дымиться начинаю. Я зол!   
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines