I have an application that sends COM4 a loop like this ...
123||60||0||0||0||2||
123||60||0||0||0||2||
123||60||0||0||0||2||
123||60||0||0||0||2||
.
.
.
.
.
123||60||0||0||0||2||
I need to intercept this string to process and return on the same COM4 port that will stop sending this string until starting a new loop with a new string within this format.
I tested the programs below without success.
def button stop-it label "STOP".
def var stop-sel as logical no-undo initial false.
def var lv_tag as character no-undo.
display stop-it.
on choose of stop-it
stop-sel = true.
input from com4.
repeat:
enable stop-it.
process events.
import lv_tag.
end.
input close.
But the above program locks up and brings nothing, nor does it enable the button.
def var i-abre as integer no-undo initial 3.
def var i-le-grava as integer no-undo initial -1073741824.
def var bit-flags as integer no-undo.
def var l-rc as logical no-undo.
def var l-ativo as logical no-undo initial false.
def var i-rc as integer no-undo.
def var i-com-handle as integer no-undo.
def var i-cont1 as integer no-undo.
def var i-cont2 as integer no-undo.
def var m-estr-dcb as memptr no-undo.
def var m-com-status as memptr no-undo.
def var m-recebe as memptr no-undo.
def var m-envio as memptr no-undo.
def var c-estrutura as character no-undo format "X(28)".
def var c-status-estrut as character no-undo format "X(5)".
def var c-recebe as character no-undo format "X(1024)".
def var c-transmite as character no-undo format "X(1024)".
/* Windows API Procedure Definitions --- */
procedure ClearCommError external "KERNEL32.DLL":
def input param nCid as long no-undo. /* COMMUNICATIONS HANDLE */
def input-output param errormask as memptr no-undo. /* POINTER TO STATUS DATA */
def input-output param comstat as memptr no-undo. /* POINTER TO STATUS DATA */
/* def return parameter nReturn as short no-undo. */
end procedure.
procedure CreateFileA external "kernel32.DLL":
def input param szDevice as character no-undo. /* DEVICE NAME */
def input param fdwAccess as long no-undo.
def input param fdwShareMode as long no-undo.
def input param lpsa as long no-undo.
def input param fdwCreate as long no-undo.
def input param fdwAttrFlags as long no-undo.
def input param hTemplate as long no-undo.
def return param nCid as long no-undo.
end procedure.
procedure CloseHandle external "KERNEL32.DLL":
def input param nCid as long no-undo. /* COMMUNICATIONS HANDLE */
end procedure.
procedure GetCommState external "KERNEL32.DLL":
def input param nCid as long no-undo. /* CONFIG STRING IN DOS MODE FORMAT */
def input-output param lpDCB as memptr no-undo. /* POINTER TO A DCB STRUCTURE */
def return param nReturn as short no-undo. /* RETURN CODE */
end procedure.
procedure SetCommTimeouts external "KERNEL32.DLL":
def input parameter nCid as long no-undo. /* COMMUNICATIONS HANDLE */
def input-output parameter lpTimeouts as memptr no-undo. /* TIMEOUT VALUES */
def return parameter nReturn as short no-undo. /* RETURN CODE */
end procedure.
procedure FlushComm external "USER.EXE":
def input parameter nCid as short no-undo. /* COMMUNICATIONS HANDLE */
def input parameter nQueue as short no-undo. /* WHICH BUFFER TO FLUSH */
def return parameter nReturn as short no-undo. /* RETURN CODE */
end procedure.
procedure SetCommState external "KERNEL32.DLL":
def input parameter nCid as long no-undo. /* POINTER TO A DCB STRUCTURE */
def input-output parameter lpDCB as memptr no-undo. /* POINTER TO A DCB STRUCTURE */
def return parameter nReturn as short no-undo. /* RETURN CODE */
end procedure.
procedure ReadFile external "KERNEL32.DLL":
def input param nCid as long no-undo. /* COMMUNICATIONS HANDLE */
def input-output param lpBuf as memptr no-undo. /* POINTER TO A RECEIVE BUFFER */
def input param nSizetoRead as long no-undo. /* NUMBER OF BYTES TO RECEIVE */
def input-output param nSizeActRead as memptr no-undo. /* NUMBER OF BYTES TO RECEIVE */
def input param nullptr as long no-undo. /* NUMBER OF BYTES TO RECEIVE */
def return param nReturn as short no-undo. /* RETURN CODE */
end procedure.
procedure WriteFile external "KERNEL32.DLL":
def input parameter nCid as long no-undo. /* COMMUNICATIONS HANDLE */
def input-output parameter lpBuf as memptr no-undo. /* POINTER TO A TRANSMIT BUFFER */
def input parameter nSizetowrite as long no-undo. /* NUMBER OF BYTES TO TRANSMIT */
def input-output parameter nSizeActwrit as memptr no-undo. /* NUMBER OF BYTES TO RECEIVE */
def input parameter nullptr as long no-undo. /* NUMBER OF BYTES TO RECEIVE */
def return parameter nReturn as short no-undo. /* RETURN CODE */
end procedure.
procedure COMMTIMEOUTS external "KERNEL32.DLL":
def input parameter ReadIntervalTimeout as long no-undo.
def input parameter ReadTotalTimeoutMultiplier as long no-undo.
def input parameter ReadTotalTimeoutConstant as long no-undo.
def input parameter WriteTotalTimeoutMultiplier as long no-undo.
def input parameter WriteTotalTimeoutConstant as long no-undo.
def return parameter COMMTIMEOUTS as long no-undo.
/* , *LPCOMMTIMEOUTS; */
end procedure.
/* run ReceiveData (input 5). */
run pi-conecta.
run pi-envia (input 'teste').
/* internal procedure calls*/
procedure pi-conecta:
/* Porta de comunica‡Æo (COM1) */
/* \Device123||60||0||0||0||2||
123||60||0||0||0||2||
123||60||0||0||0||2||
123||60||0||0||0||2||
.
.
.
.
.
123||60||0||0||0||2||
00006d */
def var pi-param-1 as integer no-undo.
def var pi-param-2 as integer no-undo.
def var pi-param-3 as integer no-undo.
def var pi-param-4 as integer no-undo.
set-size(ComStatStructurePointer) = 20.
put-long(ComStatStructurePointer,1) = 1000.
put-long(ComStatStructurePointer,5) = 10.
put-long(ComStatStructurePointer,9) = 100.
put-long(ComStatStructurePointer,13) = 10.
put-long(ComStatStructurePointer,17) = 100.
run SetCommTimeouts (CommHandle,
input-output ComStatStructurePointer,
output nRC).
run CreateFileA (input 'COM4',
input i-le-grava,
input pi-param-1,
input pi-param-2,
input i-abre,
input pi-param-3,
input pi-param-4,
output i-com-handle).
if i-com-handle < 0 then do:
message "Handle invalido:" i-com-handle " na procedure pi-conecta"
view-as alert-box error.
quit.
end.
set-size(m-estr-dcb) = 29.
run GetCommState (i-com-handle, input-output m-estr-dcb, output i-rc).
if i-rc <> 0 then do:
assign c-estrutura = get-string(m-estr-dcb,1).
put-long(m-estr-dcb,5) = 9600.
bit-flags = exp(2,9) + exp(2,10).
put-long(m-estr-dcb,9) = bit-flags.
put-byte(m-estr-dcb,19) = 8.
put-byte(m-estr-dcb,20) = 0.
run SetCommState (i-com-handle, input-output m-estr-dcb,output i-rc).
if i-rc = 0 then do:
message "error setting new parameters"
view-as alert-box.
end.
end.
else do:
message "BuildCommDCB failed in pi-conecta"
view-as alert-box error.
end.
end procedure.
procedure ReceiveData:
def input parameter numchars as int.
def var vm-rec as memptr.
/* The ReceiveData Variable Will Contain The Data Read From The Serial Port */
set-size(vm-rec) = 4.
if numchars > 0 then do:
set-size(m-recebe) = numchars + 1. /* Max Size of Receive Queue */
run ReadFile (i-com-handle, input-output m-recebe, numchars,input-output vm-rec,0, output i-rc).
assign c-recebe = get-string(m-recebe,1).
if numchars < get-long(vm-rec,1) then do:
message "Readcomm did not get all characters".
end.
set-size(m-recebe) = 0.
end.
set-size(vm-rec) = 0.
end procedure.
procedure check-receive:
def var errmask as memptr no-undo.
def var m-check as memptr no-undo.
def var num-chars as integer no-undo.
set-size(m-check) = 12.
set-size(errmask) = 4.
put-long(m-check,1) = 0.
put-long(errmask,1) = 0.
run ClearCommError(i-com-handle,input-output errmask,input-output m-check /*,output i-rc*/).
num-chars = get-long(m-check,5).
set-size(errmask) = 0.
set-size(m-check) = 0.
return string(num-chars).
end procedure.
procedure pi-envia:
def input parameter datatosend as char.
def var TotalSize as integer no-undo.
def var m-send as memptr no-undo.
def var retry-count as integer no-undo initial 0.
set-size(m-send) = 4.
put-long(m-send,1) = 0.
do while length(datatosend)>0:
assign c-transmite = DataToSend
TotalSize = length(c-transmite).
set-size(m-envio) = TotalSize + 1.
put-string(m-envio,1) = c-transmite.
run WriteFile (i-com-handle,input-output m-envio, TotalSize, input-output m-send,0, output i-rc).
case true:
when get-long(m-send,1) LT TotalSize then do:
message "transmitdata sent " i-rc " of " totalsize
" at " time "retry=" retry-count.
assign retry-count = retry-count + 1.
datatosend = substring( c-transmite , absolute(i-rc) + 1 ).
pause 1 no-message.
end.
otherwise do:
datatosend = "".
end.
end case.
set-size(m-envio) = 0.
end.
set-size(m-send) = 0.
end procedure.
Has anyone done anything like this and can you give me a hint?