Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #59 da revista programar. Faz já o download aqui!

emptiness

VB 2010 Express - Serial Port, Barras de progresso e keystrokes

Mensagens Recomendadas

emptiness    0
emptiness

Boa noite.

Este é o meu primeiro tópico "a sério" na comunidade. Começo por dizer que a minha experiência com Visual Basic não é assim muita, pelo que peço alguma paciência com as dúvidas que tenho, já que pesquiso sempre antes de criar um novo tópico.

Tenho várias dúvidas num projecto que estou a criar. Vou enumerá-las, mas não espero (nem quero  ;)) que me resolvam. Basta assim um empurrãozinho. Algo que me ajude a compreender.

O meu programa, de um modo muito sintético, consiste em ler uma porta série, alterar algumas barras de progresso (em função de três linhas, contendo cada uma delas um valor numérico) e mediante cada um desses valores gerar um keystroke, sendo que o tempo do mesmo varia em função do valor recebido), keystroke esse que tem como destino um processo diferente do programa que estou a criar.

Os dados recebidos são enviados por um microcontrolador (cuja ligação ao computador não sei ainda se é Serial ou USB, depende do modelo que escolher). A taxa de transferência de dados é, à partida, baixa, 19200bps.

Já pesquisei muito. Uma dificuldade que tive, muito grande, logo ao inicio, foi ler os dados da porta (como que se fosse um terminal) e apresentar as leituras numa rich text box. O resultado foi satisfatório, mas não o desejado. Alguns valores, ocasionalmente (não digo que seja periódico mas certas vezes verifico isso como no momento seguinte a periodicidade é dispare).

Se os valores enviados fossem constantes, por exemplo, tendo a primeira linha com o valor de 1233, a segunda com 291 e a terceira com  83, o que ia ser apresentado na caixa de texto seria:

1233
291
93
1233
291
93
1233
291
93
1233
2          <--
93
1233
291
93
            <--
291
93

O objectivo seria manter sempre 3 linhas na caixa de texto e estas alterarem conforme os dados recebidos. Se fizer isto, no entanto, é como se visse linhas a piscar, com falta de dados, e outras sempre com a mesma cor (entenda-se, como os dados não mudam as linhas também não mudam, mas algumas desaparecem parcial ou integramente).

Li algures que havia problemas com a comunicação serial no VB 2010 Express. Consigo ler correctamente, se usar outros programas para ler dados de portas série.

Deste modo:

1º - O que posso fazer para solucionar este problema? Terá algo que ver com buffers?

O meu objectivo era que as linhas na caixa de texto se "actualizassem": os valores recebidos tomassem o lugar dos prévios. Nem preciso que a caixa de texto esteja lá. O meu objectivo é definir 3 variáveis, cada uma delas correspondente a uma linha.

Comecei com a caixa de texto porque achava que algo do género ReadLine me levava lá mais facilmente. Agora não sei bem...

Posto isto:

2º - Como procedo para atribuir a cada variável o valor de uma linha, se é que a posso chamar assim?

Esses valores seriam "mapeados" dando origem a valores para novos (por mapeados quero dizer que lhes faria algo como uma regra de três simples - se um valor tem x de máximo e eu sei o valor actual e sei o valor máximo que quero que o valor tome, descubro o actual). Neste caso, iria mapear os valores entre 0 e 100, para actualizar varias barras de progresso, cada uma em função dos valores lidos. Queria que as barras se alterassem (no que toca a progresso) conforme a variação dos dados recebidos - isto sem que tivesse de clicar nalgum botão. Algo automático, como se vê numa janela de progresso aquando da cópia de um ficheiro. Não preciso que a actualização das barras ocorra quando o programa está minimizado - basta apenas que o faça quando o focus reside sobre a janela.

Ou seja:

3º - Como faço para que para que cada ProgressBar se actualize à medida que os valores lidos se alterem?

Esses valores de 0 a 100... Imaginem que cada um deles tem um objectivo diferente. Imagine se que a variavel x toma o valor 79 (compreendido entre 0 e 100). Quero que uma tecla, o A, por exemplo, fique "pressionada" 79/100 das vezes.

Não sei quem é que daqui já terá trabalhado com a plataforma Arduino. Há uns meses usei uma das placas de um amigo meu e achei curiosa a parte da PWM, que podia ser utilizada para diminuir a luminosidade de um LED (não diminuía a luminosidade mas sim o tempo que este estava aceso que dava a ideia aos olhos da luminosidade). É algo assim que desejo. Uma tecla que seja pressionada digamos, como se PWM se tratasse. 

Por fim, como faço isso acima?

De manhã irei postar o código que já fiz até agora, visto que o mesmo está muito sujo, visto que inclui códigos de pesquisas no google que não funcionaram e comentei, etc.

Cumprimentos,

Nuno Garcia

Imports System
Imports System.IO
Imports System.ComponentModel
Imports System.Threading
Imports System.IO.Ports
Imports System.Windows.Forms.ComboBox.ObjectCollection
Imports System.Windows.Forms.SendKeys
Delegate Sub SetTextCallback(ByVal [text] As String)





Public Class Form1
    Public port
    Public CDStatus = 0
    Public ADC_Angulo As String
    Public ADC_Forward As String
    Public ADC_Backward As String
    Public boi As String



    Private Sub BUTTON_Refresh_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BUTTON_Refresh.Click
        ' If (SerialPort2.IsOpen & SerialPort2.PortName) Or (SerialPort2.IsOpen = False) Then
        'SerialPort2.Close()
        'End If
        COMBOBOX_Port.Items.Clear()
        COMBOBOX_Port.ResetText()
        If Not COMBOBOX_Port.Items.Contains("Não conectado...") Then
            port = IO.Ports.SerialPort.GetPortNames()
        End If
        COMBOBOX_Port.Items.Add("Não conectado...")

        For i = 0 To UBound(port)
            COMBOBOX_Port.Items.Clear()
            COMBOBOX_Port.ResetText()
            COMBOBOX_Port.Items.Add(port(i))
        Next
        If COMBOBOX_Port.Items.Count > 0 Then
            COMBOBOX_Port.Text = COMBOBOX_Port.Items.Item(0)
        End If

        If COMBOBOX_Port.Items.Count = 0 Then
            COMBOBOX_Port.Items.Add("Não conectado...")
        End If
    End Sub




    Private Sub COMBOBOX_Port_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles COMBOBOX_Port.SelectedIndexChanged

    End Sub


    Private Sub LABEL_1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LABEL_1.Click

    End Sub

    Private Sub BUTTON_Connect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BUTTON_Connect.Click

        If Not COMBOBOX_Port.Items.Contains("Não conectado...") Then
            If Not SerialPort2.IsOpen Then
                SerialPort2.PortName = COMBOBOX_Port.SelectedItem
                SerialPort2.BaudRate = 19200
                SerialPort2.Parity = IO.Ports.Parity.None
                SerialPort2.StopBits = IO.Ports.StopBits.One
                SerialPort2.DataBits = 8
                SerialPort2.Open()
            End If
        Else
            MsgBox("Selecciona uma porta.", vbInformation)
        End If
    End Sub

    Private Sub BUTTON_Disconnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)

        If SerialPort2.IsOpen() Then
            SerialPort2.Close()
        End If

    End Sub
    Private Sub SerialPort2_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles SerialPort2.DataReceived
        ReceivedText(SerialPort2.ReadExisting())    'Automatically called every time a data is received at the serialPort
    End Sub
    Private Sub ReceivedText(ByVal [text] As String)
        'compares the ID of the creating Thread to the ID of the calling Thread
        If Me.rtbReceived.InvokeRequired Then
            Dim x As New SetTextCallback(AddressOf ReceivedText)
            Me.Invoke(x, New Object() {(text)})
        Else
            Me.rtbReceived.Text = [text]
        End If

    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        rtbReceived.Clear()
    End Sub
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
        Dim file = Text
        Dim reader As StreamReader = New StreamReader(file)
        For i = 0 To 0
            TextBox1.Text = reader.ReadLine
        Next

        For i = 0 To 1
            TextBox2.Text = reader.ReadLine
        Next
    End Sub

    Private Function StreamReader(ByVal file As SerialPort) As StreamReader
        Throw New NotImplementedException
    End Function

End Class

Public Class SendKeys

End Class

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
acao    20
acao

boas

não se isto vai ajudar mas aí vai:

2º - Como procedo para atribuir a cada variável o valor de uma linha, se é que a posso chamar assim?

poderás colocar para cada linha 1 textbox

 variavel = textBox1.text 

3º - Como faço para que para que cada ProgressBar se actualize à medida que os valores lidos se alterem?

http://www.macoratti.net/vbn_pb1.htm

 ProgressBar1.Value = «valor numérico» 

para actualizar colocas a variavel actualizada no «valor numérico»

espero ter ajudado alguma coisa

cumps

acao

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.