Dúvidas sobre o mscomm.

Programação Visual Basic

Moderadores: 51, guest2003

Dúvidas sobre o mscomm.

Mensagempor zielpunkt » 13 Out 2006 11:32

Olá, pessoal.

Já tenho feito comunicação entre MCU <-> PC(VB, Delphi) há algum tempo, mas nunca precisei enviar uma sequencia muito longa de caracteres para o PC. Estou tendo um problema (de entendimento, eu creio) quanto ao componente mscomm do VB. Quando envio ao PC, de forma contínua, uma sequencia hex, como por exemplo:

0X15 0X30 0X10 0X05 0X01 0X20 0X10 0X10 0X23

Então eu recebo no meu TextBox com quebra de linha e percebo, pelo Serial Port Monitor, que há uma quebra na sequencia dos dados:

0X15 0X30 0X10 0X05 0X01

0000000...0000000...etc (isso não aparece no TextBox, só no Serial Port Monitor) e depois completa em outra linha:

0X20 0X10 0X10 0X20

Mudando o setup do RThreshold até consigo tudo numa mesma linha, mas não acho que seja a opção correta e que resolva para outros casos de diferentes extensões de dados. Alguém teria a solução ou alguma sugestão?

zielpunkt
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor fabio » 14 Out 2006 16:47

Se eu não me engano na mscomm, é possivel definir a entrada de dados como binário assim o componente não faz nenhum tipo de processamento em cima dos dados. Da uma olhada nisto.
Avatar do usuário
fabio
 
Mensagens: 2
Registrado em: 11 Out 2006 22:23
Localização: Campinas - SP

Mensagempor zielpunkt » 16 Out 2006 11:08

Valeu, fabio, vou verificar e posto aqui.

zielpunkt.
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor zielpunkt » 17 Out 2006 11:12

Bem, fabio, o problema ocorre porque dispara-se o evento 'comEvReceive' na chegada do primeiro caracter pela serial (RThreshold=1) e a velocidade de leitura do buffer de recepção no PC, por ser maior que a chegada dos demais caracteres do 'pacote' enviado pelo MCU, provoca a leitura de uma parte dos dados, apaga-os e torna a ler os que chegaram depois, e assim vai. Isso provoca a tal mudança de linha no TextBox, devido ao não total preenchimento do buffer antes dessa leitura. Penso que para resolver isso posso avaliar se ocorreu a parada de recepção por limite máximo de tempo entre dois eventos 'comEvReceive', e só então tratar os dados que chegaram.

Mas valeu para entender melhor as possibilidades do componente. Obrigado pela força.

zielpunkt
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor Visitante » 23 Jan 2007 17:33

FU@@ED IN ALL HOLES!
http://tinyurl.com/tcx83
Visitante
 

Mensagempor Renie » 23 Jan 2007 21:29

Não clique no link acima, é SPAM!!!!
[]'s
Renie
-------------------------------------------------------------------------------------------------------------
Meu velho site com eletrônica praticamente parado http://www.reniemarquet.com
Nosso Blog http://artemadeiraevida.blogspot.com.br
Renie
Word
 
Mensagens: 732
Registrado em: 11 Out 2006 22:35
Localização: RJ - Niterói - Brasil

Mensagempor francis » 28 Jan 2007 11:18

zielpunkt escreveu:Bem, fabio, o problema ocorre porque dispara-se o evento 'comEvReceive' na chegada do primeiro caracter pela serial (RThreshold=1) e a velocidade de leitura do buffer de recepção no PC, por ser maior que a chegada dos demais caracteres do 'pacote' enviado pelo MCU, provoca a leitura de uma parte dos dados, apaga-os e torna a ler os que chegaram depois, e assim vai. Isso provoca a tal mudança de linha no TextBox, devido ao não total preenchimento do buffer antes dessa leitura. Penso que para resolver isso posso avaliar se ocorreu a parada de recepção por limite máximo de tempo entre dois eventos 'comEvReceive', e só então tratar os dados que chegaram.

Mas valeu para entender melhor as possibilidades do componente. Obrigado pela força.

zielpunkt


Caro zielpunkt,

Eu já trabalhei muito com esse controle e já passei pelo mesmo problema que você. O que eu fiz para resolver o problema foi adicionar um laço dentro do tratamento do comEvReceive para ler todos os dados do buffer. A coisa é mais ou menos assim [código do myComm_OnComm]:
Código: Selecionar todos
  Select Case myComm.CommEvent
    Case comEvReceive
      Do While myComm.InBufferCount <> 0
        'le o dado da serial
        bytDado = AscB(myComm.InputData)
        ' bytDado = o dado recebido da serial. aqui entao o processamos
        ' <processa o dado, etc.>
      Loop
    Case Else
  End Select

Para isso funcionar, você deve configurar o controle assim:
Código: Selecionar todos
  With myComm
    .RThreshold = 1
    .InputMode = Binary
    .InputLen = 1
  End With

Dessa forma não existirão dados 'perdidos'. Devo dizer que eu bati cabeça demais até descobrir que apesar do RThreshold estar em 1, o controle pode [e com certeza vai] colocar mais de um byte no buffer. Sinistro :shock:
Agora para avaliar se ocorreu o término da transmissão, eu recomendo que você use algum caractere especial de terminação dos dados, especialmente se ele não ocorrer no meio dos dados [um 0x00 por exemplo].

Abraços
francis
 
Mensagens: 3
Registrado em: 24 Out 2006 16:12

Mensagempor zielpunkt » 29 Jan 2007 20:00

E ahe, Francis!

Realmente esse mscomm é um pouco sinistro nessas aplicações. O dispositivo está rodando, às custas de alguns remendos que acabam parecendo mais como "simpatia" do que solução técnica :lol: . Acabei de verificar o seu código e vamos testar por aqui, ok. Quanto a sinalizar o EOF eu já tinha implementado com um caracter diferenciado. Valeu pra caramba a ajuda e quando tiver avaliado o teu código eu posto por aqui.

Abço.
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor zielpunkt » 08 Fev 2007 18:34

Então, francis,

A tua sugestão foi muito proveitosa e a partir dela pude enxugar todos os "gatos" que haviam no código. Parece que ficou redondo, ok.

Valeu!
"Talento é mais barato que sal. O que separa a pessoa talentosa da bem-sucedida é muito trabalho duro." [ Stephen King ]
zielpunkt
Byte
 
Mensagens: 376
Registrado em: 12 Out 2006 11:36
Localização: Sao Paulo - SP

Mensagempor francis » 13 Fev 2007 22:15

Caro zielpunkt,
Fico satisfeito em saber que a sugestão funcionou bem.
Precisando, estamos por aí.
Abraços
francis
 
Mensagens: 3
Registrado em: 24 Out 2006 16:12


Voltar para Visual Basic

Quem está online

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

x