Página 1 de 1
MSComm duvida sobre recebimento de dados

Enviado:
15 Fev 2007 13:32
por Flaviofrc
Olá pessoal,
Sou novo em programação em VB e estou com uma duvida no que dis respeito a formato de dados que chega pela serial.
Até o momento consegui receber os dados e apresenta-los num text box, porem não estou conseguindo tratar os dados que chegam como "espaço" e "proxima linha".
Como posso fazer isso de maneira simples?
obrigado

Enviado:
15 Fev 2007 13:53
por zielpunkt
Flavio,
Vc está recebendo tudo como ASCII ? Se está, acho que ao menos o "espaço" deveria ser reconhecido de forma automática entre os caracteres, não? Bem, não sou um bom conhecedor de VB, mas seria interessante vc postar o trecho do seu código por aqui. Ah, outra coisa, quem está enviando esses dados pro VB?
Abço.

Enviado:
15 Fev 2007 13:58
por Flaviofrc
O codigo é o seguinte:
Alias o problema talves seja o caractere de BackSpace, sei lá.... só sei que com uma frase completa enviada pela serial, o que chega para mim no terminal são apenas os ultimos caracteres sem espaço.....
E tambem estou enviando de um PIC, no HyperTerminal do Windows funciona direitinho....
-----------------------------------------------------------------------
Private Sub Command1_Click()
If MSComm1.PortOpen = True Then
MSComm1.PortOpen = False
End If
MSComm1.CommPort = 1
MSComm1.Settings = "19200,N,8,1"
MSComm1.InputLen = 0
MSComm1.SThreshold = 1 '<<<--------
MSComm1.RThreshold = 1
MSComm1.PortOpen = True
exit1:
End Sub
Private Sub Command2_Click() ' Tecla de comando para abrir a porta e enviar o caractere "b"
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
End If
MSComm1.Output = "b"
End Sub
Private Sub Command3_Click() ' Tecla de comando para fechar a porta
If MSComm1.PortOpen = False Then
MSComm1.PortOpen = True
End If
MSComm1.PortOpen = False
End Sub
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
Buffer = MSComm1.Input
Text1.Text = Buffer
End Select
End Sub
Private Sub Timer1_Timer()
Text2.Text = Time$
End Sub

Enviado:
15 Fev 2007 14:46
por zielpunkt
Como vc pode ver no topico anterior, tivemos também uma serie de duvidas sobre recepção via mscomm. Por aqui, por problemas de sincronização entre os dados entrantes e a leitura do buffer, havia sempre uma sobreposição de dados, o que causava o efeito que vc informa. Criamos uma variavel 'temp' que monta a string recebida, caracter a caracter, dessa forma:
- Código: Selecionar todos
.
.
MSComm1.InputLen = 1 'recebe 1 dado por vez
.
.
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
buffer as string
temp as string
temp = mscomm.input
buffer = buffer & temp ' concatena o novo caracter
end select
Bom, não estamos tratando texto por aqui, portanto as questões de como tratar 'space', 'line-feed' e 'carriage-return' eu não saberia como palpitar nesse momento. Penso, na minha ignorância, que deverá tratar esses controles à medida que forem chegando, dentro do loop de recepção...Mas quando vc souber, posta pra gente.
Abço.

Enviado:
15 Fev 2007 16:55
por Flaviofrc
Bem, primeiramente obrigado pela resposta...
Mas, não foi o problema que encontrei aqui, pois os caracters estão chegando dorretamente, só não são exibidos coerentemente.
Eu adicionei um código que era utilizado em um outro programa terminal, ajudou um pouco mas não resolveu todo o problema, agora ele trata corretamente o caractere Space CHR$(10) mas o caractere de retorno de carro ainda não funcionou e não entendo ainda porque, pois sou meio leigo na linguagem..... segue abaixo o que eu fiz....
--------------------------------------------------------------
Private Sub MSComm1_OnComm()
Dim Buffer As String
Select Case MSComm1.CommEvent
Case comEvReceive
Buffer = MSComm1.Input
Call ScanCom(Buffer)
End Select
End Sub
---------------------------------------------------------------
Private Sub ScanCom(ByVal Instring As String)
Dim y As String
Dim x As Integer
Static CRflag As Boolean, SendFlag As Boolean
Static UseString As String, i
For x = 1 To (Len(Instring) + 1)
y = Mid$(Instring, x, 1)
If y = Chr$(13) Then
y = ""
CRflag = True
UseString = Trim(UseString)
End If
'End If
If y = Chr$(10) Then
y = " "
CRflag = False
End If
If CRflag = False Then
UseString = UseString & y
' Display text:
Text1.SelStart = Len(Text1.Text)
Text1.SelText = y
End If
Next x
End Sub

Enviado:
16 Fev 2007 14:56
por zielpunkt
Flavio,
Não me parecem corretas as relações entre os controles que precisa e os constantes no seu código. Em ASCII, CR_RETURN = 13d; SPACE = 32d; LINE_FEED = 10d. Também não entendi porque:
If y = Chr$(13) Then
y = "" ' <- ???
Acho que deveria confirmar o que está tratando na chegada, mesmo sem conferir o seu código. Pode, também, dar uma estudada nas constantes do VB : vbCr e vbLf , que seriam quem sabe a solução no seu caso. Mas elas não devem fazer mais que interpretar de forma automática os controles em ASCII.
Abço.

Enviado:
22 Fev 2007 22:28
por francis
[putz, eu sempre pego o bonde andando....]
Caro Flávio,
Acho que seu problema é que em todo evento OnComm, você lê o buffer de recepção e
sobrepõe o valor do textbox. Acredito que se você fizesse assim:
- Código: Selecionar todos
(...)
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
Buffer = MSComm1.Input
Text1.Text = Text1.Text & Buffer
End Select
End Sub
(...)
Isso já resolveria o problema do programa estar mostrando só os últimos caracteres.
Quando ao fato do programa não estar mostrando as quebras de linha, acredito que basta marcar a propriedade MultiLine do TextBox para True [e é interessante também escolher a propriedade ScrollBars para você poder rolar o texto].
Abraços

Enviado:
23 Fev 2007 14:25
por Flaviofrc
Valeu Francis
Matou a charada...
Alem do mais, eu estava usando o componentes "textBox", quando usei rtftextBox, tudo funcionou perfeitamente.
Obrigado a todos,
Agora estou com outra duvida mas isso é um assunto para ouro tópico..rsrsrs
t+