Página 1 de 1

Comunicação Serial

MensagemEnviado: 15 Jan 2010 08:53
por v01d
Opa,

Estou usando o Visual C++ 6 (mas sem MFC, apenas com SDK) para construir funções de comunicação através de porta serial para comuicação com uma balança que possui um mecanismo de protocolo de comunicação ASCII.

Estou utilizando as funções CreateFile, WriteFile e ReadFile. Enquanto a balança estava programada para enviar o peso de forma contíua,tudo funcionava a mil maravilhas, mas no momento em que ela passou a funcionar através de troca de comandos, a minha função ReadFile passou a dar erro de timeout. Já configurei os timeout´s com vários valores mais continuo obtendo os mesmos erros.

Começei a suspeitar de estar sinais de controle e gostaria de saber quais e como tratá-los. Alguém pode me dar uma ajuda.

Acrescentando, já consultei diversos site (rogercom e etc) e não consegui nenhuma resposta.

MensagemEnviado: 15 Jan 2010 09:10
por Djalma Toledo Rodrigues
A Serial do PC possui diversas linhas de contole para o Modem

Isto por hardwire

Controle por Soft temos o eficiente: Xon / Xoff

DJ

MensagemEnviado: 15 Jan 2010 09:36
por v01d
DJalma,

Mas eu estava fazendo tudo no mais alto nível possível sem me preocupar com os sinais. Am algum lugar lugar, vi que para o controle de software Xon / Xoff não era indicado.

Achei que as funções ReadFile e WriteFile já faziam esse controle por mim, deixando os detalhes das linhas de controle.

Entretanto, vi que alguns software de teste de porta (no meu caso a COM3), utlizam controle de sinais RX e TX, mas naum achei uma referência clara sobre esses sinais.

Tem como evitar usá-los ?

{}[/quote]

MensagemEnviado: 20 Ago 2010 16:39
por Jairo15
Bom pessoal,

Estava precisando de uma ajuda na porta serial também, estou longe da programação em PC um bom tempo, sou da época em que dava para acessar a interrupção da porta serial no DOS, e agora com o XP e 7 ? tentei fazer uns testes com rotinas prontas mas não funcionaram como esperava, uso um CI 75176 para converter RS232 para RS485, e uso o pino de RTS para chavear o CI, e o ultimo byte não sai inteiro na grande maioria.

Alguem tem alguma ideia de como fazer acesso direto a porta serial byte a byte, sem ser pela API do Ruindows, acho que é quase com escrever um driver, consegui um livro que fala em .VXD mas não deu tempo de ler ainda, mas só fala em até Windows NT e 2000, não sei se funfa no XP e 7. (Hardware: Programação Virtual de I/O e Interrupções da Editora MZ)

Alguma luz?

Abraço

MensagemEnviado: 20 Ago 2010 17:04
por Red Neck Guy
Jairo15 escreveu:Bom pessoal,

Estava precisando de uma ajuda na porta serial também, estou longe da programação em PC um bom tempo, sou da época em que dava para acessar a interrupção da porta serial no DOS, e agora com o XP e 7 ? tentei fazer uns testes com rotinas prontas mas não funcionaram como esperava, uso um CI 75176 para converter RS232 para RS485, e uso o pino de RTS para chavear o CI, e o ultimo byte não sai inteiro na grande maioria.

Alguem tem alguma ideia de como fazer acesso direto a porta serial byte a byte, sem ser pela API do Ruindows, acho que é quase com escrever um driver, consegui um livro que fala em .VXD mas não deu tempo de ler ainda, mas só fala em até Windows NT e 2000, não sei se funfa no XP e 7. (Hardware: Programação Virtual de I/O e Interrupções da Editora MZ)

Alguma luz?

Abraço


A forma mais fácil de contornar esse problema é construir o conversor de forma que a linha RTS desabilite apenas o transmissor. Dessa forma os bytes que tu enviar serão recebidos.
Assim, tu baixa a linha RTS quando receber todos os bytes que está enviando, após, desabilita o transmissor.
Existe aí uma 1/2 dúzia de empresas que fazem sistemas de supervisão que são velhos como eu que fazem assim.

MensagemEnviado: 20 Ago 2010 19:42
por ivan
Com as API do Windows vc tem que usar a WaitCommEvent
http://www.lookrs232.com/com_port_progr ... _event.htm

Para então fazer a leitura.

Mas mesmo assim, consulta as outra APIs; SetupCommPort, etc...

MensagemEnviado: 20 Ago 2010 20:00
por vtrx
Poderia explicar melhor como está acontecendo este erro?
Voce está usando um thread para receber os dados?

MensagemEnviado: 21 Ago 2010 21:18
por chipselect
aqui tem pronto a parte chata da win32

http://www.tetraedre.com/advanced/serial2.php

MensagemEnviado: 24 Ago 2010 17:51
por Jairo15
Obrigado pelas respostas pessoal ...

O que o Aquino respondeu é válido, teria que fazer esse arranjo no software, mas é uma boa saida.

Ivan a função WaitCommEvent da API tem uma função :

EV_TXEMPTY - inform about the transmission of the last character from the back-end buffer

Mas como está escrito o evento acontece quando o buffer ficou vazio e não que o byte terminou de ser transmitido.

MensagemEnviado: 25 Ago 2010 13:22
por ivan
Pode-se setar o tamanho do buffer pela SetupComm. Na verdade a solução do seu prob será alcaçada com a utilização de algumas APIs.