Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - kondrag_X1

#21
muy currado yo estudié redes neuronales en la carrera y no tiene nada que ver la orientación que se le da en practicas y teoria con las aplicaciones que puede tener
#22
Hola estoy desarrollando una implementación de Modbus master basándome en el estándar de Freemodbus, el cual lo podeis descargar en el siguiente link -> http://www.freemodbus.org/index.php?idx=5

mi pregunta es que hay parte del código que no consigo entender.

me defino un tipo de función con typedef eMBErrorCode etc

/* ----------------------- Prototypes  0-------------------------------------*/
typedef void    ( *pvMBFrameStart ) ( void );

typedef void    ( *pvMBFrameStop ) ( void );

typedef eMBErrorCode( *peMBFrameReceive ) ( UCHAR * pucRcvAddress,
                                           UCHAR ** pucFrame,
                                           USHORT * pusLength );

typedef eMBErrorCode( *peMBFrameSend ) ( UCHAR slaveAddress,
                                        const UCHAR * pucFrame,
                                        USHORT usLength );

typedef void( *pvMBFrameClose ) ( void );



Luego desde la máquina de estados llamo a las funciones:


/* Functions pointer which are initialized in eMBInit( ). Depending on the
* mode (RTU or ASCII) the are set to the correct implementations.
*/
static peMBFrameSend peMBFrameSendCur;
static pvMBFrameStart pvMBFrameStartCur;
static pvMBFrameStop pvMBFrameStopCur;
static peMBFrameReceive peMBFrameReceiveCur;
static pvMBFrameClose pvMBFrameCloseCur;

eMBErrorCode
eMBPoll( void ) {
   static UCHAR   *ucMBFrame;
   static UCHAR    ucRcvAddress;
   static UCHAR    ucFunctionCode;
   static USHORT   usLength;
   static eMBException eException;

   int             i;
   eMBErrorCode    eStatus = MB_ENOERR;
   eMBEventType    eEvent;

   /* Check if the protocol stack is ready. */
   if ( eMBState != STATE_ENABLED ) {
       return MB_EILLSTATE;
   }

   /* Check if there is a event available. If not return control to caller.
    * Otherwise we will handle the event. */
   if ( xMBPortEventGet( &eEvent ) == TRUE ) {
       switch ( eEvent ) {
           case EV_READY:
               break;

           case EV_FRAME_RECEIVED:
               eStatus = peMBFrameReceiveCur( &ucRcvAddress, &ucMBFrame, &usLength );
               if ( eStatus == MB_ENOERR ) {
                   /* Check if the frame is for us. If not ignore the frame. */
                   if ( ( ucRcvAddress == ucMBAddress ) || ( ucRcvAddress == MB_ADDRESS_BROADCAST ) ) {
                       ( void )xMBPortEventPost( EV_EXECUTE );
                   }
               }
               break;

           case EV_EXECUTE:
               ucFunctionCode = ucMBFrame[MB_PDU_FUNC_OFF];
               eException = MB_EX_ILLEGAL_FUNCTION;
               

               for ( i = 0; i < MB_FUNC_HANDLERS_MAX; i++ ) {
                   /* No more function handlers registered. Abort. */
                   if ( xFuncHandlers[i].ucFunctionCode == 0 ) {
                       break;
                   } else if ( xFuncHandlers[i].ucFunctionCode == ucFunctionCode ) {
                       eException = xFuncHandlers[i].pxHandler( ucMBFrame, &usLength );
                       break;
                   }
               }

               /* If the request was not sent to the broadcast address we
                * return a reply. */
               if ( ucRcvAddress != MB_ADDRESS_BROADCAST ) {
                   if ( eException != MB_EX_NONE ) {
                       /* An exception occured. Build an error frame. */
                       usLength = 0;
                       ucMBFrame[usLength++] = ( UCHAR )( ucFunctionCode | MB_FUNC_ERROR );
                       ucMBFrame[usLength++] = eException;
                   }
                   eStatus = peMBFrameSendCur( ucMBAddress, ucMBFrame, usLength );
               }
               break;

           case EV_FRAME_SENT:
               break;
       }
   }
   return MB_ENOERR;
}


el problema es que no encuentro la implementación de donde se trata la función peMBFrameSendCur. Alguien sabe como está estructurado el código?
#24
Programación C/C++ / Re: numero aleatorio
28 Noviembre 2015, 19:29 PM
ivancea96 +1  ;-)
#25
un cinc para hacerte unas gafas del sol de madera  ::)
#26
a ver, cuando tienes un socket haces una conexión a esa conexión se le asigna un número pero antes has de decirle a donde te quieres conectar, es decir, indicar la dirección del servidor.

Ten encuentra que para servidores no es necesario porque ellos están escuchan y aceptan clientes mientras que los clientes si tienes que conocer previamente la dirección del servidor.

te recomiendo que te mires la capa de protocolos TCP/IP para que lo entiendas mejor.
#27
Hola,

Te comento un poco a grandes rasgos lo que he visto:

tienes esta parte repetida encima del while y dentro:


socket_cliente[host]=accept(socket_servidor,(struct sockaddr *)&cliente[host],&clilong);
if(socket_cliente[host]<0){
printf("Error aceptando el trafico con el host %s\n",
inet_ntoa(cliente[host].sin_addr));
close(socket_cliente[host]);
close(socket_servidor);
return 1;
}
else
printf("Conectado con el host %s\n",inet_ntoa(cliente[host].sin_addr));
host++;
FD_ZERO(&desc);
FD_SET(socket_servidor,&desc);
for(c=0;c<host;c++)
FD_SET(socket_cliente[c],&desc);


lo primero que yo te aconsejaría es que si escribes un if{} el else que también tengo las llaves {} así evitaras confusiones.

la segunda cosa que veo rara es que solo incrementas el número de host cuando aceptas la primera conexión, es decir, dentro del while aceptas pero no incrementas el contador de host o yo no he visto donde esta el host++; como en el fragmento de arriba.

Si yo fuese tu interaria aceptar las conexiones dentro del while te simplificará mucho la tarea.

espero haberte ayudado. :silbar:
#28
tienen buena pinta.
ya me imagino que no solo es la electrónica además hay todavia no se si hacer con una FPGA. tirando de micro.
#29
Si si muy cerrado el tuto, desde luego. En el tuto la cosa es muy sencilla pero cuando quieres hacer algo mas currado hay que implementar una trama en RS232 por ejemplo:
#cabecera$datos$crc# y una maquina de estados en el pics pero para iniciarse esta al pelo.

me a gustado tienes muchas ideas del estilo en mente? YO quiero hacerme mi dron propio pero tranquilamente y con tiempo.
#30
Buen tuto Meta básico pero me ha gustado sobre todo para los que empiezan con Arduino y usar C# facilita en gran medida la comunicación cosa que con otros lenguajes como java o c es mas tedioso.

un saludo.