662
Programación / Programación C/C++ / No encuentra la laibrería estandar en Visual C++
en: 13 Marzo 2017, 06:35 am
Hola:
Estoy usando el nuevo Visual C++ 2017 con Win32. He probado este ejemplo que puedes ver en este enlace.
https://msdn.microsoft.com/es-es/library/bb384843.aspx El código de ejemplo que viene completo al final del documento, si funciona muy bien para Visual Stduio Community 2015, no da ningún problema. Este mismo código me da problemas con Visual Studuio Community 2017.
// GT_HelloWorldWin32.cpp
// compile with: /D_UNICODE /DUNICODE /DWIN32 /D_WINDOWS /c
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <tchar.h>
// Global variables
// The main window class name.
static TCHAR szWindowClass[ ] = _T( "win32app" ) ;
// The string that appears in the application's title bar.
static TCHAR szTitle[ ] = _T( "Formulario" ) ;
HINSTANCE hInst;
// Forward declarations of functions included in this code module:
LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
WNDCLASSEX wcex;
wcex.cbSize = sizeof ( WNDCLASSEX) ;
wcex.style = CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = WndProc;
wcex.cbClsExtra = 0 ;
wcex.cbWndExtra = 0 ;
wcex.hInstance = hInstance;
wcex.hIcon = LoadIcon( hInstance, MAKEINTRESOURCE( IDI_APPLICATION) ) ;
wcex.hCursor = LoadCursor( NULL , IDC_ARROW) ;
wcex.hbrBackground = ( HBRUSH) ( COLOR_WINDOW + 1 ) ;
wcex.lpszMenuName = NULL ;
wcex.lpszClassName = szWindowClass;
wcex.hIconSm = LoadIcon( wcex.hInstance , MAKEINTRESOURCE( IDI_APPLICATION) ) ;
if ( ! RegisterClassEx( & wcex) )
{
MessageBox( NULL ,
_T( "Call to RegisterClassEx failed!" ) ,
_T( "Win32 Guided Tour" ) ,
NULL ) ;
return 1 ;
}
hInst = hInstance; // Store instance handle in our global variable
// The parameters to CreateWindow explained:
// szWindowClass: the name of the application
// szTitle: the text that appears in the title bar
// WS_OVERLAPPEDWINDOW: the type of window to create
// CW_USEDEFAULT, CW_USEDEFAULT: initial position (x, y)
// 500, 100: initial size (width, length)
// NULL: the parent of this window
// NULL: this application does not have a menu bar
// hInstance: the first parameter from WinMain
// NULL: not used in this application
HWND hWnd = CreateWindow(
szWindowClass,
szTitle,
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, CW_USEDEFAULT,
300 , 300 ,
NULL ,
NULL ,
hInstance,
NULL
) ;
if ( ! hWnd)
{
MessageBox( NULL ,
_T( "Call to CreateWindow failed!" ) ,
_T( "Win32 Guided Tour" ) ,
NULL ) ;
return 1 ;
}
// The parameters to ShowWindow explained:
// hWnd: the value returned from CreateWindow
// nCmdShow: the fourth parameter from WinMain
ShowWindow( hWnd,
nCmdShow) ;
UpdateWindow( hWnd) ;
// Main message loop:
MSG msg;
while ( GetMessage( & msg, NULL , 0 , 0 ) )
{
TranslateMessage( & msg) ;
DispatchMessage( & msg) ;
}
return ( int ) msg.wParam ;
}
//
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
TCHAR greeting[ ] = _T( "Visual C++ 2017 Win32" ) ;
switch ( message)
{
case WM_PAINT:
hdc = BeginPaint( hWnd, & ps) ;
// Here your application is laid out.
// For this introduction, we just print out "Hello, World!"
// in the top left corner.
TextOut( hdc,
55 , 105 ,
greeting, _tcslen( greeting) ) ;
// End application-specific layout section.
EndPaint( hWnd, & ps) ;
break ;
case WM_DESTROY:
PostQuitMessage( 0 ) ;
break ;
default :
return DefWindowProc( hWnd, message, wParam, lParam) ;
break ;
}
return 0 ;
}
El error que me da es este:
Gravedad Código Descripción Proyecto Archivo Línea Estado suprimido Error C1010 final de archivo inesperado al buscar la directiva de encabezado precompilado. Compruebe si olvidó agregar '#include "stdafx.h"' al código fuente? Proyecto_Win32 c:\users\usuario\documents\visual studio 2017\projects\proyecto_win32\proyecto_win32\mensaje_texto.cpp 145 Si pongo arriba dicho #include "stdafx.h" me marca como error, como que no lo encuentra.
¿Alguna idea?
Saludos.
663
Programación / .NET (C#, VB.NET, ASP) / Instalar las herramientas comunes del VC++ 2017
en: 13 Marzo 2017, 01:53 am
Hola:
He intentado descargar la versión ISO del Visual Studio Community 2017 (gratuito) en el cual ya no se puede porque no cabe en un DVD. Pero hay un truco para tenerlo todo en el local, a mi me ocupa unos 20 GB descargado. Más información de cómo se hace
aquí .
Me sale al ejecutar el ejecutable este menú.
Ver zoom .
Lo he instaldo desde la Web y apenas me aparecen plantillas, ni siquiera me aparece el de Windows Form de C#, ni Visual Basic .net.
Ahora lo tengo descargado en local y desistanlé por vía Web por si acaso. Por si acaso, voy a instalar los tres que pone arriba wn Windowa.
Desarrollo de la plataforma universal de Windows. Desarrollo de escritorio .net Desarrollo para el escritorio con C++. En la página 10 de este documento de abajo indica las herramientas comunes de VS 2015 y en el VS 2017 no se donde está.
https://www.slideshare.net/Metaconta2/formulario-windows-con-visual-c ¿Alguna idea?
Saludos.
PD:
En este mismo momento, instalando las tres primeras opciones.
665
Programación / .NET (C#, VB.NET, ASP) / Pasar de C# a F# con Visual Studio Community 2015
en: 28 Enero 2017, 15:42 pm
Hola:
Mirando
aquí este código en
C# , está en
C++ y
VB .net , pero en
F# no veo ni papa.
Cambiar de C# por F# :
using System ;
using System.IO.Ports ;
class PortDataReceived
{
public static void Main( )
{
SerialPort mySerialPort
= new SerialPort
( "COM1" ) ;
mySerialPort. BaudRate = 9600 ;
mySerialPort. Parity = Parity. None ;
mySerialPort. StopBits = StopBits. One ;
mySerialPort. DataBits = 8 ;
mySerialPort. Handshake = Handshake. None ;
mySerialPort. RtsEnable = true ;
mySerialPort
. DataReceived += new SerialDataReceivedEventHandler
( DataReceivedHandler
) ;
mySerialPort. Open ( ) ;
Console. WriteLine ( "Press any key to continue..." ) ;
Console. WriteLine ( ) ;
Console. ReadKey ( ) ;
mySerialPort. Close ( ) ;
}
private static void DataReceivedHandler(
object sender,
SerialDataReceivedEventArgs e)
{
SerialPort sp = ( SerialPort) sender;
string indata = sp. ReadExisting ( ) ;
Console. WriteLine ( "Data Received:" ) ;
Console. Write ( indata) ;
}
}
He intentado encontrar tutoriales de F# en español, más bien estáenel MSDN de los foros oficiales.
https://msdn.microsoft.com/es-es/library/dd233160(v=vs.110).aspx https://msdn.microsoft.com/es-es/library/ee241126(v=vs.110).aspx https://msdn.microsoft.com/es-es/library/ee241127(v=vs.110).aspx Para saber de que va está bien. Para hacer el minichat de arriba de C# a F# lo veo más complicado.
Vídeos del 2009, mejor algo que nada en español.
VIDEO Segunda parte .
Casi no hay nada de video tutoriales en español, de PowerShell está habiendo más aunque este último es másbien para tareas administrativas.
¿Alguna ayuda?
Un cordial saludo.
PD:
Como se nota que no mola a lagente F# y si otros lenguajes, sobre todo, hoy en día se usa VB 6 en el cual no se recomienda para equipos actuales y no lo sueltan ni por asomo.
666
Programación / .NET (C#, VB.NET, ASP) / Re: Hacer cambios de este código.
en: 28 Enero 2017, 00:32 am
Ya me funciona, por finnnnnnnnnn.
Gracias a todos.
using System ;
using System.Diagnostics ;
using System.IO ;
using System.IO.Ports ;
using System.Text ;
using System.Threading ;
namespace Recibir_archivo_desde_Arduino_consola_02
{
class Program
{
static void Main( string [ ] args)
{
string COM = "" ;
// Tamaño ventana consola.
Console. WindowWidth = 55 ; // X. Ancho.
Console. WindowHeight = 15 ; // Y. Alto.
Console. Title = "Recoger foto desde Arduino y crearlo en el disco duro" ; // Título de la ventana.
// Crear un nuevo objeto SerialPort con la configuración predeterminada.
SerialPort Puerto_serie
= new SerialPort
( ) ;
// Configuración.
Console. Write ( @"
Introduzca un número para seleccionar puerto COM.
Por ejemplo el 4, sería COM4.
Puerto: " ) ;
COM = Console. ReadLine ( ) ; // Escribir el número del puerto.
Console. Clear ( ) ;
Puerto_serie. PortName = "COM" + COM; // Número del puerto serie.
Puerto_serie. BaudRate = 115200 ; // Baudios. 115200.
Puerto_serie. Parity = Parity. None ; // Paridad.
Puerto_serie. DataBits = 8 ; // Bits de datos.
Puerto_serie. StopBits = StopBits. Two ; // Bits de parada.
Puerto_serie. Handshake = Handshake. None ; // Control de flujo.
// Establecer la lectura / escritura de los tiempos de espera.
Puerto_serie. ReadTimeout = - 1 ; // 500.
Puerto_serie. WriteTimeout = - 1 ; // 500.
try
{
Puerto_serie. Open ( ) ; // Abrir el puerto serie.
}
catch ( IOException)
{
Console. ForegroundColor = ConsoleColor. Red ; // Texto en rojo.
Console. CursorVisible = false ;
Console. SetCursorPosition ( 16 , 6 ) ;
Console. WriteLine ( @"El puerto " + Puerto_serie. PortName + @" no existe
o no lo encuentra." ) ;
Console. ReadKey ( ) ; // Pulse cualquier tecla para salir.
}
catch ( UnauthorizedAccessException e)
{
Console. WriteLine ( e) ;
}
Puerto_serie
. DataReceived += new SerialDataReceivedEventHandler
( DataReceivedHandler
) ;
Console. WriteLine ( "Esperando datos desde Arduino..." ) ;
Console. Read ( ) ;
Puerto_serie. Close ( ) ; // Cerrar puerto.
}
private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e)
{
try
{
SerialPort sp = ( SerialPort) sender;
int contador = 0 ;
string indata = sp. ReadExisting ( ) ; // A la espera que lea el tamaño del array "datosArray".
int cantidadBytes = int . Parse ( indata) ;
byte [ ] datosArray
= new byte [ cantidadBytes
] ;
Thread. Sleep ( 1000 ) ; // Retarde de un segundo para que no se colapse.
byte [ ] mBuffer = Encoding. ASCII . GetBytes ( "OK" ) ; // Codificación ASCII.
sp. Write ( mBuffer, 0 , mBuffer. Length ) ; // Envía OK al puerto serie.
while ( contador < datosArray. Length )
{
contador += sp. Read ( datosArray, contador, datosArray. Length - contador) ;
Console. SetCursorPosition ( 10 , 2 ) ;
Console. Write ( "Datos recibidos: {0}" , contador) ;
Console. WriteLine ( " " ) ;
if ( contador == cantidadBytes) // 17729.
{
Console. WriteLine ( ) ;
Console. WriteLine ( "Creando archivo al disco duro..." ) ;
File. WriteAllBytes ( "fotón.jpg" , datosArray) ; // Crear archivo en el disco duro.
Console. WriteLine ( ) ;
Console. WriteLine ( "Archivo creado. Ejecutando imagen." ) ;
Process. Start ( "fotón.jpg" ) ; // Ejecutar visualizador de imágenes.
Console. WriteLine ( ) ;
Console. WriteLine ( "Imagen ejecutada." ) ;
Console. WriteLine ( ) ;
Console. ForegroundColor = ConsoleColor. Yellow ; // Letras amarillas.
Console. WriteLine ( "FIN DE PROGRAMA." ) ;
Console. ForegroundColor = ConsoleColor. Gray ; // Letras grises otra vez.
}
}
}
catch ( FormatException)
{
// La cadena de entrada no tiene el formato correcto.
}
}
}
}
Saludos.
668
Programación / .NET (C#, VB.NET, ASP) / Re: Hacer cambios de este código.
en: 27 Enero 2017, 15:42 pm
Hola:
Este código C#.
int cantidadBytes = int . Parse ( "17729" ) ;
byte [ ] datosArray
= new byte [ cantidadBytes
] ; Por supuesto que es como este de abajo que haz puesto.
byte [ ] datosArray
= new byte [ int . Parse ( "17729" ) ] ; Desde el puerto serie me llega 17729 por poner un ejemplo. Y tiene que estar en la variable arriba llamada cantidadBytes.
Cuando me llegue los datos desde el puerto serie precisamente es 17729 como ejemplo.
¿Cómo lo hago?
Solo hay que cambiar el tamaño del array, en este caso el array se llama datosArray.
Quiero solo meter esos valors de 5 Bytes, si es menos como 29, se añadirán 00029. Porque no quiero que se me ponga como tañamo lainformación que pesa 17729, sino indique el tamaño del array que es 17729.
Cuando ya detecte que los 5 primeros Bytes sea el valor que sea y modifique el tamaño del array.
C# tiene que enviar a la placa de Arduino por puerto serie, un OK.
Desde que Arduino detecte el OK, ya puede recibir C# el peso de 17729 que en este caso es una foto.jpg como prueba, puede ser cualquier archivo.
Como me cuesta expresarme.
Saludos.
670
Programación / .NET (C#, VB.NET, ASP) / Re: Hacer cambios de este código.
en: 25 Enero 2017, 23:29 pm
Hola:
Lo que tengo hecho en Arduino y aún no está como debe estar es este.
// Enviar tramas de byte al puerto serie y LCD Keypad Shield.
#include <LiquidCrystal.h>
int estadoActual1 = 0 ;
int estadoActual2 = 0 ;
int estadoUltimo = 0 ;
char caracter;
String comando;
// Teide 22-02-2016.
PROGMEM const unsigned char rawData[ ] = {
0xFF , 0xD8 , 0xFF , 0xE1 , 0x00 , 0x18 , 0x45 , 0x78 , 0x69 , 0x66 , 0x00 , 0x00
} ;
// Inicializa la librería con sus pines indicados.
// RS, RW, Enable, D4, D5, D6, D7.
LiquidCrystal lcd( 8 , NULL, 9 , 4 , 5 , 6 , 7 ) ;
// Pin 10 para saber que es luz de fondo.
//int LuzFondo = 10
void setup( )
{
pinMode( 2 , INPUT) ; // Entrada digital donde está el pulsador.
// Baudios.
Serial.begin ( 115200 ) ;
// Formato de pantalla.
lcd.begin ( 16 , 2 ) ;
}
void enviarImagen( )
{
for ( unsigned int i = 0 ; i < sizeof ( rawData) ; ) // El i++ de aquí se quita.
{
Serial.write ( pgm_read_byte( & rawData[ i] ) ) ;
lcd.setCursor ( 0 , 0 ) ; // Posiciona el cursor donde quieras que se imprima la cantidad de bytes enviados.
// Procura dejar un espacio de entre 5 y 8 caracteres según la cantidad de dígitos a representar.
lcd.print ( ++ i) ;
}
}
void loop( )
{
estadoActual1 = digitalRead( 2 ) ; // Leer entrada digital número 2.
delay( 10 ) ;
estadoActual2 = digitalRead( 2 ) ;
if ( estadoActual1 == estadoActual2)
{
if ( estadoActual1 != estadoUltimo)
{
if ( estadoActual1 == HIGH)
{
Serial.write ( 0x51 ) ; // Envía 0x51 que es ARCHIVO_1_OK en C#.
}
}
}
estadoUltimo = estadoActual1;
/* Voy leyendo carácter a carácter lo que se recibe por el canal serie
(mientras lelgue algún datoallí), y los voy concatenando uno tras otro
en una cadena. En la práctica, si usamos el "Serial monitor" el bucle while
acabará cuando pulsamos Enter. Eldelay es conveniente para no saturar el
canal serie y que la concatenación se haga de forma ordenada.
*/
while ( Serial.available ( ) > 0 )
{
caracter = Serial.read ( ) ;
comando.concat ( caracter) ;
delay( 10 ) ;
}
/* Una vez ya tengo la cadena "acabada", compruebo su valor y hago que
la placa Arduino reacciones según sea este. Aquí podríamos hacer lo
que quisiéramos: si el comando es "tal", enciende un Led,si es cual,
mueve un motor... y así.
*/
if ( comando.equals ( 0x01 ) == true )
{
Serial.write ( "17729" ) ;
}
if ( comando.equals ( 0xA1 ) == true )
{
enviarImagen( ) ; // Enviar imagen o foto hacia el puerto serie al PC.
lcd.setCursor ( 0 , 1 ) ; // Crusor segunda línea del LCD.
lcd.print ( "Archivo: JPG " ) ;
}
// Limpiamos la cadena pra vovler a recibir el siguiente comando.
comando = "" ;
}
En C#:
using System ;
using System.Diagnostics ;
using System.IO ;
using System.IO.Ports ;
namespace Recibir_archivo_desde_Arduino_consola_02
{
class Program
{
// Comandos a enviar a Arduino.
public enum Arduino_Comandos
{
ARCHIVO_1 = 0x01,
ARCHIVO_2 = 0x02
}
// Respuestas de Arduino.
public enum Arduino_Respuestas
{
INFO = 0x50,
ARCHIVO_1_OK = 0x51,
ARCHIVO_2_OK = 0x52
}
static void Main( string [ ] args)
{
string COM = "" ;
// Tamaño ventana consola.
Console. WindowWidth = 55 ; // X. Ancho.
Console. WindowHeight = 15 ; // Y. Alto.
Console. Title = "Recoger foto desde Arduino y crearlo en el disco duro" ; // Título de la ventana.
// Crear un nuevo objeto SerialPort con la configuración predeterminada.
SerialPort Puerto_serie
= new SerialPort
( ) ;
// Configuración.
Console. Write ( @"
Introduzca un número para seleccionar puerto COM.
Por ejemplo el 4, sería COM4.
Puerto: " ) ;
COM = Console. ReadLine ( ) ; // Escribir el número del puerto.
Console. Clear ( ) ;
Puerto_serie. PortName = "COM" + COM; // Número del puerto serie.
Puerto_serie. BaudRate = 115200 ; // Baudios. 115200.
Puerto_serie. Parity = Parity. None ; // Paridad.
Puerto_serie. DataBits = 8 ; // Bits de datos.
Puerto_serie. StopBits = StopBits. Two ; // Bits de parada.
Puerto_serie. Handshake = Handshake. None ; // Control de flujo.
// Establecer la lectura / escritura de los tiempos de espera.
Puerto_serie. ReadTimeout = - 1 ; // 500.
Puerto_serie. WriteTimeout = - 1 ; // 500.
try
{
Puerto_serie. Open ( ) ; // Abrir el puerto serie.
}
catch ( IOException)
{
Console. ForegroundColor = ConsoleColor. Red ; // Texto en rojo.
Console. CursorVisible = false ;
Console. SetCursorPosition ( 16 , 6 ) ;
Console. WriteLine ( @"El puerto " + Puerto_serie. PortName + @" no existe
o no lo encuentra." ) ;
Console. ReadKey ( ) ; // Pulse cualquier tecla para salir.
}
catch ( UnauthorizedAccessException e)
{
Console. WriteLine ( e) ;
}
Puerto_serie
. DataReceived += new SerialDataReceivedEventHandler
( DataReceivedHandler
) ;
Console. WriteLine ( "Esperando datos desde Arduino..." ) ;
Console. Read ( ) ;
Puerto_serie. Close ( ) ; // Cerrar puerto.
}
private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e)
{
try
{
SerialPort sp = ( SerialPort) sender;
int contador = 0 ;
int cantidadBytes = int . Parse ( "17729" ) ;
byte [ ] datosArray
= new byte [ cantidadBytes
] ;
if ( /* Algo hay que poner aquí y no tengo idea. */ == 0x51)
{
byte [ ] miBuffer
= new byte [ 1 ] ; miBuffer[ 0 ] = 0x01;
sp. Write ( miBuffer, 0 , miBuffer. Length ) ;
}
while ( contador < datosArray. Length )
{
contador += sp. Read ( datosArray, contador, datosArray. Length - contador) ;
Console. SetCursorPosition ( 10 , 2 ) ;
Console. Write ( "Datos recibidos: {0}" , contador) ;
Console. WriteLine ( " " ) ;
if ( contador == 17729 ) // 17729.
{
Console. WriteLine ( ) ;
Console. WriteLine ( "Creando archivo al disco duro..." ) ;
File. WriteAllBytes ( "fotón.jpg" , datosArray) ; // Crear archivo en el disco duro.
Console. WriteLine ( ) ;
Console. WriteLine ( "Archivo creado. Ejecutando imagen." ) ;
Process. Start ( "fotón.jpg" ) ; // Ejecutar visualizador de imágenes.
Console. WriteLine ( ) ;
Console. WriteLine ( "Imagen ejecutada." ) ;
Console. WriteLine ( ) ;
Console. ForegroundColor = ConsoleColor. Yellow ; // Letras amarillas.
Console. WriteLine ( "FIN DE PROGRAMA." ) ;
Console. ForegroundColor = ConsoleColor. Gray ; // Letras grises otra vez.
}
}
}
catch ( TimeoutException)
{
//maybe increase ReadTimeout or something, use exponential backoff, your call
}
catch ( IOException)
{
// Console.WriteLine("La operación de E/S se anuló por una salida de subproceso o por una solicitud de aplicación.");
}
}
}
}
No se si te dirá algo.
Por ahora solo uso un pulsador para no volvernos locos, cuando todo funcione, pondré los otros dos pulsadores.
Si en Arduino pulsas el pulsador del pin 2, envía este código al PC y C# lo lee.
Serial.write ( 0x51 ) ; // Envía 0x51 que es ARCHIVO_1_OK en C#.
C# debe leer 0x51 que significa el pulsador 1.
Si C# detecta 0x51 desde Arduino, ejecuta esta instrucción y envía el valor 0x01.
(Es lo que me falta por corregir y no capto ideas). if ( /* Algo hay que poner aquí y no tengo idea. */ == 0x51)
{
byte [ ] miBuffer
= new byte [ 1 ] ; miBuffer[ 0 ] = 0x01;
sp. Write ( miBuffer, 0 , miBuffer. Length ) ;
}
Arduino lee 0x01 enviado desde C#. Como le llegó 0x01, pues Arduino le envía a C# el valor 17729, que es el valor donde debe ir el array llamado datosArray, ajusta el tamaño de dicho array en C#.
if ( comando.equals ( 0x01 ) == true )
{
Serial.write ( "17729" ) ;
}
Dejo claro que el programa no está completado y necesito orientación para completarlo.
Cuando ya reciba el dato 17729 en C#, el array ya tiene que tener este valor así.
int cantidadBytes = int . Parse ( "17729" ) ;
byte [ ] datosArray
= new byte [ cantidadBytes
] ; No se como se hace, cualquier ayuda en bienvenida.
Luego C# envía otro comando al acabar el redimensionado del array datosArray, este comando que debe enviar es 0xA0.
El código de Arduino se ejecuta esto.
if ( comando.equals ( 0xA1 ) == true )
{
enviarImagen( ) ; // Enviar imagen o foto hacia el puerto serie al PC.
lcd.setCursor ( 0 , 1 ) ; // Crusor segunda línea del LCD.
lcd.print ( "Archivo: JPG " ) ;
}
Por fin ya puede recoger C# dicha foto.
Saludos.