Pages: [1]   Go Down
Author Topic: ajuda Arduino + VB.net (finalizar recebimento de variável)  (Read 1672 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3097
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Há algo que me espanta solenemente...

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

Code:
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:

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?
Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

'round the world...
Offline Offline
Faraday Member
**
Karma: 41
Posts: 3097
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:

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

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

central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 24
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hj a noite vou testar...

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

Muito obrigado
Logged

central nervous system
Offline Offline
Full Member
***
Karma: 0
Posts: 135
Causing havoc inside your brain since 1980
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Logged

Offline Offline
God Member
*****
Karma: 12
Posts: 508
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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! ^^
Logged

Pages: [1]   Go Up
Jump to: