HBComm #2
Moderador: Moderadores
-
Hasse
- Usuário Nível 4

- Mensagens: 820
- Registrado em: 19 Out 2004 10:30
- Localização: Jaraguá do Sul - SC
HBComm #2
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 ?
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 ?
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: HBComm #2
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 !!!
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 !!!
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
-
Hasse
- Usuário Nível 4

- Mensagens: 820
- Registrado em: 19 Out 2004 10:30
- Localização: Jaraguá do Sul - SC
Re: HBComm #2
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.
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.
- Anexos
-
Recebe.prg- (87.38 KiB) Baixado 80 vezes
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: HBComm #2
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 ?
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 ?
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
-
Hasse
- Usuário Nível 4

- Mensagens: 820
- Registrado em: 19 Out 2004 10:30
- Localização: Jaraguá do Sul - SC
Re: HBComm #2
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:
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.
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)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.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: HBComm #2
Olá Hasse,
Tente mudar a variavel nHandle para nHandle2 essa variavel é public na hbcomm.
Seu exemplo ficaria assim:
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)Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
-
Hasse
- Usuário Nível 4

- Mensagens: 820
- Registrado em: 19 Out 2004 10:30
- Localização: Jaraguá do Sul - SC
Re: HBComm #2
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.
É 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.
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
- sygecom
- Administrador

- Mensagens: 7131
- Registrado em: 21 Jul 2006 10:12
- Localização: Alvorada-RS
- Contato:
Re: HBComm #2
Mas bah, estamos ai para se ajudar, qualquer coisa prende o grito !!!
Leonardo Machado
xHarbour.org + Hwgui + PostgreSql
xHarbour.org + Hwgui + PostgreSql
-
Hasse
- Usuário Nível 4

- Mensagens: 820
- Registrado em: 19 Out 2004 10:30
- Localização: Jaraguá do Sul - SC
Re: HBComm #2
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 !!!!!!!!!!!
Troquei o nome da variável nHandle da Função Testa-Drive() para nHandle2, e e e e e.....
FUNCIONOU !!!!!!!!!!!
Hasse
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)
CP200 / CP500 / Basic / dBase III / dBase IV / Clipper Summer / RTlink / Exospace.
Clipper 5.3b / Blinker 7.0 / CDX com TAG
xHarbour 1.2.1-6604 / Borland C++ (5.5.1) 32 bit / HBmake.
Harbour 3.2.0dev (r1412121623) / MINGW / HBM2 / MiniGui HMG 3.1.4 / IDE (Roberto Lopez).
"Conheça todas as teorias, domine todas as técnicas, mas, quando tocares uma alma humana, seja apenas outra alma humana." (C.G.Jung)