{{tag>category:"OpenInsight 32-Bit" author:"Ana Melisa Heras" author:"Richard Bright" author:"Colin Rule"}}
[[https://www.revelation.com/the-works|Join The Works program to have access to the most current content, and to be able to ask questions and get answers from Revelation staff and the Revelation community]]
==== Serial Port communication (OpenInsight 32-Bit) ====
=== At 16 MAY 2007 03:16:01PM Ana Melisa Heras wrote: ===
Hi,
Has anyone got a sample code of how to Open/Close/Read/Write from COM Port with these functions:
CreateFile,ReadFile,WriteFile,GetCommProperties,GetLastError,GetCommState,SetCommState
or using MSCOMM.OCX
which one is easier to use?
Thanks
----
=== At 16 MAY 2007 08:48PM Richard Bright wrote: ===
Ana,
I have done some work on mmcomm and have it working - created something like a HyperTerminal form to provide a test bed. The trick of serial comm is that you need to 'listen' to the comm buffer and take out whats there and re-assemble into useable chunks of data. Contact me for more info.
One of my next projects to change to the Win API which should be much more robust than an a pretty dated ocx. I know Revelation was looking at typing the Win API - you might like to check with Mike as to progress.
Richard Bright
r.bright@ark.co.nz
----
=== At 17 MAY 2007 09:52PM Colin Rule wrote: ===
For what its worth, we have some code, but its work in progress at the moment. Works fine for 16bit, but with 32 bit we had to change it all as Microsoft use different methods.
Code is below, but user beware...
You will of course need to declare the functions for the DLLs, we have applied our own extensions to avoid risk of Revelation clashes.
Having said all that there are issues at the moment (ie it doesnt work) which we have not resolved, and we may need to use a different approach.
In the meantime, I use a VB program to do the comms, and then pass this to OpenInsight, there is a slight delay but its livable.
If you can make it work, wonderful, if not, Richards suggestions may be a better alternative, and I am just posting on the off chance it might help.
You will need to adjust the code to suit, my common and variables for passing etc.
Colin
------------------
COMPILE SUBROUTINE COMM_ACCESS(MODE,COMM_PORT_HANDLE,COMMDATA)
* STANDARD
* Open/Close Comm port, Read/Write to port
* AG - May 96
*
$INSERT ICEPAC_COMMON
DECLARE FUNCTION BLANK_STRUCT,GET_PROPERTY,STRUCT_TO_VAR,VAR_TO_STRUCT
DECLARE FUNCTION OpenComm,CloseComm,BuildCommDCB,SetCommState,ReadComm,WriteComm
DECLARE FUNCTION CreateFileCSSP32,CloseCommCSSP32,BuildCommDCBCSSP32,SetCommStateCSSP32,ReadFileCSSP32,WriteFileCSSP32
DECLARE FUNCTION GetLastError,GetLastErrorCSSP32
BEGIN CASE
CASE MODE=OPEN" ;GOSUB OPEN_PORT
CASE MODE=CLOSE" ;GOSUB CLOSE_PORT
CASE MODE=READ" ;GOSUB READ_FROM_PORT
CASE MODE=WRITE" ;GOSUB WRITE_TO_PORT
END CASE
RETURN
OPEN_PORT:
COMM_ERRORS="
COMM_ERRORS=-1 ;COMM_ERRORS=Invalid or unsupported device"
COMM_ERRORS=-2 ;COMM_ERRORS=Device already in use"
COMM_ERRORS=-10;COMM_ERRORS=Device already in use"
COMM_ERRORS=-12;COMM_ERRORS=Device baud rate is invalid"
PORT =COMMDATA
BAUD_RATE=COMMDATA
DATA_BITS=COMMDATA
STOP_BITS=COMMDATA
PARITY =COMMDATA1,1
FLOW_CONTROL=COMMDATA1,1
PORT_SETTINGS=PORT:":":BAUD_RATE:",":PARITY:",":DATA_BITS:",":STOP_BITS:\00\
INQSIZE=1024
OUTQSIZE=128
IF BITSIZE=16 THEN
PORT=PORT:\00\
COMM_PORT_HANDLE=OpenComm(PORT,INQSIZE,OUTQSIZE)
END ELSE
ShareMode=1
CreationDisposition=3
COMM_PORT_HANDLE=CreateFileCSSP32(PORT,"",ShareMode,"",CreationDisposition,"","")
END
LOCATE COMM_PORT_HANDLE IN COMM_ERRORS USING @VM SETTING POS THEN
COMM_PORT_HANDLE=COMM_ERRORS
RETURN
END
DCBCode=DCB"
DCB_STRUCT=BLANK_STRUCT(DCBCode)
IF BITSIZE=16 THEN
RETVAL=BuildCommDCB(PORT_SETTINGS,DCB_STRUCT)
END ELSE
RETVAL=BuildCommDCBCSSP32(PORT_SETTINGS,DCB_STRUCT)
END
COMM_PARAMS=STRUCT_TO_VAR(DCB_STRUCT,DCBCode)
BEGIN CASE
CASE FLOW_CONTROL=X"
COMM_PARAMS=3
CASE FLOW_CONTROL=H"
COMM_PARAMS=5
COMM_PARAMS=9
COMM_PARAMS=64
END CASE
DCB_STRUCT=VAR_TO_STRUCT(COMM_PARAMS,DCBCode)
IF BITSIZE=16 THEN
RETVAL=SetCommState(DCB_STRUCT)
END ELSE
RETVAL=SetCommStateCSSP32(DCB_STRUCT)
END
RETURN
CLOSE_PORT:
IF BITSIZE=16 THEN
RETVAL=CloseComm(COMM_PORT_HANDLE)
END ELSE
RETVAL=CloseCommCSSP32(COMM_PORT_HANDLE)
END
RETURN
READ_FROM_PORT:
IF BITSIZE=16 THEN
BUFF_LEN=50
COMMDATA=STR(\00\,BUFF_LEN)
RETVAL=ReadComm(COMM_PORT_HANDLE,COMMDATA,BUFF_LEN)
COMMDATA=FIELD(COMMDATA,\00\,1)
END ELSE
BytesToRead=1024
BytesRead=0
BUFF_LEN=50
COMMDATA=50
RETVAL=ReadFileCSSP32(COMM_PORT_HANDLE,COMMDATA,BytesToRead,BytesRead,"")
ERROR="
RETVAL2=GetLastErrorCSSP32(ERROR)
END
RETURN
WRITE_TO_PORT:
COMMDATA=COMMDATA:\00\
BUFF_LEN=LEN(COMMDATA)
IF BITSIZE=16 THEN
RETVAL=WriteComm(COMM_PORT_HANDLE,COMMDATA,BUFF_LEN)
END ELSE
RETVAL=WriteFileCSSP32(COMM_PORT_HANDLE,COMMDATA,BUFF_LEN)
END
RETURN
----
=== At 23 MAY 2007 09:11PM Ana Melisa Heras wrote: ===
Thank for your help with the code, but How can i get your program in VB , at this moment is a great option.
I need to comunicate with a MS2200 series StratosS™
This is the link :
http://www.metrologic.com/corporate/products/pos/MS2200.htm
Can you give some options , what can You do for me?
Thanks
----
=== At 30 MAY 2007 11:59PM Colin Rule wrote: ===
I presume you intend to use the RS232 interfaces.
You no doubt have a cable for this, we used to solder them up ourselves in the old days.
Below is my VB program, there is stuff in it which wont be relevant, and I use to pass info back and forwards, log files and the like.
I have a small VB form with a timer control and the MSComm control on it, as well as a edit box to advise whats going on, but this EXE is run as a background program normally.
It will need to have many changes to work with this scanner, as there may be a whole range of things it needs. It probably has the ability to send and receive information, but you need to know the procotols for these.
If you give me your Email address I can send some screen shots and examples.
Good luck
Colin
----- VB CODE FOLLOWS ---------
Option Explicit
Dim sPath As String
Dim sCommand As String
Dim sArgs() As String
Dim InBuff As String
Dim sText As String
Dim LastBuff As String
Dim SoundFile As String
Private Declare Function sndPlaySound Lib "winmm.dll" Alias "sndPlaySoundA" (ByVal Filename As String, ByVal Flags As Long) As Long
Private Sub Form_Load()
sCommand=Command & ",,,,,,,"
If sCommand=" Then
sCommand=Comm1,9600,N,8,1,C:\,"
'sCommand=Comm2,9600,N,8,1,C:\,"
End If
sArgs()=Split(sCommand, ",")
sPath=sArgs(5)
SoundFile=sArgs(6)
Text.Text="
LastBuff="
If sPath=" Then sPath=C:\"
If Dir(sPath & "digit.log") "" Then
Kill sPath & "digit.log"
End If
Open sPath & "digit.log" For Append As #99
WriteToLog "Command line=" & sCommand & "'"
WriteToLog "Path=" & sPath & "'"
WriteToLog "Comm port=" & Right(sArgs(0), 1) & "'"
WriteToLog "Comm port settings=" & sArgs(1) & "," & sArgs(2) & "," & sArgs(3) & "," & sArgs(4) & "'"
WriteToLog "Sound File=" & SoundFile & "'"
With MSComm1
.CommPort=Right(sArgs(0), 1)
.Handshaking=2 - comRTS
.RThreshold=1
.RTSEnable=True
.Settings=sArgs(1) & "," & sArgs(2) & "," & sArgs(3) & "," & sArgs(4)
.SThreshold=1
.PortOpen=True
.InBufferCount=0
.InputLen=1
End With
WriteToLog "Comm port opened"
WriteToLog "RTS Enabled"
WriteToLog "Comm port buffer cleared"
WriteToLog "Ready to receive data..."
InBuff="
End Sub
Private Sub Form_Unload(Cancel As Integer)
If Dir(sPath & "dinfo.txt") "" Then
Kill sPath & "dinfo.txt"
End If
MSComm1.PortOpen=False
WriteToLog "Comm port closed"
WriteToLog "End of session"
Close #99
End Sub
Private Sub MSComm1_OnComm()
Dim InChar As String
Dim Counter As Integer
Select Case MSComm1.CommEvent
Case comEventBreak ' A Break was received.
Unload (Form1)
Case comEventCDTO ' CD (RLSD) Timeout.
Unload (Form1)
Case comEventCTSTO ' CTS Timeout.
Unload (Form1)
Case comEventDSRTO ' DSR Timeout.
Unload (Form1)
Case comEventTxFull ' Transmit buffer full.
Unload (Form1)
Case comEventFrame ' Framing Error
Case comEventOverrun ' Data Lost.
Case comEventRxOver ' Receive buffer overflow.
Case comEventRxParity ' Parity Error.
Case comEventDCB ' Unexpected error retrieving DCB]
Case comEvCD ' Change in the CD line.
Case comEvCTS ' Change in the CTS line.
Case comEvDSR ' Change in the DSR line.
Case comEvRing ' Change in the Ring Indicator.
Case comEvSend
Case comEvEOF
Case comEvReceive ' Received RThreshold # of chars.
InChar=MSComm1.Input
If InChar=Chr$(10) Then InChar="
If InChar=Chr$(13) Then
Open sPath & "digit.txt" For Append As #1
Print #99, "Data received: " & InBuff
Print #1, InBuff
Close #1
sText=Text.Text
Text.Text=sText & InBuff & Chr(13) & Chr(10)
LastBuff=InBuff
InBuff="
If SoundFile "" Then
Call sndPlaySound(SoundFile, 1)
End If
Else
InBuff=InBuff & InChar
End If
End Select
End Sub
Sub WriteToLog(sString As String)
Print #99, Now & " - " & sString
sText=Text.Text
Text.Text=sText & sString & Chr(13) & Chr(10)
End Sub
Private Sub Timer1_Timer()
If Dir(sPath & "dinfo.txt") "" Then Unload Me
End Sub
[[https://www.revelation.com/revweb/oecgi4p.php/O4W_HANDOFF?DESTN=O4W_RUN_FORM&INQID=WORKS_READ&SUMMARY=1&KEY=C330ED74D942AC1E852572DD0069D655|View this thread on the Works forum...]]