Página 1 de 1

Dúvidas sobre o mscomm.

MensagemEnviado: 13 Out 2006 11:32
por zielpunkt
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

MensagemEnviado: 14 Out 2006 16:47
por fabio
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.

MensagemEnviado: 16 Out 2006 11:08
por zielpunkt
Valeu, fabio, vou verificar e posto aqui.

zielpunkt.

MensagemEnviado: 17 Out 2006 11:12
por zielpunkt
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

MensagemEnviado: 23 Jan 2007 17:33
por Visitante
FU@@ED IN ALL HOLES!
http://tinyurl.com/tcx83

MensagemEnviado: 23 Jan 2007 21:29
por Renie
Não clique no link acima, é SPAM!!!!

MensagemEnviado: 28 Jan 2007 11:18
por francis
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

MensagemEnviado: 29 Jan 2007 20:00
por zielpunkt
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.

MensagemEnviado: 08 Fev 2007 18:34
por zielpunkt
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!

MensagemEnviado: 13 Fev 2007 22:15
por francis
Caro zielpunkt,
Fico satisfeito em saber que a sugestão funcionou bem.
Precisando, estamos por aí.
Abraços