181
Programación / Programación C/C++ / Instalar esta librería en C++
en: 16 Marzo 2017, 06:23 am
Hola:
Quiero usar e instalar esta librería para Visual C++, concretamente Visual Studio Community 2017.
https://github.com/Gmatarrubia/LibreriasTutoriales Su código es este:
#include
#include
#include "SerialClass.h"
using namespace std;
void main ( ) {
Serial* Arduino = new Serial( "COM7" ) ;
while ( Arduino- > IsConnected( ) ) {
char palabra[ ] = "PalabraDelMundo" ;
cout << "Arduino conectado" << endl;
cout << "Enviando :" << palabra<< endl;
Arduino- > WriteData( palabra,sizeof ( palabra) - 1 ) ;
Sleep( 500 ) ;
Arduino- > ReadData( palabra,sizeof ( palabra) - 1 ) ;
cout << "Recibido: " << palabra<< endl;
cout << "-------------------" << endl;
Sleep( 1000 ) ;
}
Creo un proyecto nuevo.
Me crea este código.
Añado las librerías com indica abajo.
Lo mismo para la hora y lo refleja, tanto en cpp como en h indicado abajo.
Como que no detecta la librería.
¿En que fallo?
Un cordial saludo.
182
Programación / Java / Pasar de C# a Java. Código en modo consola
en: 16 Marzo 2017, 03:13 am
Hola:
Quiero pasar este código de C# a Java con NetBeans.
Instalar Java actualizado :
https://www.java.com/es/download/ Compilador NetBeans (En español), Java SE :
https://netbeans.org/downloads/index.html Tutorial sobre instalación del NetBeans y las librerías RxTx para controlar el puerto serie de Arduino :
https://es.slideshare.net/Metaconta2/interfaz-java-y-arduino Librería oficial RxTx solo para 32 bits :
http://rxtx.qbang.org/wiki/index.php/Download Librería alternativa RxTx de 32 y de 64 bits. Usaremos 64 bits. (Recomendado) :
http://jlog.org/rxtx-win.html El código de C# es este aquí abajo.
using System ;
using System.Text ;
using System.IO.Ports ;
using System.IO ;
using System.Diagnostics ;
using System.Threading ;
namespace Recibir_archivo_desde_Arduino_consola_06
{
class Program
{
static int cantidadBytes;
static StringBuilder sb
= new StringBuilder
( ) ;
static void Main( string [ ] args)
{
string COM = "" ;
// Título de la ventana.
Console. Title = "Recoger foto desde Arduino y crearlo en el disco duro" ;
// Tamaño ventana consola.
Console. WindowWidth = 55 ; // X. Ancho.
Console. WindowHeight = 18 ; // Y. Alto.
// 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. One ; // 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... \n " ) ;
Console. ReadKey ( ) ;
Puerto_serie. Close ( ) ; // Cerrar puerto.
}
private static void DataReceivedHandler( object sender, SerialDataReceivedEventArgs e)
{
try
{
SerialPort sp = ( SerialPort) sender;
string indata = sp. ReadExisting ( ) ;
string [ ] data = indata. Split ( 'A' ) ;
cantidadBytes = int . Parse ( data[ 0 ] ) ;
switch ( data[ 1 ] . ToString ( ) )
{
case "1" :
Console. WriteLine ( "Tamaño: " + cantidadBytes + " Bytes." ) ;
Console. WriteLine ( "Foto: " + data[ 1 ] + ". Tipo de archivo: JPG" ) ;
break ;
case "2" :
Console. WriteLine ( "Tamaño: " + cantidadBytes + " Bytes." ) ;
Console. WriteLine ( "Foto: " + data[ 1 ] + ". Tipo de archivo: PNG." ) ;
break ;
default :
Console. WriteLine ( "Cosas raras en 'data': " + data. ToString ( ) ) ; // Por si hal algún error.
break ;
}
int contador = 0 ;
byte [ ] datosArray
= new byte [ cantidadBytes
] ;
switch ( indata)
{
case "17729A1" :
Thread. Sleep ( 100 ) ; // Retardo.
byte [ ] miBuffer = Encoding. ASCII . GetBytes ( "OK1" ) ; // Codificación ASCII.
sp. Write ( miBuffer, 0 , miBuffer. Length ) ; // Envía OK1 al puerto serie.
break ;
case "2065A2" :
Thread. Sleep ( 100 ) ; // Retardo.
byte [ ] miBuffer2 = Encoding. ASCII . GetBytes ( "OK2" ) ; // Codificación ASCII.
sp. Write ( miBuffer2, 0 , miBuffer2. Length ) ; // Envía OK2 al puerto serie.
break ;
default :
Console. WriteLine ( "Cosas raras en 'indata': " + indata. ToString ( ) ) ; // Por si hal algún error.
break ;
}
while ( true )
{
contador += sp. Read ( datosArray, contador, datosArray. Length - contador) ;
Console. SetCursorPosition ( 10 , 6 ) ;
Console. Write ( "Datos recibidos: {0}" , contador + " Bytes." ) ;
Console. WriteLine ( " " ) ;
if ( ( contador == cantidadBytes) && ( contador == 17729 ) )
{
Mensaje1( ) ;
File. WriteAllBytes ( "fotón.jpg" , datosArray) ; // Crear archivo en el disco duro.
Mensaje2( ) ;
Process. Start ( "fotón.jpg" ) ; // Ejecutar visualizador de imágenes.
Mensaje3( ) ;
break ; // Garantiza que el ciclo termine.
}
if ( ( contador == cantidadBytes) && ( contador == 2065 ) )
{
Mensaje1( ) ;
File. WriteAllBytes ( "fotón.png" , datosArray) ; // Crear archivo en el disco duro.
Mensaje2( ) ;
Process. Start ( "fotón.png" ) ; // Ejecutar visualizador de imágenes.
Mensaje3( ) ;
break ; // Garantiza que el ciclo termine.
}
}
void Mensaje1( )
{
Console. WriteLine ( ) ;
Console. WriteLine ( "Creando archivo al disco duro..." ) ;
}
void Mensaje2( )
{
Console. WriteLine ( ) ;
Console. WriteLine ( "Archivo creado. Ejecutando imagen." ) ;
}
void Mensaje3( )
{
Console. WriteLine ( ) ;
Console. WriteLine ( "Imagen ejecutada." ) ;
Console. WriteLine ( ) ;
Console. WriteLine ( "Cabecera recibida: " + indata + "\n " ) ;
Console. ForegroundColor = ConsoleColor. Yellow ; // Letras amarillas.
Console. WriteLine ( "FIN DE PROGRAMA." ) ;
Console. ForegroundColor = ConsoleColor. Gray ; // Letras grises otra vez.
}
}
catch ( FormatException)
{
// System.FormatException: 'La cadena de entrada no tiene el formato correcto.'
}
}
}
}
En estos momentos estoy instalando la librería RxTx de 64 bits para Windwos 10 de 64 bits que es el que uso actualmente. El código de C# arriba fucniona de maravilla.
Esto de Java para adaptarme tardaré una eternidad, al menos se que el Hola mundo es Console.WriteLine("Hola mundo"); de C# es el equivalente a System.out.println("Hola mundo"); de Java.
Cualquier ayuda es bienvenida.
183
Programación / .NET (C#, VB.NET, ASP) / Cerrar y abrir la bandeja del lector con el botón manualmente, y que lo sepa C#
en: 15 Marzo 2017, 11:11 am
Hola:
Quiero cerrar y abrir la bandeja del lector de DVD con el botón manualmente, y que lo sepa C#. Estoy usando Visual Studio Community 2017.
En otro momento hicimos desde C#, controlar la bandeja abrirla y cerrarla pulsando los botones como indica en la interfaz de abajo.
Código fuente sencillo de C#:
using System ;
using System.Runtime.InteropServices ; // No olvidar.
using System.Text ;
using System.Windows.Forms ;
namespace Lector_discos_cs
{
public partial class Form1 : Form
{
public Form1( )
{
InitializeComponent( ) ;
}
[ DllImport( "winmm.dll" ) ]
public static extern Int32 mciSendString( string lpstrCommand, StringBuilder lpstrReturnString,
int uReturnLength, IntPtr hwndCallback) ;
StringBuilder rt
= new StringBuilder
( 127 ) ;
private void button_Abrir_Click( object sender, EventArgs e)
{
label_Mensaje. Text = "Abriendo..." ;
Application. DoEvents ( ) ;
mciSendString( "set CDAudio door open" , rt, 127 , IntPtr. Zero ) ;
label_Mensaje. Text = "Abierto" ;
}
private void button_Cerrar_Click( object sender, EventArgs e)
{
label_Mensaje. Text = "Cerrando..." ;
Application. DoEvents ( ) ;
mciSendString( "set CDAudio door closed" , rt, 127 , IntPtr. Zero ) ;
label_Mensaje. Text = "Cerrado" ;
}
}
}
Hasta aquí todo bien.
Ahora quiero hacer, saber antes que nada, si es posible que al meter la bandeja con la mano o pulsar el botón físicamente del lector, C# puede saber su estado, cunado está abierto y cuando está cerrado.
En este caso, no hay botones para Windows Form de C#, solo un label que indica el estado "ABIERTO" y "CERRADO".
¿Es posible hacerlo?
Si es así. ¿Cómo se hace?
Lo único que pensé que este
enlace valdría la pena o te daba información, pero es otra cosa.
Que tengan buena semana.
185
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.
186
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.
188
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.
190
Programación / .NET (C#, VB.NET, ASP) / Hacer cambios de este código.
en: 25 Enero 2017, 03:05 am
Hola:
Tengo este código de abajo que funciona bien. Lo que hace es, al recibir algún dato por el puerto serie, me lo almacena en un array y guarda el archivo en el disco duro. Hecho en C#.
using System ;
using System.Diagnostics ;
using System.IO ;
using System.IO.Ports ;
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 ;
byte [ ] datosArray
= new byte [ 17729 ] ; // Aquí tengo que cambiar el valor cuando recibo datos desde el 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 == 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.");
}
}
}
}
Quiero tener ideas para modificar este programa.
Los datos del puerto serie puede llegar desde Arduino o desde otro PC. Como llega desde Arduino en este caso, tiene dos botones, si pulsa el primer botón, C# recibe ciertos comandos que son estos:
Si en Arduino presiono el primer botón, C# le llega este número de 5 Bytes en este caso, 17729. Ese valor tiene que incluirse aquí, en esta parte del código indicado abajo.
byte [ ] datosArray
= new byte [ 17729 ] ; Como puedes ver, he puesto manualmente el valor de este array 17729.
¿Cómo hago que al detectar cualquier valor, en este caso 17729 sea para el array datosArray?
Digo 17729 como ejemplo, si le llega 478, pues que sea 478.
Lo que no entiendo que luego de llegar 17729, que son solo 5 dígitos, llegará de inforamación 17729 Bytes detrás.
Si no haz entendido algo, preguntar para explicarlo de otra manera.
Saludos.