Не работает скомпилированный ехе файл (работа с СОМ портом) - VB
Формулировка задачи:
закончил написание приложения для работы с ком портом
за основу брал исходник http://www.sources.ru/vb/vb_serial_comms.shtml
т.о. обращался с ком портом через API функцию. вот модуль
вызываю функцию кнопкой (в текст2 команда 1,2 или 3)
так вот,когда запускаю все это в редакторе VB 6 все работает нормально.
А скомпеллированный ЕХЕ файл не работает, пишет ошибку MsgBox "Error writing to comm's".
Пробовал пошагово вставлять MsgBox'ы, определил что не срабатывает
WriteFile(ComNum, BB, 1, RetBytes, 0)
думал, что проблемы с библиотекой "kernel32", но функция sleep (из другого модуля) в ЕХЕшнике работает
кто-нибудь знает, в чем может быть дело?
Листинг программы
- Option Explicit
- Global ComNum As Long
- Global bRead(1535) As Byte
- Type COMSTAT
- fCtsHold As Long
- fDsrHold As Long
- fRlsdHold As Long
- fXoffHold As Long
- fXoffSent As Long
- fEof As Long
- fTxim As Long
- fReserved As Long
- cbInQue As Long
- cbOutQue As Long
- End Type
- Type COMMTIMEOUTS
- ReadIntervalTimeout As Long
- ReadTotalTimeoutMultiplier As Long
- ReadTotalTimeoutConstant As Long
- WriteTotalTimeoutMultiplier As Long
- WriteTotalTimeoutConstant As Long
- End Type
- Type DCB
- DCBlength As Long
- BaudRate As Long
- fBinary As Long
- fParity As Long
- fOutxCtsFlow As Long
- fOutxDsrFlow As Long
- fDtrControl As Long
- fDsrSensitivity As Long
- fTXContinueOnXoff As Long
- fOutX As Long
- fInX As Long
- fErrorChar As Long
- fNull As Long
- fRtsControl As Long
- fAbortOnError As Long
- fDummy2 As Long
- wReserved As Integer
- XonLim As Integer
- XoffLim As Integer
- ByteSize As Byte
- Parity As Byte
- StopBits As Byte
- XonChar As Byte
- XoffChar As Byte
- ErrorChar As Byte
- EofChar As Byte
- EvtChar As Byte
- End Type
- Type OVERLAPPED
- Internal As Long
- InternalHigh As Long
- offset As Long
- OffsetHigh As Long
- hEvent As Long
- End Type
- Type SECURITY_ATTRIBUTES
- nLength As Long
- lpSecurityDescriptor As Long
- bInheritHandle As Long
- End Type
- Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
- Declare Function GetLastError Lib "kernel32" () As Long
- Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As Long) As Long
- Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, lpOverlapped As Long) As Long
- Declare Function SetCommTimeouts Lib "kernel32" (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long
- Declare Function GetCommTimeouts Lib "kernel32" (ByVal hFile As Long, lpCommTimeouts As COMMTIMEOUTS) As Long
- Declare Function BuildCommDCB Lib "kernel32" Alias "BuildCommDCBA" (ByVal lpDef As String, lpDCB As DCB) As Long
- Declare Function SetCommState Lib "kernel32" (ByVal hCommDev As Long, lpDCB As DCB) As Long
- Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
- Declare Function FlushFileBuffers Lib "kernel32" (ByVal hFile As Long) As Long
- Function fin_com()
- fin_com = CloseHandle(ComNum)
- End Function
- Function FlushComm()
- FlushFileBuffers (ComNum)
- End Function
- Function Init_Com(ComNumber As String, Comsettings As String) As Boolean
- On Error GoTo handelinitcom
- Dim ComSetup As DCB, Answer, Stat As COMSTAT, RetBytes As Long
- Dim retval As Long
- Dim CtimeOut As COMMTIMEOUTS, BarDCB As DCB
- ' Open the communications port for read/write (&HC0000000).
- ' Must specify existing file (3).
- ComNum = CreateFile(ComNumber, &HC0000000, 0, 0&, &H3, 0, 0)
- If ComNum = -1 Then
- 'MsgBox "Com Port " & ComNumber & " not available. Use Serial settings (on the main menu) to setup your ports.", 48
- Init_Com = False
- Exit Function
- End If
- 'Setup Time Outs for com port
- CtimeOut.ReadIntervalTimeout = 20
- CtimeOut.ReadTotalTimeoutConstant = 1
- CtimeOut.ReadTotalTimeoutMultiplier = 1
- CtimeOut.WriteTotalTimeoutConstant = 10
- CtimeOut.WriteTotalTimeoutMultiplier = 1
- retval = SetCommTimeouts(ComNum, CtimeOut)
- If retval = -1 Then
- retval = GetLastError()
- MsgBox "Unable to set timeouts for port " & ComNumber & " Error: " & retval
- retval = CloseHandle(ComNum)
- Init_Com = False
- Exit Function
- End If
- retval = BuildCommDCB(Comsettings, BarDCB)
- If retval = -1 Then
- retval = GetLastError()
- MsgBox "Unable to build Comm DCB " & Comsettings & " Error: " & retval
- retval = CloseHandle(ComNum)
- Init_Com = False
- Exit Function
- End If
- retval = SetCommState(ComNum, BarDCB)
- If retval = -1 Then
- retval = GetLastError()
- MsgBox "Unable to set Comm DCB " & Comsettings & " Error: " & retval
- retval = CloseHandle(ComNum)
- Init_Com = False
- Exit Function
- End If
- Init_Com = True
- handelinitcom:
- Exit Function
- End Function
- Function ReadCommPure() As String
- On Error GoTo handelpurecom
- Dim RetBytes As Long, i As Integer, ReadStr As String, retval As Long
- Dim CheckTotal As Integer, CheckDigitLC As Integer
- retval = ReadFile(ComNum, bRead(0), 1535, RetBytes, 0)
- ReadStr = ""
- If (RetBytes > 0) Then
- For i = 0 To RetBytes - 1
- ReadStr = ReadStr & Chr(bRead(i))
- Next i
- Else
- FlushComm
- End If
- 'Return the string read from serial port
- ReadCommPure = ReadStr
- handelpurecom:
- Exit Function
- End Function
- Function WriteCOM32(COMString As String) As Integer
- On Error GoTo handelwritelpt
- Dim RetBytes As Long, LenVal As Long
- Dim retval As Long
- Dim BB As Byte
- If COMString = 1 Then BB = &H55
- If COMString = 2 Then BB = &H75
- If COMString = 3 Then BB = &H85
- retval = WriteFile(ComNum, BB, 1, RetBytes, 0)
- WriteCOM32 = RetBytes
- handelwritelpt:
- Exit Function
- End Function
Листинг программы
- Private Sub Command1_Click()
- If WriteCOM32(txt(2)) <> Len(txt(2)) Then 'проверка записываемой команды
- MsgBox "Error writing to comm's"
- Exit Sub
- End If
- 'далее мои операторы
- *****
Листинг программы
- Declare Sub sleep Lib "kernel32" Alias "Sleep" (ByVal dwMilliseconds As Long)
- Sub Sleep1(timee As Long)
- sleep timee
- End Sub
Решение задачи: «Не работает скомпилированный ехе файл (работа с СОМ портом)»
textual
Листинг программы
- txt(2).text
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д