spacer.png, 0 kB

Torna indietro   Roboitalia.com - Il primo portale in Italia sulla robotica amatoriale > Robotica di base > Arduino

Rispondi
 
Strumenti discussione Modalità  visualizzazioe
  #1  
Vecchio 17-06-2013, 16.15.37
Pocho Pocho non è collegato
Nuovo robottaro
 
Data registrazione: 11-12-2012
Residenza: Milano
Messaggi: 13
Potenza reputazione: 0
Pocho E' per ora ancora un mistero
Predefinito error: expected constructor, destructor, or type conversion before '.' token

Compilando con l'IDE di Arduino mi restituisce un errore su queste tipo di righe:

activateAutomaticMode.commandCode="00";

mi dice:

error: expected constructor, destructor, or type conversion before '.' token

scrivo il pezzo di codice che riguarda le istruzioni precedenti:

Codice:
 
typedef void (*serialFunction)(char *argument); 
typedef struct serialCommand{
 char commandCode[COMMAND_CODE_LEN];
 char commandArgument[COMMAND_ARGUMENT_LEN];
 serialFunction callback;
};
.
.
.
.
.
serialCommand activateAutomaticMode;
activateAutomaticMode.commandCode="00";
activateAutomaticMode.commandArgument="0000";
activateAutomaticMode.callback=callback_activateAutomaticMode;
Rispondi citando
  #2  
Vecchio 17-06-2013, 16.22.51
L'avatar di matty
matty matty non è collegato
Robottaro sostenitore
 
Data registrazione: 15-05-2004
Residenza: Verona Treviso, Italy
Messaggi: 822
Potenza reputazione: 118
matty La sua reputazione è oltre la sua famamatty La sua reputazione è oltre la sua fama
Predefinito

Hai incluso il codice dentro la funzione main?
__________________
Robot Golem project: www.robot-golem.org
Rispondi citando
  #3  
Vecchio 17-06-2013, 16.46.59
Pocho Pocho non è collegato
Nuovo robottaro
 
Data registrazione: 11-12-2012
Residenza: Milano
Messaggi: 13
Potenza reputazione: 0
Pocho E' per ora ancora un mistero
Predefinito

No, non ho una main.
Rispondi citando
  #4  
Vecchio 17-06-2013, 16.49.03
L'avatar di Caronte
Caronte Caronte non è collegato
Administrator
 
Data registrazione: 15-10-2009
Residenza: Ferrara
Età : 53
Messaggi: 2,962
Potenza reputazione: 346
Caronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua fama
Predefinito

Non so che libreria usi ma dice che ci vuole un punto.

Prova a sostituire con:

Codice:
serialCommand.activateAutomaticMode;

Antonio
Rispondi citando
  #5  
Vecchio 17-06-2013, 17.19.32
L'avatar di matty
matty matty non è collegato
Robottaro sostenitore
 
Data registrazione: 15-05-2004
Residenza: Verona Treviso, Italy
Messaggi: 822
Potenza reputazione: 118
matty La sua reputazione è oltre la sua famamatty La sua reputazione è oltre la sua fama
Predefinito

Tutto il codice c/c++ dovrebbe partire da una funzione main.
E' possibile vedere tutto il codice? E' difficile aiutarti vedendo solo qualche riga, anche il contesto è importante
__________________
Robot Golem project: www.robot-golem.org
Rispondi citando
  #6  
Vecchio 17-06-2013, 19.00.09
Pocho Pocho non è collegato
Nuovo robottaro
 
Data registrazione: 11-12-2012
Residenza: Milano
Messaggi: 13
Potenza reputazione: 0
Pocho E' per ora ancora un mistero
Predefinito

Posto tutto il codice che devo ancora completare, praticamente devo controllare un servo in modalità automatica che gira secondo la luce che rileva dai sensori e in modalità manuale che inserisco i gradi che voglio che giri il motore.

E' una tesina, ho paura che il prof frequenti questo sito dopo un pò di giorni cancello il post.




Codice:
 

#define MAX_COMMANDS 10
#define BUFFER_SIZE 8
#define COMMAND_CODE_LEN 2
#define COMMAND_ARGUMENT_LEN 4
#include <Servo.h>
Servo myservo;

char header='#';
char footer='$';
char commandBuffer[BUFFER_SIZE];
bool hasToParse=false;
int pointer=0;
int sensorPin = A0;
int servoPin  = 9;
 
int sensorValue = 0;
int servoGrad = 90;
int tolleranza = 40;
//STRUTTURE E TYPEDEF
typedef void (*serialFunction)(char *argument); //definisco per comodità un typedef per un puntatore a funzione
typedef struct serialCommand{
 char commandCode[COMMAND_CODE_LEN];
 char commandArgument[COMMAND_ARGUMENT_LEN];
 serialFunction callback;
};

void setup() {
  pinMode( sensorPin, INPUT);
  myservo.attach( servoPin );
  myservo.write( servoGrad );
  Serial.begin(9600);
  Serial.println("\n-----------------MENU------------------\n");
  Serial.println(" Inserire un comando #XXYYYY$ ");
  Serial.println(" #000000$  attiva modalita\' automatica");
  Serial.println(" #000001$  attiva modalita\' manuale");
  Serial.println(" #010030$  muoviti in senso orario di 30 gradi");
  Serial.println(" #020030$  muoviti in senso antiorario di 30 gradi ");
  
}

//ESEMPIO DI COMANDI
//---------------------------------------------------
void callback_activateAutomaticMode(char *a)
{
  funzioneAutomatica;
}
serialCommand activateAutomaticMode;
activateAutomaticMode.commandCode="00";
activateAutomaticMode.commandArgument="0000";
activateAutomaticMode.callback=callback_activateAutomaticMode;
void callback_activateManualMode(char *a)
{
 //do something
}
serialCommand activateManualMode;
activateManualMode.commandCode="01";
activateManualMode.commandArgument="0000";
activateManualMode.callback=callback_activateManualMode;
//---------------------------------------------------
 
void serialHandler(){
//legge dalla seriale scrivendo nel commandBuffer, se arriva un sequenza di byte che rispetta il protocollo deciso allora setta hasToParse=1
  if( Serial.available()>0 ) {
    while(pointer<7) {
    commandBuffer[pointer]= Serial.read();
    pointer++;
    }
    if ( commandBuffer[0]=='#' ) {
      if ( commandBuffer[7]=='$' ) {
        hasToParse=true;
      }
    }
  }
}
void commandParser(){
//verifica se esiste un comando con lo stesso commandCode dei primi due byte ricevuti.
  if ( serialCommand.commandCode=='00') {
    callback_activateAutomaticMode();
  }
  if ( serialCommand.commandCode=='01') {
    callback_activateManualMode();
  }
}

void loop(){
 serialHandler();
 if(hasToParse) commandParser();
}
void funzioneAutomatica() {
  while(1) {
  sensorValue = analogRead(sensorPin);
  if ( sensorValue < (512-tolleranza) )
  {
    if (servoGrad < 180) servoGrad=servoGrad+2;
  }
 
  if ( sensorValue > (512+tolleranza) )
  {
    if (servoGrad > 0) servoGrad=servoGrad-2;
  }
 
  myservo.write( servoGrad ); 
 
  delay(100);
  }
}
Rispondi citando
  #7  
Vecchio 17-06-2013, 19.04.35
L'avatar di matty
matty matty non è collegato
Robottaro sostenitore
 
Data registrazione: 15-05-2004
Residenza: Verona Treviso, Italy
Messaggi: 822
Potenza reputazione: 118
matty La sua reputazione è oltre la sua famamatty La sua reputazione è oltre la sua fama
Predefinito

Ok, probabilmente ti mancano alcune basi fondamentali di C.
Questo link ti sarà d'aiuto: http://digilander.libero.it/uzappi/C/C-main.html
__________________
Robot Golem project: www.robot-golem.org
Rispondi citando
  #8  
Vecchio 17-06-2013, 19.35.42
L'avatar di Caronte
Caronte Caronte non è collegato
Administrator
 
Data registrazione: 15-10-2009
Residenza: Ferrara
Età : 53
Messaggi: 2,962
Potenza reputazione: 346
Caronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua famaCaronte La sua reputazione è oltre la sua fama
Predefinito

Citazione:
Orginalmente inviato da Pocho Visualizza messaggio
Posto tutto il codice che devo ancora completare, praticamente devo controllare un servo in modalità automatica che gira secondo la luce che rileva dai sensori e in modalità manuale che inserisco i gradi che voglio che giri il motore.

E' una tesina, ho paura che il prof frequenti questo sito dopo un pò di giorni cancello il post.




Codice:
 

#define MAX_COMMANDS 10
#define BUFFER_SIZE 8
#define COMMAND_CODE_LEN 2
#define COMMAND_ARGUMENT_LEN 4
#include <Servo.h>
Servo myservo;

char header='#';
char footer='$';
char commandBuffer[BUFFER_SIZE];
bool hasToParse=false;
int pointer=0;
int sensorPin = A0;
int servoPin  = 9;
 
int sensorValue = 0;
int servoGrad = 90;
int tolleranza = 40;
//STRUTTURE E TYPEDEF
typedef void (*serialFunction)(char *argument); //definisco per comodità un typedef per un puntatore a funzione
typedef struct serialCommand{
 char commandCode[COMMAND_CODE_LEN];
 char commandArgument[COMMAND_ARGUMENT_LEN];
 serialFunction callback;
};

void setup() {
  pinMode( sensorPin, INPUT);
  myservo.attach( servoPin );
  myservo.write( servoGrad );
  Serial.begin(9600);
  Serial.println("\n-----------------MENU------------------\n");
  Serial.println(" Inserire un comando #XXYYYY$ ");
  Serial.println(" #000000$  attiva modalita\' automatica");
  Serial.println(" #000001$  attiva modalita\' manuale");
  Serial.println(" #010030$  muoviti in senso orario di 30 gradi");
  Serial.println(" #020030$  muoviti in senso antiorario di 30 gradi ");
  
}

//ESEMPIO DI COMANDI
//---------------------------------------------------
void callback_activateAutomaticMode(char *a)
{
  funzioneAutomatica;
}
serialCommand activateAutomaticMode;
activateAutomaticMode.commandCode="00";
activateAutomaticMode.commandArgument="0000";
activateAutomaticMode.callback=callback_activateAutomaticMode;
void callback_activateManualMode(char *a)
{
 //do something
}
serialCommand activateManualMode;
activateManualMode.commandCode="01";
activateManualMode.commandArgument="0000";
activateManualMode.callback=callback_activateManualMode;
//---------------------------------------------------
 
void serialHandler(){
//legge dalla seriale scrivendo nel commandBuffer, se arriva un sequenza di byte che rispetta il protocollo deciso allora setta hasToParse=1
  if( Serial.available()>0 ) {
    while(pointer<7) {
    commandBuffer[pointer]= Serial.read();
    pointer++;
    }
    if ( commandBuffer[0]=='#' ) {
      if ( commandBuffer[7]=='$' ) {
        hasToParse=true;
      }
    }
  }
}
void commandParser(){
//verifica se esiste un comando con lo stesso commandCode dei primi due byte ricevuti.
  if ( serialCommand.commandCode=='00') {
    callback_activateAutomaticMode();
  }
  if ( serialCommand.commandCode=='01') {
    callback_activateManualMode();
  }
}

void loop(){
 serialHandler();
 if(hasToParse) commandParser();
}
void funzioneAutomatica() {
  while(1) {
  sensorValue = analogRead(sensorPin);
  if ( sensorValue < (512-tolleranza) )
  {
    if (servoGrad < 180) servoGrad=servoGrad+2;
  }
 
  if ( sensorValue > (512+tolleranza) )
  {
    if (servoGrad > 0) servoGrad=servoGrad-2;
  }
 
  myservo.write( servoGrad ); 
 
  delay(100);
  }
}

Mancano due graffe nel void di sicuro, prova a incollare questo:


Codice:
void callback_activateAutomaticMode(char *a){
{
  funzioneAutomatica;
}
  
    serialCommand activateAutomaticMode;
      activateAutomaticMode.commandCode= "00" ;
        activateAutomaticMode.commandArgument="0000";
          activateAutomaticMode.callback=callback_activateAutomaticMode;
  
            void callback_activateManualMode(char *a)
{
 //do something
}
serialCommand activateManualMode;
activateManualMode.commandCode="01";
activateManualMode.commandArgument="0000";
activateManualMode.callback=callback_activateManualMode;
//---------------------------------------------------}



però dopo devi guardare l'incompatibilità con le variabili.....

devo uscire.

Antonio
Rispondi citando
  #9  
Vecchio 17-06-2013, 19.45.16
L'avatar di matty
matty matty non è collegato
Robottaro sostenitore
 
Data registrazione: 15-05-2004
Residenza: Verona Treviso, Italy
Messaggi: 822
Potenza reputazione: 118
matty La sua reputazione è oltre la sua famamatty La sua reputazione è oltre la sua fama
Predefinito

mmm.. la sintassi corretta è questa:
Codice:
void callback_activateAutomaticMode(char *a) { 
  serialCommand activateAutomaticMode; 
  activateAutomaticMode.commandCode="00"; 
  activateAutomaticMode.commandArgument="0000"; 
  activateAutomaticMode.callback=callback_activateAutomaticMode;
}
void callback_activateManualMode(char *a) { 
  serialCommand activateManualMode; 
  activateManualMode.commandCode="01"; 
  activateManualMode.commandArgument="0000"; 
  activateManualMode.callback=callback_activateManualMode;
}
Alla funzioni viene passato il riferimento ad una fantomatica variabile 'a' che nemmeno viene usata.
Sarà colpa di un mischione di copia&incolla?
__________________
Robot Golem project: www.robot-golem.org
Rispondi citando
  #10  
Vecchio 18-06-2013, 10.16.11
Pocho Pocho non è collegato
Nuovo robottaro
 
Data registrazione: 11-12-2012
Residenza: Milano
Messaggi: 13
Potenza reputazione: 0
Pocho E' per ora ancora un mistero
Predefinito

Ho risolto il problema, dovevo inizializzare dentro la Setup le strutture, (Main in C) però ora mi dà errore nelle conversioni posto l'errore completo:




In function 'void setup()':
error: cannot convert 'void (*)(char*)' to 'char*' for argument '1' to 'char* strcpy(char*, const char*)'

:In function 'void commandParser()':
error: expected primary-expression before '.' token
error: too few arguments to function 'void callback_activateAutomaticMode(char*)'
error: at this point in file
error: expected primary-expression before '.' token
error: too few arguments to function 'void callback_activateManualMode(char*)'
error: at this point in file




Codice:
 
#define MAX_COMMANDS 10
#define BUFFER_SIZE 8
#define COMMAND_CODE_LEN 2
#define COMMAND_ARGUMENT_LEN 4
#include <Servo.h>
Servo myservo;

char header='#';
char footer='$';
char commandBuffer[BUFFER_SIZE];
bool hasToParse=false;
int pointer=0;
int sensorPin = A0;
int servoPin  = 9;
 
int sensorValue = 0;
int servoGrad = 90;
int tolleranza = 40;
//STRUTTURE E TYPEDEF
typedef void (*serialFunction)(char *argument); //definisco per comodità un typedef per un puntatore a funzione
typedef struct serialCommand{
 char commandCode[COMMAND_CODE_LEN];
 char commandArgument[COMMAND_ARGUMENT_LEN];
 serialFunction callback;
};

void setup() {
  pinMode( sensorPin, INPUT);
  myservo.attach( servoPin );
  myservo.write( servoGrad );
  Serial.begin(9600);
  Serial.println("\n-----------------MENU------------------\n");
  Serial.println(" Inserire un comando #XXYYYY$ ");
  Serial.println(" #000000$  attiva modalita\' automatica");
  Serial.println(" #000001$  attiva modalita\' manuale");
  Serial.println(" #010030$  muoviti in senso orario di 30 gradi");
  Serial.println(" #020030$  muoviti in senso antiorario di 30 gradi ");
  
  serialCommand activateAutomaticMode;
  strcpy(activateAutomaticMode.commandCode, "00");
  strcpy(activateAutomaticMode.commandArgument,"0000");
  strcpy(activateAutomaticMode.callback,callback_activateAutomaticMode);
  serialCommand activateManualMode;
  strcpy(activateManualMode.commandCode,"01");
  strcpy(activateManualMode.commandArgument,"0000");
  strcpy(activateManualMode.callback,callback_activateManualMode);
  
}

//ESEMPIO DI COMANDI
//---------------------------------------------------
void callback_activateAutomaticMode(char *a)
{
  funzioneAutomatica;
}
void callback_activateManualMode(char *a)
{
 //do something
}
//---------------------------------------------------

void serialHandler(){
//legge dalla seriale scrivendo nel commandBuffer, se arriva un sequenza di byte che rispetta il protocollo deciso allora setta hasToParse=1
  if( Serial.available()>0 ) {
    while(pointer<7) {
    commandBuffer[pointer]= Serial.read();
    pointer++;
    }
    if ( commandBuffer[0]=='#' ) {
      if ( commandBuffer[7]=='$' ) {
        hasToParse=true;
      }
    }
  }
}
void commandParser(){
//verifica se esiste un comando con lo stesso commandCode dei primi due byte ricevuti.
  if ( serialCommand.commandCode=='00') {
    callback_activateAutomaticMode();
  }
  if ( serialCommand.commandCode=='01') {
    callback_activateManualMode();
  }
}

void loop(){
 serialHandler();
 if(hasToParse) commandParser();
}
void funzioneAutomatica() {
  while(1) {
  sensorValue = analogRead(sensorPin);
  if ( sensorValue < (512-tolleranza) )
  {
    if (servoGrad < 180) servoGrad=servoGrad+2;
  }
 
  if ( sensorValue > (512+tolleranza) )
  {
    if (servoGrad > 0) servoGrad=servoGrad-2;
  }
 
  myservo.write( servoGrad ); 
 
  delay(100);
  }
}
Rispondi citando
Rispondi


Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti)
 
Strumenti discussione
Modalità  visualizzazioe

Regole di scrittura
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code è Attivato
Le smilies sono Attivato
[IMG] è Attivato
Il codice HTML è Disattivato

Vai al forum

Discussioni simili
Discussione Autore discussione Forum Risposte Ultimo messaggio
i-droid arm error reset david1978 I-Droid 01 0 27-02-2012 14.38.37
error PRJ0003 francesco1984 OpenCV 0 03-01-2012 17.07.20
error opencv: bad argument serino OpenCV 0 19-09-2011 11.47.47
syntax error near unexpected token `(' gabboshow OpenCV 4 19-03-2011 16.41.57
Parity Error Reset (PER) chiccow P. in Assembler 4 13-12-2009 17.40.36


Tutti gli orari sono GMT. Adesso sono le: 02.45.48.


Basato su: vBulletin Versione 3.8.8
Copyright ©2000 - 2023, Jelsoft Enterprises Ltd.
Realizzazione siti web Cobaltica Foligno
spacer.png, 0 kB