Visual Basic com DB9/RS232-Ajuda!-RESOLVIDO

Israel

New member
Boa noite, tenho um programa em VB a comunicar com um micro, e consigo enviar dados com sucesso.
Para receber é que a história é outra.
Já cheguei a conseguir receber apenas um char e não recebia em string recebia em decimal e depois era preciso convertar pela tabela ascii, agora já deixei de conseguir receber outra vez[8b][8b]

O código que tenho para receber é este:

Dim buffer As String
buffer = SerialPort1.ReadExisting()
TextBox1.Text = buffer

O que acontece é que o programa basicamente bloqueia para receber e nunca mais sai do sitio:sh)
Não dá erros não faz mais nada.

O objectivo é receber uma string e mostra-la numa texbox.


Agradecia qualquer ajuda.
 
Última edição:
Não faço ideia do funcionamento desse sistema, mas acho estranho o resultado vir em string, normalmente essas coisas vêm em arrays de bytes.

Esse SerialPort1 é que tipo de classe e foi feito por quem? Dá para definir timeouts para a chamada? É possível pôr isso num try/catch para ver se dá alguma excepção?
 
Boa noite, tenho um programa em VB a comunicar com um micro, e consigo enviar dados com sucesso.
Para receber é que a história é outra.
Já cheguei a conseguir receber apenas um char e não recebia em string recebia em decimal e depois era preciso convertar pela tabela ascii, agora já deixei de conseguir receber outra vez[8b][8b]

O código que tenho para receber é este:

Dim buffer As String
buffer = SerialPort1.ReadExisting()
TextBox1.Text = buffer

O que acontece é que o programa basicamente bloqueia para receber e nunca mais sai do sitio:sh)
Não dá erros não faz mais nada.

O objectivo é receber uma string e mostra-la numa texbox.


Agradecia qualquer ajuda.

Queres receber a string na textbox? Mas tens a textbox para o buffer...há aqui algo que não estou a perceber na dúvida...
 
Última edição:
Fui eu que fiz a serial port1

Configuração:

If (SerialPort1.IsOpen = False) Then
SerialPort1.PortName = "COM1"
SerialPort1.RtsEnable = True
SerialPort1.DtrEnable = True
SerialPort1.Parity = 0
SerialPort1.BaudRate = 9600
SerialPort1.DataBits = 8
SerialPort1.StopBits = 2
SerialPort1.ReadTimeout = 10000000
SerialPort1.Open()
ElseIf (SerialPort1.IsOpen = True) Then
MsgBox("Porta já está connectada")
End If


Depois tenho a escrita para o micro:

If (SerialPort1.IsOpen = True) Then
SerialPort1.Write("a")

E funciona.
Neste caso basta enviar um char porque no micro recebendo um char eu consigo programar o que quero que aconteça.

Agora queria fazer a leitura e aqui preciso de receber strings.

If (SerialPort1.IsOpen = True) Then
SerialPort1.DiscardNull = True
valor = SerialPort1.ReadBufferSize
valor = SerialPort1.ReadExisting()
TextBox1.Text = valor

O valor está desclarado como string
Dim valor As String

Agora aqui reside a minha dúvida.

Eu se no micro fizer printf de uma letra apenas, eu recebo o código em asci correspondente a essa letra.
Se enviar uma string completa o programa basicamente deixa de responder, não crasha não dá erro, simplesmente bloqueia.:confused:

Além disso é estranho receber o código ascii de uma letra, porque eu no micro programei para já fazer a conversão e enviar já tudo em char.

Aliás no hyperterminal recebo tudo direito \n's e tudo.
 
Última edição:
E se enviares char a char? Do outro lado recebe a string inteira ou vai descartando os resultados anteriores?

printf("t");
printf("z");
ou printf("tz");

Se eu fizer isto basicamente o programa empanca, nem crasha não erros nada, fica parado e tenho de ir ao taskmanager fecha-lo.

se só fizer printf("t"); recebo o valor 116.

Que é o correspondente decimal na tabela ascii.

É que não consigo perceber..
 
printf("t");
printf("z");
ou printf("tz");

Se eu fizer isto basicamente o programa empanca, nem crasha não erros nada, fica parado e tenho de ir ao taskmanager fecha-lo.

se só fizer printf("t"); recebo o valor 116.

Que é o correspondente decimal na tabela ascii.

É que não consigo perceber..

E se fizeres Open e Close sempre que enviares um caracter? O SerialPort1 não tem nenhum método Flush()?
 
E se fizeres Open e Close sempre que enviares um caracter? O SerialPort1 não tem nenhum método Flush()?

o flush é através de serialport1.discardinbuffer();

Do
SerialPort1.Open()
SerialPort1.DiscardNull = True
valor = SerialPort1.ReadBufferSize
valor = SerialPort1.ReadExisting()
TextBox1.Text = valor
SerialPort1.DiscardInBuffer()
SerialPort1.Close()
Loop


Fiz o loop com o fecho e aberta e sem ele, é o mesmo comportamento bloqueia simplesmente:sh)[8b]
 
o flush é através de serialport1.discardinbuffer();

Do
SerialPort1.Open()
SerialPort1.DiscardNull = True
valor = SerialPort1.ReadBufferSize
valor = SerialPort1.ReadExisting()
TextBox1.Text = valor
SerialPort1.DiscardInBuffer()
SerialPort1.Close()
Loop


Fiz o loop com o fecho e aberta e sem ele, é o mesmo comportamento bloqueia simplesmente:sh)[8b]

Experimenta fazer um ciclo que pega nos caracteres de uma string um a um e os envia para o SerialPort1, fazendo open e close sempre que envias um caracter. Caso falhe é porque há aí algum problema ou com a implementação da classe SerialPort1 ou com o sistema de destino. Podes até experimentar fazer open e close sem enviar nada e veres se dá erro ou não.
 
Fechei o circuito á saída da porta série e foi até ele comunicar com ele próprio.
Depois experimentei com o micro, tá a 100%[kiss]

Obrigado karma
 
Voltar
Superior