¿Cómo puedo enviar caracteres nulos al puerto serie utilizando la API de Windows?

StackOverflow https://stackoverflow.com/questions/387322

  •  23-08-2019
  •  | 
  •  

Pregunta

Estoy trabajando en un programa de utilidad de Windows que se comunica con un poco de hardware personalizado mediante un puerto COM estándar. El protocolo de comunicación (que está fuera de mi control) me obliga a transmitir y recibir primas bytes de datos de 8 bits.

Actualmente estoy usando la siguiente función API de Windows para enviar datos al puerto COM:

WriteFile(hFile, lpBuffer, numberOfBytesToWrite, ...)

donde hFile es una referencia al puerto COM abierto correctamente, y lpBuffer es una matriz de bytes que he almacenados en la memoria. El código funciona perfectamente hasta que un carácter nulo (ASCII cero) debe ser enviado al dispositivo. WriteFile deja de enviar tan pronto como se detecta el carácter nulo porque se supone que se ha llegado al final de la cadena. Esto sucede a pesar de que me puse numberOfBytesToWrite correctamente.

¿Cómo puedo enviar datos sin procesar al puerto COM utilizando la API de Windows? Yo prefiero usar una llamada a la API estándar similar a WriteFile, pero estoy abierto a sugerencias.

Actualmente estoy usando RapidQ para construir la utilidad, pero lo único que hace es llamar a la función API de Windows directamente.

Editar: Mi configuración consiste en un PC con Windows conectado a través del puerto serie al módulo de hardware personalizado. El módulo tiene una pequeña pantalla en la que soy capaz de ver los caracteres transmitidos. He comprobado esta configuración con otro programa de utilidad de terceros. Soy capaz de comunicarse con el módulo de utilizar este programa de terceros, y los caracteres nulos muestro correctamente. En mi propio programa, cuando uso WriteFile, un carácter nulo en cualquier parte de la corriente de transmisión deja los restos de la corriente de ser enviado.

¿Fue útil?

Solución

He hecho la programación del puerto serie de Windows antes, y estoy seguro de que he sido capaz de enviar caracteres nulos a través de los puertos serie (varios protocolos de transferencia de archivos no se han preparado de otra forma). Se me ocurren dos explicaciones posibles:

  1. La recibir dispositivo está imprimiendo los datos que recibió usando un método que se detiene en la primera carácter nulo. ¿Cómo estás determinar que el dispositivo de transmisión se termina en el primer nulo? El problema podría estar en algún lugar más abajo de la línea?
  2. El controlador serie está roto. Esto es bastante improbable, pero es una posible explicación. Si está utilizando un puerto serie dudosa propiedad de terceros y sus conductores, entonces podrían ser sospechosos. Si está utilizando un estándar incorporado un puerto serie con los conductores normales de Windows, entonces esto probablemente no es un problema.

acabo de tener un rápido vistazo a RapidQ y hay una tercera explicación posible:

  1. El cálculo de referencias que RapidQ puede hacer en el proceso de llamar a funciones API de Win32 pueden tener problemas con caracteres nulos incrustados en los datos a enviar. No sé nada acerca de RapidQ, pero sin embargo, este es otro eslabón de la cadena que debe ser considerado.

Otros consejos

Greg es probablemente correcta, pero también sería comprobar la configuración del puerto COM. Asegúrese de que la configuración de DCB se han establecido correctamente. Busque SetCommState y GetCommState para obtener información.

Normalmente, es de serie 8N1, pero el dispositivo podría estar utilizando algún otro paridad, o dejar de configuración de bits, etc.

Al igual que Greg, he hecho un montón de trabajo a lo largo de serie a mí mismo, y esto a menudo puede ser la fuente de los problemas ... Trate de hablar con RS485 y una estructura DCB incorrectos ... je ..

Larry

PS: Si usted no tiene ya uno, te recomiendo conseguirse una buena caja de conexiones en serie. Tengo uno en alguna parte alrededor de la casa, y que va a mostrar lo que todas las señales son, en todas las líneas durante todas sus comunicaciones, y es una muy poderosa herramienta de depuración.

He utilizado escritura de archivo en el pasado y ha funcionado bien con bytes nulos. Me cavar en RapidQ, que podría ser el problema.

Si nada de esto ayuda, siempre se puede hacer lo que hago. Utilice el código COMM de Greg para probar el dispositivo con. Recuerde Qmodem? :) herramienta muy agradable para las rutinas de serie de pruebas / depuración. Usted ccould incluso utilizar Qmodem y un simple script Qmodem para leer el puerto COM en otra caja (u otro puerto en la misma caja), e imprimir el valor hexadecimal de cada char enviado. Oh espera. Qmodem tiene eso incorporada. :) utilizar la emulación de depuración ASCII y mostrará los valores hexadecimales de cada carbón que viene a través del puerto serie. Entonces, al menos podrías verificar si su código está funcionando correctamente o no.

Ahora, la pregunta. Hace retorno de escritura de archivo cuando golpea el NULL, o solo sentarse y esperar, y no volver nunca?

Si no vuelve, entonces puede que no sea su código. WriteFile sólo devuelve cuando se ha enviado toda dwBytesToWrite, o si hay un error. Cualquier otra cosa, y que está tratando de escribir, pero hay un fallo en el otro extremo.

Para enviar un carácter nulo a través de serie que puede utilizar la función SetEndOfFile (), dando el controlador de puerto como archivo.

Si usted tiene demasiados datos NULL para enviar probablemente no es ideal, pero es una solución temporal.

detalles de función

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top