Página 1 de 1
Dúvidas sobre o mscomm.

Enviado:
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

Enviado:
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.

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

Enviado:
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

Enviado:
23 Jan 2007 17:33
por Visitante

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

Enviado:
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
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

Enviado:
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

. 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.

Enviado:
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!

Enviado:
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