MSComm duvida sobre recebimento de dados

Programação Visual Basic

Moderadores: 51, guest2003

MSComm duvida sobre recebimento de dados

Mensagempor Flaviofrc » 15 Fev 2007 13:32

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
Flavio
Flaviofrc
Byte
 
Mensagens: 111
Registrado em: 16 Out 2006 17:32
Localização: São Paulo

Mensagempor zielpunkt » 15 Fev 2007 13:53

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.
"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 Flaviofrc » 15 Fev 2007 13:58

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
Flavio
Flaviofrc
Byte
 
Mensagens: 111
Registrado em: 16 Out 2006 17:32
Localização: São Paulo

Mensagempor zielpunkt » 15 Fev 2007 14:46

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.
"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 Flaviofrc » 15 Fev 2007 16:55

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
Flavio
Flaviofrc
Byte
 
Mensagens: 111
Registrado em: 16 Out 2006 17:32
Localização: São Paulo

Mensagempor zielpunkt » 16 Fev 2007 14:56

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.
"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 » 22 Fev 2007 22:28

[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
francis
 
Mensagens: 3
Registrado em: 24 Out 2006 16:12

Mensagempor Flaviofrc » 23 Fev 2007 14:25

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+
Flavio
Flaviofrc
Byte
 
Mensagens: 111
Registrado em: 16 Out 2006 17:32
Localização: São Paulo


Voltar para Visual Basic

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 0 visitantes

x