Skip to content

Commit bb256b4

Browse files
author
pinguytaz
committed
Ejemplo grabacion EEPROM Config_Serial.
Ademas de actualizar el anexo y el Readme para poner el ejemplo.
1 parent 186e9d7 commit bb256b4

File tree

12 files changed

+449
-2
lines changed

12 files changed

+449
-2
lines changed
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
/*******************************************************************************************
2+
* Autor: Fco. Javier Rodriguez Navarro
3+
* WEB: www.pinguytaz.net
4+
*
5+
* Descripción: Ejecutable de configuración por el puerto serie
6+
* Programa en C preparado para plataforma Linux y Windows
7+
* La version Windows con compilación cruzada de MinGW
8+
* Formato del fichero: lineas <R> <V> <A> <Comentario>
9+
* se pasara por el puerto serie
10+
* una linea con el número de lineas \n
11+
* lineas con <R> <V> <A>
12+
*
13+
**********************************************************************************************/
14+
#include <stdio.h>
15+
#include <stdlib.h>
16+
#include <string.h>
17+
18+
#ifdef _WIN32
19+
// Definicion de Windows
20+
#include <windows.h>
21+
#define SERIAL_TYPE HANDLE
22+
#define SERIAL_INVALID INVALID_HANDLE_VALUE
23+
#define SERIAL_SEND(fd, data, len) WriteFile(fd, data, len, &bytesWritten, NULL)
24+
#define SERIAL_RECV(fd, data, len) ReadFile(fd, data, len, &bytesRead, NULL)
25+
#else
26+
// Definicion de Linux
27+
#include <fcntl.h>
28+
#include <termios.h>
29+
#include <unistd.h>
30+
#define SERIAL_TYPE int
31+
#define SERIAL_INVALID -1
32+
#define SERIAL_SEND(fd, data, len) write(fd, data, len)
33+
#define SERIAL_RECV(fd, data, len) read(fd, data, len)
34+
#endif
35+
36+
// Variables globales para el descriptor y buffers de Windows
37+
SERIAL_TYPE serialPort;
38+
#ifdef _WIN32
39+
DWORD bytesWritten, bytesRead;
40+
#endif
41+
42+
// Prototipos de funciones, que nos permiten abrir o cerrar el puerto segun sea Linux o Windows
43+
int aperturaPuerto(const char *puerto);
44+
void cierrePuerto();
45+
46+
#define MAX_ESTADOS 50
47+
typedef struct
48+
{
49+
int rojo;
50+
int verde;
51+
int azul;
52+
} t_led;
53+
54+
55+
int main(int argc, char *argv[])
56+
{
57+
char linea[256];
58+
t_led estados[MAX_ESTADOS];
59+
int numEstados=0;
60+
61+
if (argc < 3)
62+
{
63+
printf("Uso: %s <puerto>\n", argv[0]);
64+
#ifdef _WIN32
65+
printf("Ejemplo Windows: %s COM3 <fichero Conf>\n", argv[0]);
66+
#else
67+
printf("Ejemplo Linux: %s /dev/ttyUSB0 <fichero Conf>\n", argv[0]);
68+
#endif
69+
70+
return 1;
71+
}
72+
73+
// Lo primero es leer el fichero de configuración y generar las lineas que se se enviaran
74+
// Formato de la line del fichero <R> <V> <A> <Comentario>
75+
// Solo se enviara los valores de rojo, verde y azul. Antes enviaremos el numLineas
76+
77+
FILE *f = fopen(argv[2], "r");
78+
if (!f)
79+
{
80+
perror("No se pudo abrir el fichero");
81+
return -1;
82+
}
83+
84+
int i = 0;
85+
while (fgets(linea, sizeof(linea), f) && i < MAX_ESTADOS)
86+
{
87+
int r, v, a;
88+
char comentario[256];
89+
90+
// Leer los tres enteros y el comentario (puede tener espacios)
91+
int n = sscanf(linea, "%d %d %d %[^\n]", &r, &v, &a, comentario);
92+
if (n >= 4)
93+
{
94+
//printf("Comentario: %s\n", comentario);
95+
estados[i].rojo = r;
96+
estados[i].verde = v;
97+
estados[i].azul = a;
98+
i++;
99+
}
100+
else
101+
{
102+
printf("Línea mal formada: %s", linea);
103+
}
104+
}
105+
fclose(f);
106+
numEstados = i;
107+
108+
/* Debug para ver que lee bien fichero
109+
for(int i=0;i<numEstados;i++)
110+
{
111+
printf("Linea %d: R:%d V:%d A:%d\n",i, estados[i].rojo,estados[i].verde,estados[i].azul);
112+
}
113+
printf("El total de lineas correctas %d\n",i+1);
114+
*/
115+
116+
// Iniciamos la comunicación
117+
if (aperturaPuerto(argv[1]) != 0)
118+
{
119+
fprintf(stderr, "No se pudo abrir el puerto serie.\n");
120+
return 1;
121+
}
122+
123+
char enviar = '#';
124+
char recibido = 0;
125+
126+
printf("Enviamos #\n");
127+
SERIAL_SEND(serialPort, &enviar, 1);
128+
129+
printf("Esperamos |\n");
130+
do
131+
{
132+
SERIAL_RECV(serialPort, &recibido, 1);
133+
printf("Recibe %c\n",recibido);
134+
} while (recibido != '|');
135+
136+
printf("Comenzamos la configuración de %d estados\n",numEstados);
137+
sprintf(linea, "%d\n",numEstados);
138+
SERIAL_SEND(serialPort, linea, strlen(linea));
139+
for(int i=0;i<numEstados;i++)
140+
{
141+
sprintf(linea, "%d %d %d\n",estados[i].rojo,estados[i].verde,estados[i].azul);
142+
printf("Enviamos %d: %s",i,linea);
143+
SERIAL_SEND(serialPort, linea, strlen(linea));
144+
#ifdef _WIN32
145+
Sleep(2000);
146+
#else
147+
sleep(2);
148+
#endif
149+
}
150+
151+
cierrePuerto();
152+
153+
printf("Terminada configuración reinicia arduino\n");
154+
return 0;
155+
}
156+
157+
// --- Implementación de apertura y cierre multiplataforma ---
158+
int aperturaPuerto(const char *puerto)
159+
{
160+
#ifdef _WIN32
161+
char port_name[32];
162+
snprintf(port_name, sizeof(port_name), "\\\\.\\%s", puerto);
163+
164+
serialPort = CreateFileA(port_name, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
165+
if (serialPort == INVALID_HANDLE_VALUE)
166+
{
167+
printf("Error abriendo el puerto %s\n", puerto);
168+
return 1;
169+
}
170+
171+
DCB dcbSerialParams = {0};
172+
dcbSerialParams.DCBlength = sizeof(dcbSerialParams);
173+
GetCommState(serialPort, &dcbSerialParams);
174+
dcbSerialParams.BaudRate = CBR_9600;
175+
dcbSerialParams.ByteSize = 8;
176+
dcbSerialParams.StopBits = ONESTOPBIT;
177+
dcbSerialParams.Parity = NOPARITY;
178+
SetCommState(serialPort, &dcbSerialParams);
179+
180+
COMMTIMEOUTS timeouts = {0};
181+
timeouts.ReadIntervalTimeout = 50;
182+
timeouts.ReadTotalTimeoutConstant = 50;
183+
timeouts.ReadTotalTimeoutMultiplier = 10;
184+
timeouts.WriteTotalTimeoutConstant = 50;
185+
timeouts.WriteTotalTimeoutMultiplier = 10;
186+
SetCommTimeouts(serialPort, &timeouts);
187+
188+
Sleep(2000); // Esperar a que Arduino reinicie
189+
#else
190+
serialPort = open(puerto, O_RDWR | O_NOCTTY);
191+
if (serialPort == -1)
192+
{
193+
perror("No se pudo abrir el puerto serie");
194+
return 1;
195+
}
196+
197+
sleep(5); // Esperar a que Arduino reinicie
198+
199+
struct termios options;
200+
tcgetattr(serialPort, &options);
201+
cfsetispeed(&options, B9600);
202+
cfsetospeed(&options, B9600);
203+
options.c_cflag |= (CLOCAL | CREAD);
204+
options.c_cflag &= ~PARENB;
205+
options.c_cflag &= ~CSTOPB;
206+
options.c_cflag &= ~CSIZE;
207+
options.c_cflag |= CS8;
208+
tcsetattr(serialPort, TCSANOW, &options);
209+
210+
tcflush(serialPort, TCIOFLUSH);
211+
212+
#endif
213+
return 0;
214+
}
215+
216+
void cierrePuerto()
217+
{
218+
#ifdef _WIN32
219+
if (serialPort != INVALID_HANDLE_VALUE)
220+
{
221+
CloseHandle(serialPort);
222+
}
223+
#else
224+
if (serialPort != -1)
225+
{
226+
close(serialPort);
227+
}
228+
#endif
229+
}
230+
16.2 KB
Binary file not shown.
154 KB
Binary file not shown.
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
CC_LINUX = gcc
2+
CC_WIN = x86_64-w64-mingw32-gcc
3+
4+
SRC = Conf_LW.c
5+
6+
all: linux windows
7+
8+
linux: $(SRC)
9+
$(CC_LINUX) -o Conf_Lin.elf $(SRC)
10+
11+
windows: $(SRC)
12+
$(CC_WIN) -o Conf_Win.exe $(SRC)
13+
14+
clean:
15+
rm -f Conf_Lin.elf Conf_Win.exe
16+
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
255 0 0 Este es el color rojo
2+
0 255 0 Este es el color verde
3+
0 0 255 Este es el color azul
4+
0 255 255 Este es el color cyan
5+
255 0 255 Este es el color magenta
6+
255 255 0 Este es el color amarillo
7+
255 128 0 Este es el color naranja
8+
255 255 255 Este es el color blanco
9+
0 0 102 Este es el color morado
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
255 0 0 Este es el color rojo
2+
0 255 0 Este es el color verde
3+
0 0 255 Este es el color azul
5.12 KB
Binary file not shown.
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/*******************************************************************************************
2+
* Autor: Fco. Javier Rodriguez Navarro
3+
* WEB: www.pinguytaz.net
4+
*
5+
* Descripción: Ejemplo para realizar una configuración en EEPROM por el puerto o ejecuta programa
6+
* normalmente, eso lo marca un pin si esta pulsado entra en modo config sino modo normal.
7+
* leyendo la configuración de la EEPROM
8+
*
9+
* Protocolo: Si entra en configutación espera '#' cuando llega envia '|' indicando que
10+
* puede recibir y recibira el número de lineas que se enviaran y cadenas de lineas
11+
* <R> <G> <B> que marca el color a poner en el LED
12+
* El programa lee la configuración de la EEPROM Num_Lineas y lineas comandos realizando la secuencia
13+
* a golpe de cambio del estado del boton que se usa para configurar. Quitado inicio programa.
14+
*
15+
* Esquema: Boton que indica si ejecuta y marca ritmo lee configuración, Led RGB conectados a 3 PWM.
16+
*
17+
* Librerias: EEPROM.h
18+
**************************************************************************************************/
19+
#include <EEPROM.h>
20+
#include "Funciones.h"
21+
22+
#define PINBOTON 2
23+
#define ROJO 11
24+
#define VERDE 10
25+
#define AZUL 9
26+
27+
void setup()
28+
{
29+
Serial.begin(9600);
30+
delay(500); //Dar un poco de tiempo a prepararlo.
31+
32+
pinMode(PINBOTON, INPUT);
33+
// Definimos salidas PWM para el diodo RGB
34+
pinMode(13, OUTPUT);
35+
36+
pinMode(ROJO, OUTPUT);
37+
pinMode(VERDE, OUTPUT);
38+
pinMode(AZUL, OUTPUT);
39+
40+
if (!digitalRead(PINBOTON)) // Entramos en modo programación si el boton quitado
41+
{
42+
programarEEPROM();
43+
while (1); // Se queda sin hacer nada a la espera de que se reinicie
44+
}
45+
46+
// No entramos en modo de programación por lo tanto leemos la EEPROM poniendo los datos en variables antes llop
47+
leerEEPROM();
48+
49+
}
50+
51+
void loop()
52+
{
53+
static bool estadoAntiguo = digitalRead(PINBOTON);
54+
static int estado=0;
55+
56+
bool val =digitalRead(PINBOTON);
57+
if(estadoAntiguo != val ) // Cambio de estado
58+
{
59+
estadoAntiguo = val;
60+
Serial.println("El estado: " + String(estado));
61+
Serial.println(" Rojo: " + String(estados[estado].rojo));
62+
Serial.println(" Verde: " + String(estados[estado].verde));
63+
Serial.println(" Azul: " + String(estados[estado].azul));
64+
analogWrite(ROJO, estados[estado].rojo);
65+
analogWrite(VERDE, estados[estado].verde);
66+
analogWrite(AZUL, estados[estado++].azul);
67+
if(estado == numEstados) estado = 0;
68+
}
69+
70+
delay(2000);
71+
}
81.2 KB
Loading

0 commit comments

Comments
 (0)