Bom dia Pablo.
Eu já havia testado esta Função, tirada de exemplos da pastas SAMPLES, mas na oportunidade descartei em virtude do comportamento dela.
É que ela dispara a Função a cada intervalo de tempo programado, mesmo que o primeiro processamento ainda não tenha terminado e voltado ao Window principal, fato este que dá erro na Porta Serial.
Agora, após a tua sugestão, botei o tico-e-teco prá funcionar, e encontrei uma gambiarra para contornar este problema. Veja:
l_Read := .F.
DEFINE WINDOW principal AT 30,1230 WIDTH 200 HEIGHT 80 ;
TITLE "JS600 - COM " + c_Port MAIN ;
ON INIT Dados_Iniciais( c_Form )
*
@ 12, 15 LABEL label_1 WIDTH 160 HEIGHT 16 ;
VALUE 'COM ' + c_Port + " => INATIVA" ;
FONT 'Times New Roman' SIZE 14
principal.label_1.fontcolor := RED
*
DEFINE TIMER Timer_1 INTERVAL 2000 ACTION Ctrl_Read()
*
END WINDOW
ACTIVATE Window principal
FUNCTION Ctrl_Read()
IF l_Read = .T.
RETURN( NIL )
ENDIF
l_Read := .T.
...
...
Leitura da Serial
...
...
l_Read := .T.
RETURN( .T. )
A variável
l_Read controla e retorna o segundo processo caso o primeiro ainda não tenha terminado o seu trabalho.
Ainda não testei a rotina de comunicação serial com este código, mas ela já está testada, com a MiniGUI em *.PRG separado. Agora, imagino juntar os 2 códigos, tratar da integração, e testar.
A não ser que haja uma outra forma de configurar a função DEFINE TIMER, acredito que a gambiarra deverá funcionar.
Uma outra pergunta:A MiniGui funciona com algo mais ou menos como abaixo ?
DEFINE TIMER Timer_1 INTERVAL 2000 ACTION ( Ctrl_Read1() ; Ctrl_Read2() )
ou ainda
DEFINE TIMER Timer_1 INTERVAL 2000 ACTION ( l_Read := .T. ; Ctrl_Read1() )
Onde o Processamento do Ctrl_Read1() é processado primeiro, e no seu retorno, é disparado Ctrl_Read2().