C/Visual C - Error en visual c++ con afxwin1.inl

 
Vista:

Error en visual c++ con afxwin1.inl

Publicado por LOCO (1 intervención) el 16/10/2002 17:13:02
Estoy creando una dll de comunicaciones donde ataco el puerto serie a traves de las apis de windows de writefile y readfile. Utilizo los eventos de windows y las funciones waitmultipleobjects i waitcommevent. Utilizo esta dll con un programa de visual basic que se comunica con una interficie. Con setcommask creo el evento que se active cada caracter que lee en el buffer de la uart. El problema es que si la aplicación abre un puerto que no toca o una velocidad que no toca con que reintenta al cabo de un cierto tiempo peta y el error que genera es error:afxwin1.inl linea 22. He editado el fichero y he encontrado que este error es debido a la llamada de un recurso que no se ha creado aun. En canvio si setcommask lo canvio el evento para que detecte por un caracter determinado no me peta. Esta seria una buena solución pero no me sirve pues no todas las tramas tienen el mismo caracter de final. ¿A que es debido esto y como lo puedo solucionar? ¿Se pueden crear un evento que responda a dos caracters diferentes de final de trama?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Alejandro

Manejo de eventos en comunicación serial y errores en AFXWIN1.INL

Publicado por Alejandro (913 intervenciones) el 27/03/2025 16:50:37

Problema:


El error que estás experimentando en `afxwin1.inl` línea 22, que indica que se está intentando acceder a un recurso que no se ha creado, puede estar relacionado con la forma en que estás manejando los eventos de comunicación serial y la configuración del puerto. Esto puede suceder si intentas acceder a un recurso de Windows antes de que esté completamente inicializado o si hay un problema con la configuración del puerto.

Soluciones propuestas:



1. Verificación de la configuración del puerto:
Asegúrate de que el puerto serie se esté configurando correctamente antes de llamar a `SetCommMask`. Verifica que el puerto esté abierto y que la velocidad de baudios y otros parámetros sean correctos. Puedes agregar un manejo de errores más robusto para asegurarte de que cualquier intento de abrir un puerto que no esté disponible o que tenga una configuración incorrecta sea manejado adecuadamente.

1
2
3
4
5
HANDLE hComm = CreateFile(portName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
if (hComm == INVALID_HANDLE_VALUE) {
    // Manejo de error: el puerto no se pudo abrir
    return;
}

2. Uso de eventos de Windows:
Si estás utilizando `SetCommMask` para activar eventos en función de la recepción de caracteres, considera implementar un bucle de lectura que verifique el buffer de entrada y maneje los caracteres de final de trama de manera más flexible. En lugar de depender de un solo carácter, puedes leer el buffer y buscar múltiples caracteres de final de trama.

3. Manejo de múltiples caracteres de final de trama:
Puedes implementar un sistema que lea los datos del puerto serie y almacene los caracteres en un buffer. Luego, puedes verificar si el buffer contiene alguno de los caracteres de final de trama que estás buscando. Aquí hay un ejemplo básico:

1
2
3
4
5
6
7
8
9
10
11
char buffer[256];
DWORD bytesRead;
while (true) {
    if (ReadFile(hComm, buffer, sizeof(buffer), &bytesRead, NULL)) {
        for (DWORD i = 0; i < bytesRead; i++) {
            if (buffer[i] == '\n' || buffer[i] == '\r') { // Ejemplo de dos caracteres de final de trama
                // Procesar la trama
            }
        }
    }
}

4. Uso de WaitForMultipleObjects:
Asegúrate de que estás utilizando `WaitForMultipleObjects` correctamente para esperar a que se produzcan eventos. Si estás esperando eventos de comunicación, asegúrate de que el evento se haya creado y esté asociado correctamente con el puerto serie.

5. Depuración:
Utiliza herramientas de depuración para rastrear el flujo de tu aplicación y ver en qué punto exacto se produce el error. Esto puede ayudarte a identificar si hay un problema con la inicialización de recursos o con la lógica de manejo de eventos.

Conclusión


El manejo de la comunicación serie puede ser complicado, especialmente cuando se trata de eventos y múltiples caracteres de final de trama. Asegúrate de que todos los recursos estén correctamente inicializados y considera implementar un sistema de buffer para manejar múltiples caracteres de final de trama. Si el problema persiste, revisa el flujo de tu aplicación y utiliza herramientas de depuración para identificar el origen del error.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar