collapse

* Posts Recentes

Amplificador - Rockboard HA 1 In-Ear por almamater
[27 de Março de 2024, 19:13]


O que é isto ? por KammutierSpule
[26 de Março de 2024, 19:35]


Bateria - Portátil por almamater
[25 de Março de 2024, 22:14]


Emulador NES em ESP32 por dropes
[13 de Março de 2024, 21:19]


Escolher Osciloscópio por jm_araujo
[06 de Fevereiro de 2024, 23:07]


TP4056 - Dúvida por dropes
[31 de Janeiro de 2024, 14:13]


Leitura de dados por Porta Serie por jm_araujo
[22 de Janeiro de 2024, 14:00]


Distancia Cabo por jm_araujo
[08 de Janeiro de 2024, 16:30]


Meu novo robô por josecarlos
[06 de Janeiro de 2024, 16:46]


Laser Engraver - Alguém tem? por almamater
[16 de Dezembro de 2023, 14:23]

Autor Tópico: Arduino SerialPort  (Lida 11513 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline Cynary

  • Mini Robot
  • *
  • Mensagens: 182
Re: Arduino SerialPort
« Responder #15 em: 06 de Agosto de 2010, 04:36 »
Hum, isso devia ter funcionado ... só se houver algum problema com a forma como a função Serial.write está a processar o número :S E em vez de o processar como um valor de um byte, transforma numa string (o que, sinceramente, acho uma grande estupidez xD).
De qualquer forma, aconselho-te então a usar ou a função que te mostrei: http://lusorobotica.com/index.php?topic=2633.0
Ou então, guarda o número numa string, e usa o atoi (vai dar ao mesmo xD). De qualquer forma, tens de enviar um carácter de fim de número.
Por exemplo, alterar o código que mostraste, de forma a mandar um número, terminado de S (ps: não precisas de dois if(comm==103), por isso tomei a liberdade de tirar o segundo :P):

Código: (vb) [Seleccione]
  Public Function Send(ByVal txtMsg As String) As Boolean
        Try

          ' // txtMsg += vbCrLf
            serialPort.Write(txtMsg)
            Return True
        Catch ex As Exception
            Return False
        End Try
    End Function

Código: (c) [Seleccione]
   
byte com;            //lê string recebido
byte Posicao;       //saber a posição na eeprom
byte ValorExtra;   //para gravar valor na eeprom

int ValorEeprom;  //para ler valor de eeprom


void loop()
{

  if (Serial.available() > 0)
  {

com = Serial.read();
  delay(50);   
 
  if (com== 103){     //se receber a letra "g"
  Posicao= Serial.read();     
  delay(50);   
  ValorExtra= Serial.read();
   delay(50);   
     }


 if (com== 103){                       // letra "g"     
   
   if (Posicao== 97){                  // letra "a"
   EEPROM.write(0,ValorExtra);
      Serial.print("VALOR 1 GUARDADO: ");
   Serial.println(EEPROM.read(0));
   delay(100);
 
   }
     if (Posicao== 98) { // letra "b"
   EEPROM.write(1,ValorExtra);
      Serial.print("VALOR 2 GUARDADO: ");
   Serial.println(EEPROM.read(1));
   delay(100);
   }

etc.
long getnumber(char stop_character) {
  int cs;
  long i = 0;
  while(1) {
    while(!Serial.available())
      delay(100); // Verifica a cada 100 ms -- para não esforçar demais o CPU -- se recebeu dados
    cs = Serial.read();
    if(stop_character == (char)cs) break; // Recebe os dados e compara-os com o carácter de paragem. Se for igual, pára de receber dados.
    if(cs < '0' || cs > '9') continue; // Se não for um dígito ignoramos
    i *= 10;
    i += (cs-'0'); } // O número resultado avança uma casa decimal para cima, e adiciona o dígito lido (para obter o dígito decimal a partir do caracter, basta subtrair o caracter '0'.
  return i; }
Código: (vb) [Seleccione]
clsSerial.Send("ga145S")                  '//Usa a função SEND para enviar as letras "g" e "a"           [ciclo gravar e na posição/IF  'a'] e o número 145 (letra S usada para terminar o número)
Atenção, como a variável usada para guardar o número recebido é um byte, só suporta entre 0 e 255, apesar de poderes enviar números maiores para a função getnumber, apenas os primeiros 8 bits serão usados.

Prefiro usar uma função como a que mostrei aqui, em vez do atoi, pois o atoi obrigaria a usar processamento e armazenamento extra: receber a string por serial, guardá-la, e depois passá-la para o atoi processá-la carácter a carácter. Assim, processamos cada byte do serial logo.

Ou fazes isto, ou então fazes o que provavelmente é o melhor: estuda melhor o VB, e vê se percebes porque é que o teu byte 145 está a ser convertido para uma string, e como podes evitar isso. Ou então muda de linguagem :P, para uma em que isso não acontece sem tu saberes ...
« Última modificação: 06 de Agosto de 2010, 04:42 por Cynary »

Offline almamater

  • Mini Robot
  • *
  • Mensagens: 1.918
    • GrcByte - Projectos
Re: Arduino SerialPort
« Responder #16 em: 06 de Agosto de 2010, 19:14 »
Humm ok! Tenho pensar adoptar o C# / c.net  ;D

Obrigado pela paciência antes de mais!

Acho que não foram publicadas as alterações referidas na parte do com= serial.read (), tenho apenas de colocar desta forma com = getnumber('S'); certo?
Código: [Seleccione]
void loop()
{   
com = getnumber('S');
  delay(50);   
 
  if (com== 103){
  Posicao= Serial.read();
  delay(50);   
  ValorExtra= Serial.read();
     }
   
 

           
     //GRAVAR VALORES EEPROM:   
   
   if (Posicao== 97){                  // letra "a"
   EEPROM.write(0,ValorExtra);
      Serial.print("VALOR 1 GUARDADO: ");
   Serial.println(EEPROM.read(0));
   delay(100);
 
   }
     if (Posicao== 98) { // letra "b"
   EEPROM.write(1,ValorExtra);
      Serial.print("VALOR 2 GUARDADO: ");
   Serial.println(EEPROM.read(1));
   delay(100);
   }

etc

}

long getnumber(char stop_character) {
  int cs;
  long i = 0;
  while(1) {
    while(!Serial.available())
      delay(100); // Verifica a cada 100 ms -- para não esforçar demais o CPU -- se recebeu dados
    cs = Serial.read();
    if(stop_character == (char)cs) break; // Recebe os dados e compara-os com o carácter de paragem. Se for igual, pára de receber dados.
    if(cs < '0' || cs > '9') continue; // Se não for um dígito ignoramos
    i *= 10;
    i += (cs-'0'); } // O número resultado avança uma casa decimal para cima, e adiciona o dígito lido (para obter o dígito decimal a partir do caracter, basta subtrair o caracter '0'.
  return i; }
« Última modificação: 06 de Agosto de 2010, 19:17 por almamater »

Offline Cynary

  • Mini Robot
  • *
  • Mensagens: 182
Re: Arduino SerialPort
« Responder #17 em: 06 de Agosto de 2010, 20:10 »
Humm ok! Tenho pensar adoptar o C# / c.net  ;D

Obrigado pela paciência antes de mais!

Acho que não foram publicadas as alterações referidas na parte do com= serial.read (), tenho apenas de colocar desta forma com = getnumber('S'); certo?
Código: [Seleccione]
void loop()
{   
com = getnumber('S');
  delay(50);   
 
  if (com== 103){
  Posicao= Serial.read();
  delay(50);   
  ValorExtra= Serial.read();
     }
   
 

           
     //GRAVAR VALORES EEPROM:   
   
   if (Posicao== 97){                  // letra "a"
   EEPROM.write(0,ValorExtra);
      Serial.print("VALOR 1 GUARDADO: ");
   Serial.println(EEPROM.read(0));
   delay(100);
 
   }
     if (Posicao== 98) { // letra "b"
   EEPROM.write(1,ValorExtra);
      Serial.print("VALOR 2 GUARDADO: ");
   Serial.println(EEPROM.read(1));
   delay(100);
   }

etc

}

long getnumber(char stop_character) {
  int cs;
  long i = 0;
  while(1) {
    while(!Serial.available())
      delay(100); // Verifica a cada 100 ms -- para não esforçar demais o CPU -- se recebeu dados
    cs = Serial.read();
    if(stop_character == (char)cs) break; // Recebe os dados e compara-os com o carácter de paragem. Se for igual, pára de receber dados.
    if(cs < '0' || cs > '9') continue; // Se não for um dígito ignoramos
    i *= 10;
    i += (cs-'0'); } // O número resultado avança uma casa decimal para cima, e adiciona o dígito lido (para obter o dígito decimal a partir do caracter, basta subtrair o caracter '0'.
  return i; }

Não alteres o que disseste que alteravas xD
O com serve para receberes letras, ou seja, lê carácter a carácter do serial, normalmente. O getnumber('S') lê todos os dígitos do serial (ignorando assim as letras 'g' e 'a'), até chegar à letra 'S'. Logo, tens inicialmente de ler o 'g' (para saberes que vais receber o número) e o 'a' (para saberes onde guardar) através do serial.read(). Depois é que lês o número :P

PS: Não conheço o C# por isso não posso comentar. No entanto, recomendaria que tentasses aprender uma linguagem diferente e universal (no sentido de ser suportada por vários sistemas operativos), como python, perl, C/C++ ou java (recomendo mais o C/C++, pois se vais fazer projectos com o arduino, ou mesmo outros microcontroladores, provavelmente vais usar essa linguagem, por isso é importante que compreendas bem o seu sintaxe/funcionalidade).
« Última modificação: 06 de Agosto de 2010, 20:18 por Cynary »

Offline almamater

  • Mini Robot
  • *
  • Mensagens: 1.918
    • GrcByte - Projectos
Re: Arduino SerialPort
« Responder #18 em: 07 de Agosto de 2010, 17:40 »
 :D

Muito obrigado a todos pela ajuda! em especial ao Cynary que nesta fase final não estava mesmo a perceber o porquê de não chegar um inteiro ao Arduino mas com a função Getnumber é uma maravilha!!  ;)

Obrigado!

Offline almamater

  • Mini Robot
  • *
  • Mensagens: 1.918
    • GrcByte - Projectos
Re: Arduino SerialPort
« Responder #19 em: 14 de Abril de 2011, 12:18 »
Bom, aproveitando este tópico pq o assunto é o mesmo.. e fui eu que o criei  :P



Estive ontem a testar a ligação com o Arduino em VB .net com o Firmata e funcionou bem, a ligação é estabelecida sem problemas e fica logo 'sincronizado'  com a aplicação, com os exemplos que disponibilizam (http://firmata.org/wiki/Main_Page) consigo ligar/desligar os pinos e obter valores analógicos.

Eu estava a pensar em monitorizar sensores (temperatura / distância / etc) numa aplicação, acho que a melhor forma é o Arduino obter o valor do sensor e calcular o resultado e enviar o mesmo para a aplicação (serial).. com o Firmata não percebi ainda muito bem como enviar/receber strings..

Como costumam fazer? a minha alternativa ao Firmata é estabelecer uma ligação série normal e ler/filtrar tudo o que chega vindo do Arduino..