Написал программу для обмена с модемом AT-командами. Решил не пользоваться mscomm32.ocx, а работать напрямую с портом через WriteFile/ReadFile. Вот упрощенный код моей программы:
- Код: Выделить всё
Private Sub Form_Load()
hModem = CreateFile("COM1", GENERIC_READ Or GENERIC_WRITE, 0, Security, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
If hModem <> -1 Then
DCB_Param.DCBlength = Len(DCB_Param)
Call GetCommState(hModem, DCB_Param)
DCB_Param.DCBlength = 28
DCB_Param.BaudRate = 9600
DCB_Param.fBitFields = 16529
DCB_Param.XonLim = 256
DCB_Param.XoffLim = 256
DCB_Param.ByteSize = 8
DCB_Param.Parity = NOPARITY
DCB_Param.StopBits = ONESTOPBIT
If SetCommState(hModem, DCB_Param) <> 0 Then
Call GetCommTimeouts(hModem, ComTimeOut)
ComTimeOut.ReadIntervalTimeout = -1
ComTimeOut.ReadTotalTimeoutMultiplier = 0
ComTimeOut.ReadTotalTimeoutConstant = 0
ComTimeOut.WriteTotalTimeoutMultiplier = 0
ComTimeOut.WriteTotalTimeoutConstant = 5000
If SetCommTimeouts(hModem, ComTimeOut) <> 0 Then
Call PurgeComm(hModem, PURGE_RXCLEAR Or PURGE_TXCLEAR)
Call SetupComm(hModem, 256, 256)
outBuffer = "AT" & vbCrLf
Me.Caption = WriteFile(hModem, ByVal outBuffer, Len(outBuffer), n, 0)
Timer1.Enabled = True
Else
MsgBox "Не могу установить таймауты", vbCritical, "Ошибка"
End If
Else
MsgBox "Не могу установить параметры устройства", vbCritical, "Ошибка"
End If
Else
MsgBox "Не могу открыть порт", vbCritical, "Ошибка"
End If
End Sub
Private Sub Form_Unload(Cancel As Integer)
Call CloseHandle(hModem)
End Sub
Private Sub Timer1_Timer()
inBuffer = String$(256, Chr$(0))
Me.Caption = ReadFile(hModem, ByVal inBuffer, 256, n, 0)
Me.Caption = Me.Caption & ", прочитано байт: " & n
Text1.Text = Text1.Text & Left$(inBuffer, n)
End Sub
У таймера интервал выставлен 500 мс.
Всё работает отлично, запись/считываение, обмн данными, но только в среде разработки. После компиляции перестает работать. Ничего не записывается в порт и ничего не считывается из него. Функции WriteFile и ReadFile возвращают 0 (ошибка). Работает только если берешь окно мышкой за заголовок и таскаешь его по экрану, как только отпускаешь заголовок всё становится на свои места, функции опять возвращяют ошибку. Никак не могу понять что за странное поведение программы.
Для наглядности прикладываю саму прогу (сильно урезанную), которая демонстрирует всю проблему.
Помогите разобраться, срочно нужно, заказчик ждет.