Página 1 de 1
HBComm #2
Enviado: 09 Mar 2009 21:30
por Hasse
Boa noite colegas.
Deparei-me com outro problema relacionado à comunicação serial.
No meio de uma Função e/ou quando uma segunda é invocada, surge algum problema pois ao finalizar esta Função a comunicação está cortada ou inviabilizada ou ainda corrompida.
Tentar Fechar a porta e em seguida Abrir novamente não funciona.
Não consigo, de forma alguma, estabelecer a comunicação novamente. Só consigo estabelecer esta comunicação novamente, encerrando o executável e em seguida abrindo novamente.
Alguém tem alguma idéia do pode estar acontecendo ?
Re: HBComm #2
Enviado: 10 Mar 2009 11:02
por sygecom
Olá Hasse,
Se entendi bem, você esta por exemplo abrindo a porta fazendo a leitura da mesma e antes de fechar a portas esta chamando outras funções que não tem nada haver com a hbcomm e isso esta lhe trancando a porta COM aberta isso ?
Pois fiz um pequeno teste aqui do que eu entendi e deu tudo certo, abri uma porta COM fiz a leitura e disse para o meu sistema antes de fechar a porta abrir um cadastro de cliente , fiz um cadastro completo salvei, e a porta se fechou assim que o cadastro foi concluido !!!
Um dos problema que tive com a Hbcomm foi de tentar usar elas em um loop de intervalo muito grande, chega uma hora que ela tranca tudo, outro foi de tentar usar a leitura de porta em Mult-therad as primeiras leituras da certo, porem na terceira em diante sempre da GPF, e tranca tudo...
Tente colocar um pequeno exemplo do seu problema para nós poder melhor lhe ajudar ou testar !!!
Re: HBComm #2
Enviado: 10 Mar 2009 21:52
por Hasse
Boa noite Leonardo.
Estou anexando o PRG completo onde ocorre o problema.
Veja que inseri 4 STOP's para descobrir exatamente em qual rotina ou sub-rotina está acontecendo o erro.
Como descrição básica, o funcionamento é o seguinte:
Function Recebe()
Na linha 484 (K_ENTER) inicia a rotina de edição dos dados, onde coloquei o primeiro STOP, nas linhas 488/498, que denominei de "a" ao final da mensagem de tela.
Durante esta edição, pode ser chamada uma Função acessada via SET KEY.
Ao término da edição, na linha 799, nas opções 1 e 3, os dados alterados podem ser gravados no HD local. Antes desta gravação coloquei outro STOP, nas linhas 802/812, denominada "b".
Ao término da gravação, coloquei outro STOP, nas linhas 944/954, denominada "c", ainda antes da função EnviaRes1(), só na opção 3, que envia os resultados para o Servidor.
Ao término da gravação dos dados no Servidor, coloquei outro STOP, nas linhas 963/973, denominada "d".
Ainda não tive oportunidade de rodar estes testes.
Re: HBComm #2
Enviado: 11 Mar 2009 17:07
por sygecom
Olá Hasse,
Confesso que olhei por cima e vi os STOP, porem eu não tenho como testar aqui, mas lhe pergunto, pq você não mantem a porta fechada em quando não esta usando ! Acho que o ideal é esse, quando realmente for abrir e ler a porta, ai sim faça somente isso !!! Pelo o que eu pude notar quando ele vai chegar em RecebeDados() ele já passou por um monte de coisa.
Me responda uma coisa quando ele chega nos INKEY(0) ele esta ATIVO ou INATIVO ?
Re: HBComm #2
Enviado: 11 Mar 2009 18:32
por Hasse
Boa tarde Leonardo.
Encontrei o "responsável
marvado". Trata-se de uma rotina chamada Testa_drive(), que é invocada logo nas primeiras linhas da Função EnviaRes1(). Ela usa as funções de baixo nível. Veja abaixo:
Código: Selecionar todos
Function Testa_Drive(strDrive,cArq)
Local nArq
strDrive := strDrive + cArq + '.TST'
nHandle := Fcreate(strDrive) // cria arquivo para testar o drive.
If Ferror()#0 // drive não existe, não está formatado,
Fclose(nHandle) // ou não existe disquete no drive.
Ferase(strDrive) && apaga arquivo criado.
//
// tratar o erro aqui
//
Return(.F.)
Else
Fclose(nHandle)
Ferase(strDrive) && apaga arquivo criado.
Return(.T.)
EndIf
Return(Nil)
Parece que ela tem alguma incompatibilidade com o HBComm(). Isto não deveria acontecer, visto que a linguagem de baixo nível faz parte do xHarbour nativo. Só posso imaginar tratar-se de um bug da HBComm() e que ainda precisa ser arredondado.
Tenho 2 saídas:
1-Fazer como você sugeriu, fechando a porta antes de acessar a função EnviaRes1();
2-Desenvolver outra função para testar a conexão com o Servidor.
Como a função Testa-drive() é muito eficiente e nunca se perde e, por esse motivo eu não gostaria de fazer qualquer alteração nela ou trocar para funções que não sejam escritas daquela forma, acredito que no fim vou optar por fechar a porta antes e abrir novamente depois....
Inicialmente optei por manter a porta aberta durante a operação de edição e gravação para permitir a recepção de dados mesmo quando o operador está editando dados de outro paciente. Mas no fim, é melhor ter uma comunicação serial segura do que tentar agilizar o serviço da serial e ter problemas.
E nem precisa perguntar como você faria. A tua resposta já está implícita na mensagem anterior.
Finalmente, agradeço-te pelo empenho em ajudar, e quem sabe, de lambuja, ainda encontremos a solução para este conflito.
Re: HBComm #2
Enviado: 11 Mar 2009 18:47
por sygecom
Olá Hasse,
Tente mudar a variavel
nHandle para
nHandle2 essa variavel é public na hbcomm.
Seu exemplo ficaria assim:
Código: Selecionar todos
Function Testa_Drive(strDrive,cArq)
Local nArq
strDrive := strDrive + cArq + '.TST'
nHandle2 := Fcreate(strDrive) // cria arquivo para testar o drive.
If Ferror()#0 // drive não existe, não está formatado,
Fclose(nHandle2) // ou não existe disquete no drive.
Ferase(strDrive) && apaga arquivo criado.
//
// tratar o erro aqui
//
Return(.F.)
Else
Fclose(nHandle2)
Ferase(strDrive) && apaga arquivo criado.
Return(.T.)
EndIf
Return(Nil)
Re: HBComm #2
Enviado: 11 Mar 2009 19:35
por Hasse
Muito bem observado, Leonardo.
É quase certo que o problema seja esse. Eu não tinha percebido este detalhe. Eu vou testar, e coloco o resultado depois.
A Lei de Murphy mais uma vez dando o ar da sua graça....
Valeu, amigo. Obrigado, mais uma vez.
Re: HBComm #2
Enviado: 12 Mar 2009 11:04
por sygecom
Mas bah, estamos ai para se ajudar, qualquer coisa prende o grito !!!
Re: HBComm #2
Enviado: 13 Mar 2009 11:25
por Hasse
Testei a tua sugestão, Leonardo.
Troquei o nome da variável nHandle da Função Testa-Drive() para nHandle2, e e e e e.....
FUNCIONOU !!!!!!!!!!!