Go Down

Topic: ajuda Arduino + VB.net (finalizar recebimento de variável) (Read 2103 times) previous topic - next topic

phalgus

Estou fazendo um programa em VB 2008 que ira se comunicar com o arduino.

O programa envia pela serial o valor "A", e o arduino quando ler essa mensagem pela serial envia de volta um valor numérico. E isso acontece com outras 2 variáveis(total de 3 variáveis) .

Isso deve acontecer 1 vez a cada segundo.

SerialPort1.Write("a") ' envia o pedido
Dim b As String = SerialPort1.ReadExisting() 'le a resposta
System.Threading.Thread.Sleep(333)

SerialPort1.Write("b") ' envia o pedido
Dim b As String = SerialPort1.ReadExisting() 'le a resposta
System.Threading.Thread.Sleep(333)

SerialPort1.Write("c") ' envia o pedido
Dim c As String = SerialPort1.ReadExisting() 'le a resposta
System.Threading.Thread.Sleep(333)

O meu problema é que as vezes as variáveis estão se misturando. Gostaria de saber se existe alguma forma de colocar uma verificação?

Tipo so sera enviada a string "b" para o arduino depois o VB receber um sinal "x".

Vixi ... espero ter conseguido explicar o que eu estou tentando fazer. Qual quer ajuda é bem vinda.

Grato

bubulindo

Há algo que me espanta solenemente...

Temos aqui alguém que mete um bocado de código com isto:

Code: [Select]
System.Threading.Thread.Sleep(333) //a propósito tens aqui um erro...

E depois não sabe fazer um switch on um encadeamento de ifs.

Code: [Select]


char var = Serial.read();

switch (var) {
    case 'A':
        SerialPort.Write("a") ' envia o pedido
        //Dim b As String = SerialPort1.ReadExisting() 'le a resposta //ISTO NÃO É C...
        break;
    case 'B':
        SerialPort.Write("b") ' envia o pedido
     
        break;
    case 'C':
        SerialPort.Write("C") ' envia o pedido
     
        break;
}


Não percebi para que é tanta interacção com o computador. Queres explicar um pouco mais da aplicação?
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

phalgus

é um sistema simples de supervisório.

no arduino estará ligado 3 sensores (sensor K, J, PT100)

e um programa em VB ira gerar gráficos e um log com a leitura desses sensores.

a leitura deve ser atualizada a cada 1 segundo.


phalgus

minha ideia inicial seria:

o PC envia o pedido para a variável A  e espera por um certo tempo por essa resposta.
depois ele faz o mesmo com as outras 2 variáveis.

bubulindo

Code: [Select]


int sensorA = 0, sensorB = 0, sensorC = 0;


char var = Serial.read();

switch (var) {
    case 'A':
        Serial.Print("a");
        sensorA=analogRead(PINOA);
        Serial.Print(sensorA);
        Serial.Println("end");
        break;
    case 'B':
        SerialPort.Write("b") ' envia o pedido
        sensorB=analogRead(PINOB);
        Serial.Print(sensorB);
        Serial.Println("end");
        break;
    case 'C':
        SerialPort.Write("C") ' envia o pedido
        sensorC=analogRead(PINOC);
        Serial.Print(sensorC);
        Serial.Println("end");
        break;
}
Eu não sou o teu criado. Se respondo no fórum é para ajudar todos mediante a minha disponibilidade e disposição. Responder por mensagem pessoal iria contra o propósito do fórum e por isso evito-o.
Se realmente pretendes que eu te ajude por mensagem pessoal, então podemos chegar a um acordo e contrato onde me pagas pela ajuda que eu fornecer e poderás então definir os termos de confidencialidade do meu serviço. De forma contrária toda e qualquer ajuda que eu der tem de ser visível a todos os participantes do fórum (será boa ideia, veres o significado da palavra fórum).
Nota também que eu não me responsabilizo por parvoíces escritas neste espaço pelo que se vais seguir algo dito por mim, entende que o farás por tua conta e risco.

Dito isto, mensagens pessoais só se forem pessoais, ou seja, se já interagimos de alguma forma no passado ou se me pretendes convidar para uma churrascada com cerveja (paga por ti, obviamente).

neuron_upheaval

O problema não está no Arduino, mas sim no PC, já que a conexão serial é assíncrona.

O SerialPort.ReadExisting() funciona muito mal

No lugar disso, é melhor usar o evento SerialPort.DataReceived

[]s

nu

phalgus

hj a noite vou testar...

mais acredito que isso resolvera o meu problema tinha certeza que era algo do tipo...

Muito obrigado

neuron_upheaval

Use também o SerialPort.BytesToRead, porque pode ser que venha uma rajada de bytes da serial, em vez de um byte por vez

Coloque todo mundo que chegar da serial em um buffer

Quando enviar algo para o Arduino, sinalize para um System.Threading.AutoResetEvent que também esteja dentro do evento SerialPort.DataReceived, como uma forma de sincronizar as operações de envio e espera de dados

[]s

nu


Mortis


O SerialPort.ReadExisting() funciona muito mal


Concordo com o neuron, já tive problemas com o SerialPort.ReadExisting() também. =/

Usando SerialPort.BytesToRead e chamando o comando somente após o caractere de finalização (exemplo a quebra de linha) você não terá maiores problemas ^^

E por garantia eu sempre faço o retorno PC->Arduino <-> Arguino->PC para ter certeza de que tudo correu bem. Uso um modulo bluetooth e após uma certa distância ele começa a falhar rs

Diga se funcionou! ^^

Go Up