Comunicação Serial

Programação C em geral

Moderadores: 51, guest2003

Comunicação Serial

Mensagempor v01d » 15 Jan 2010 08:53

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.
v01d
Avatar do usuário
v01d
Bit
 
Mensagens: 7
Registrado em: 14 Jan 2010 18:00

Mensagempor Djalma Toledo Rodrigues » 15 Jan 2010 09:10

A Serial do PC possui diversas linhas de contole para o Modem

Isto por hardwire

Controle por Soft temos o eficiente: Xon / Xoff

DJ
Avatar do usuário
Djalma Toledo Rodrigues
Dword
 
Mensagens: 2334
Registrado em: 03 Ago 2008 13:22

Mensagempor v01d » 15 Jan 2010 09:36

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]
v01d
Avatar do usuário
v01d
Bit
 
Mensagens: 7
Registrado em: 14 Jan 2010 18:00

Mensagempor Jairo15 » 20 Ago 2010 16:39

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
Jairo15
Nibble
 
Mensagens: 52
Registrado em: 06 Fev 2009 12:59

Mensagempor Red Neck Guy » 20 Ago 2010 17:04

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.
ASM51 descanse em paz!
Avatar do usuário
Red Neck Guy
Dword
 
Mensagens: 1968
Registrado em: 12 Out 2006 22:24

Mensagempor ivan » 20 Ago 2010 19:42

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...
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27

Mensagempor vtrx » 20 Ago 2010 20:00

Poderia explicar melhor como está acontecendo este erro?
Voce está usando um thread para receber os dados?
Avatar do usuário
vtrx
Dword
 
Mensagens: 2239
Registrado em: 20 Abr 2008 21:01

Mensagempor chipselect » 21 Ago 2010 21:18

aqui tem pronto a parte chata da win32

http://www.tetraedre.com/advanced/serial2.php
chipselect
Word
 
Mensagens: 744
Registrado em: 16 Out 2006 18:50

Mensagempor Jairo15 » 24 Ago 2010 17:51

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.
Jairo15
Nibble
 
Mensagens: 52
Registrado em: 06 Fev 2009 12:59

Mensagempor ivan » 25 Ago 2010 13:22

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.
"A mente que se abre a uma nova idéia jamais volta ao seu tamanho original." (Albert Einstein).
Avatar do usuário
ivan
Word
 
Mensagens: 618
Registrado em: 12 Out 2006 21:27


Voltar para Visual C++/C/C++/C#

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x