Проблема с СОМ портом - порт самопроизвольно закрывается??

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Anatoly Yakovlev
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 10.08.2007 (Пт) 11:05

Проблема с СОМ портом - порт самопроизвольно закрывается??

Сообщение Anatoly Yakovlev » 10.08.2007 (Пт) 12:57

Привет!
Я разрабатываю в VB6 программу для работы с устройством обменивающимся с ПЭВМ данными через СОМ порт. Для управления СОМ портом использую rsmini.dll с API:
Код: Выделить всё
Declare Function OPENCOM Lib "rsmini" (ByVal A$) As Integer
Declare Function READBYTE Lib "rsmini" () As Integer
Declare Sub CLOSECOM Lib "rsmini" ()
Declare Sub SENDBYTE Lib "rsmini" (ByVal b%)
Declare Sub RTS Lib "rsmini" (ByVal b%)
Declare Sub DTR Lib "rsmini" (ByVal onoff%)
Declare Sub TIMEOUT Lib "rsmini" (ByVal ms%)

Начальная функция приложения производит проверку наличия устройства путем запроса посылаемого в СОМ порт с 1 по 4 и при обнаружении его открывает окно программы. Если прибор не обнаружен программа информирует об этом и завершает работу. Текст начальной функции:
Код: Выделить всё
Sub Main()
    Dim A$
    Dim e As Integer
    Dim tmp As Integer
    COMPORT = 1
    BAUDRATE = 1
    Rates(1) = "38400"
    Rates(2) = "38400"
    Ports(1) = "COM1"
    Ports(2) = "COM2"
    Ports(3) = "COM3"
    Ports(4) = "COM4"
'Initialise COM port and search Impedance Meter board
Do While COMPORT < 5
If ComOpen(Ports(COMPORT) + ":" + Rates(BAUDRATE) + ",N,8,1") > 0 Then

    TIMEOUT 500
    PutString ("T")
    A$ = ""
    Do
    e = READBYTE
    If e >= 32 Then A$ = A$ + Chr$(e)
    If e = -1 Then
'        CLOSECOM
'        COMPORT = COMPORT + 1
'        tmp = MsgBox("Impedance Meter Board not responding. Check next COM port?", vbOKCancel)
'        If tmp = 1 Then
        Exit Do
'        ElseIf tmp = 2 Then
'        End
'        End If
       
    End If
   
    Loop Until e = 10
    If A$ = "Impedance Meter, v 1.0" Then
        MsgBox ("Impedance Meter Board detected on  COM" + CStr(COMPORT) + " port!")
        Exit Do
    Else:
        CLOSECOM
       
'        tmp = MsgBox("Impedance Meter Board not detected on COM" + CStr(COMPORT) + " port!. Check next COM port?", vbOKCancel)
'        If tmp = 1 Then
        COMPORT = COMPORT + 1
'        Exit Do
'        ElseIf tmp = 2 Then
'       End
'        End If
    End If
   
Else:
COMPORT = COMPORT + 1
'    MsgBox ("COULD NOT OPEN COM PORT!")
'    End
End If

Loop
If COMPORT = 5 Then
    MsgBox ("Impedance Meter Board not detected!")
    End
Else:
    Form1.Show
End If
'Load Form1

End Sub

Проблема заключается в том что в отладочном режиме все работает как надо, а после компиляции exe файла программа после обнаружения устройства теряет связь с ним. Portmon показывает что, в отличие от отладочного режима, в ехе файле после обнаружения прибора и выдачи сообщения об этом (MsgBox ("Impedance Meter Board detected on COM" + CStr(COMPORT) + " port!")) почему то формируются запросы VCOMM_Escape_CommFunction и VCOMM_CloseComm. Т.е. СОМ порт закрывается и естественно дальнейшая работа с прибором становится невозможна.

В чем может быть причина такого поведения программы??
Последний раз редактировалось Anatoly Yakovlev 10.08.2007 (Пт) 16:24, всего редактировалось 1 раз.

Anatoly Yakovlev
Начинающий
Начинающий
 
Сообщения: 3
Зарегистрирован: 10.08.2007 (Пт) 11:05

Повторяю вопрос о Excel macros заданный в форуме по VBA

Сообщение Anatoly Yakovlev » 10.08.2007 (Пт) 14:36

Привет!

Повторяю свой вопрос ранее заданный в форуме по VBA. Модератор счел его кросспостингом первого моего вопроса, хотя, несмотря на сходство проблем, он касается совершенно другого приложения.

Я для считывания информации с внешних устройств через СОМ порт широко использую RSMINI.dll имеющую API:
Код: Выделить всё
Public Declare Function OPENCOM Lib "rsmini" (ByVal A$) As Integer
Public Declare Function READBYTE Lib "rsmini" () As Integer
Public Declare Sub CLOSECOM Lib "rsmini" ()
Public Declare Sub SENDBYTE Lib "rsmini" (ByVal b%)
Public Declare Sub RTS Lib "rsmini" (ByVal b%)
Public Declare Sub DTR Lib "rsmini" (ByVal onoff%)
Public Declare Sub TIMEOUT Lib "rsmini" (ByVal ms%)

При работе под Windows98 все работает без проблем. А при запуске макросов под Win2000 или WinXP возникают проблемы: Excel macros спустя несколько минут после запуска теряет связь по RS232 с внешним устройством. Контроль обмена по RS232 с помощью Portmon показал что по каким то причинам спустя несколько минут после запуска приложение формирует запросы :
IRP_MJ_CLEANUP
IRP_MJ_CLOSE.
Т. е. СОМ порт почему то закрывается. Это не зависит от того ведется ли обмен по последовательному каналу или он простаивает. Тот же эффект наблюдается даже для простейшего примера:
Код: Выделить всё
Private Sub CommandButton1_Click()
If ComOpen(Ports(COMPORT) + ":" + Rates(BAUDRATE) + ",N,8,1") > 0 Then
MsgBox ("COM port opened!")
TIMEOUT 2000


Else: MsgBox ("COULD NOT OPEN COM PORT!")
End If

End Sub

Private Sub CommandButton2_Click()
CLOSECOM
End Sub

В Win98 порт после открытия может находиться в этом состоянии сколь угодно долго, а в Win2000 и WinXP через 3-5 минут закрывается.
В чем тут может быть проблема???
Последний раз редактировалось Anatoly Yakovlev 10.08.2007 (Пт) 16:25, всего редактировалось 1 раз.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 10.08.2007 (Пт) 15:21

А зачем два раза то????
И надо пользоваться тегами Code, а то проблемно твой пример кода читать
Весь мир матрица, а мы в нем потоки байтов!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, Yandex-бот и гости: 61

    TopList