Errore non visto

di il
4 risposte

Errore non visto

Buongiorno a tutti, approfitto già per salutare tutti gli utenti del forum e per ringraziarvi di qualsiasi consiglio e correzione che mi possiate dare.
Sto realizzando un programma che deve comunicare contemporaneamente tramite una rs485 e riportare le risposte dei dispositivi ad un'applicazione web.
Per ora sono ancora ad un punto parecchio iniziale del programma, ho scritto la demonizzazione seguendo le indicazioni di alcuni siti e mi trovo davanti ad un problema veramente stupido che però non riesco ad identificare. il codice che ho copiato / scritto per ora è questo:

#include "stdio.h"     
#include "string.h"    
#include "unistd.h"    
#include "fcntl.h"     
#include "errno.h"     
#include "sys/types.h"
#include "sys/stat.h"
#include "stdlib.h"
#include "stdarg.h"
#include "termios.h"
#include "linux/serial.h"  
 
#define TIOCSRS485 0x542F

//variabili generali
	int i;

//indirizzi paline esadecimali
	#define indirizzi [8] {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08}

//CARATTERI SPECIALI
	//apertura e chiusura della stringa verso palina
	#define SYNC 0x7E
	//separatore lato web
	#define separatore ;
	//apertura e chiusura stringa lato web
	#define startEnd @
	
//COMANDI
	//comando seriale polling RFID
	#define CMD1 0x01
	//comando seriale scrittura display
	#define CMD2 0x02
	//comando sblocco bicicletta
	#define CMD3 0x03
	//comando controllo caricabatteria
	#define CMD4 0x04
 
int main(void) {
    char txBuffer[10];
    char rxBuffer[10];
    int fd;
    struct termios tty_attributes;
    struct serial_rs485 rs485conf;
	pid_t pid,sid;
	char mexSeriale[66];
 
	//DEMONIZZAZIONE
	pid=fork();
	if(pid<0)
	{
		exit(EXIT_FAILURE);
	}else
		{
			if(pid>0)
			{
				exit(EXIT_SUCCESS);
			}
		}
	umask(0);
	sid=setsid();
	if(sid<0)
	{
		exit(EXIT_FAILURE);
	}	
	if((chdir("/"))<0)
	{
		exit(EXIT_FAILURE);
	}
	
	//INIZIO DEL LOOP INFINITO
	while(1)
	{
		//CICLO CHE PASSA IN RASSEGNA UNO ALLA VOLTA TUTTI I TERMINALI COLLEGATI A PARTIRE DAL 0x01 FINO AL 0x08
		for(i==0;i<=7;i++)
		{
			if ((fd = open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NONBLOCK))<0) 
			{
				fprintf (stderr,"Open error on %s\n", strerror(errno));
				exit(EXIT_FAILURE);
			}else 
				{
					//imposto il primo carattere SYNC
					mexSeriale[0]=SYNC;
					//imposto il secondo carattere con indirizzo della palina i
					mexSeriale[1]=indirizzi [i];
				}
			//contiuna da qui
		}
	}
 
		//qui
		{
			tcgetattr(fd,&tty_attributes);
			// c_cflag
			// Enable receiver
			tty_attributes.c_cflag |= CREAD;        
			// 8 data bit
			tty_attributes.c_cflag |= CS8;          
			// c_iflag
			// Ignore framing errors and parity errors. 
			tty_attributes.c_iflag |= IGNPAR;       
			// c_lflag
			// DISABLE canonical mode.
			// Disables the special characters EOF, EOL, EOL2, 
			// ERASE, KILL, LNEXT, REPRINT, STATUS, and WERASE, and buffers by lines.
			// DISABLE this: Echo input characters.
			tty_attributes.c_lflag &= ~(ICANON);     
			tty_attributes.c_lflag &= ~(ECHO);      
			// DISABLE this: If ICANON is also set, the ERASE character erases the preceding input  
			// character, and WERASE erases the preceding word.
			tty_attributes.c_lflag &= ~(ECHOE);     
			// DISABLE this: When any of the characters INTR, QUIT, SUSP, or DSUSP are received, generate the corresponding signal. 
			tty_attributes.c_lflag &= ~(ISIG);      
			// Minimum number of characters for non-canonical read.
			tty_attributes.c_cc[VMIN]=1;            
			// Timeout in deciseconds for non-canonical read.
			tty_attributes.c_cc[VTIME]=0;           
			// Set the baud rate
			cfsetospeed(&tty_attributes,B38400);     
			cfsetispeed(&tty_attributes,B38400);
			tcsetattr(fd, TCSANOW, &tty_attributes);
			// Set RS485 mode: 
			rs485conf.flags |= SER_RS485_ENABLED;
			if (ioctl (fd, TIOCSRS485, &rs485conf) < 0) 
			{
				printf("ioctl error\n");
			}
			txBuffer[0]='A';
			write(fd,txBuffer,1);
        // Read a char
        if (read(fd,&rxBuffer,1)==1)
		{
            printf("%c",rxBuffer[0]);
            printf("\n");
        }   
    }   
    close(fd);  
    return EXIT_SUCCESS;
}
l'errore si trova nella riga:
mexSeriale[1]=indirizzi ;

e questo è quello che mi viene restituito dal terminale quando vado a compilare
ser485.c: In function ‘main’:
ser485.c:86: error: expected expression before ‘[’ token

nella mia ignoranza non riesco davvero a trovare l'errore, spero che mi possiate aiutare e dare qualche indicazione per riuscire a capire dove sto sbagliando in modo da non ripetere l'errore.

ancora grazie mille per tutti gli aiuti che spero di ricevere.
Buona navigazione a tutti
Luca

4 Risposte

  • Re: Errore non visto

    Ma perchè metti gli header tra "" ?????
    che li hai copiati nella stessa directory??
    
    //for(i==0;i<=7;i++) errato
    for(i=0; i <= 7 ;i++)
    
    
    mexSeriale[1]=indirizzi [i];
    
    indirizzi è una macro ma non riesco proprio a capire come funzioni,
    tecnicamente te la risolve cosi:
    
    mexSeriale[1]=[8] {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08} [i];
    
    e il mio livello non mi permette di comprendere come possa il compilatore interpretare tale riga,forse è per quello che ti da l'errore.
  • Re: Errore non visto

    Per quanto riquarda gli header è un discorso di distrazione / confusione. ho notato adesso che non li ho messi tra <>.
    Il ciclo l'ho corretto e visto che non è la prima volta che lo uso devo essermi veramente immaginato non so cosa per sbagliarlo (però non capisco come mai me lo dava giusto da compilatore).

    Il problema alla fine l'ho risolto togliendo l'array dal define e definendolo all'interno del main come un normale array char. mi piacerebbe riuscire a capire come mai questa differenza.... comunque grazie mille della mano. il post lo lascio aperto che non si sa mai.
    Molto probabilmente avrò ancora un bel po' di dubbi ed errori da chiarire. spero di riuscire a cavarmela da solo per la maggiorparte dei casi.

    Comunque... adesso che ho trovato il problema qualcuno ha idea del come mai cambiando quella dichiarazione mi cambia il risultato della compilazione?
  • Re: Errore non visto

    come mai questa differenza
    Beh, non sono mica la stessa cosa se lo scrivi in un modo o in un altro ...

    Con la define viene fatta una semplice "sostituzione di testo" ma non viene creato nessun array.
    Quindi, l'unica scrittura valida è quella in cui crei effettivamente l'array in memoria.
  • Re: Errore non visto

    Ok, adesso è tutto chiaro. Io avevo capito che con il define andavo a mettere una costante e che poteva essere di un qualsiasi tipo, anche array.
    Capito tutto, ancora grazie mille
Devi accedere o registrarti per scrivere nel forum
4 risposte