ajuda Arduino + VB.net (finalizar recebimento de variável)

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

Há algo que me espanta solenemente...

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

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.

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?

é 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.

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.

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; 
}

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

hj a noite vou testar...

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

Muito obrigado

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

neuron_upheaval:
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! ^^