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