Red de conocimiento informático - Material del sitio web - Cómo implementar la comunicación del puerto COM en la PC

Cómo implementar la comunicación del puerto COM en la PC

Aturdido.... Si te doy el código de Linux, le preguntas a Windows. Si te doy el método de control del puerto serie de Windows, te lo preguntas a Linux.

Hay una gran diferencia. Dos sistemas operativos diferentes tienen diferentes aplicaciones de puertos serie, pero en general, todavía tienen los mismos puntos: 1. Configurar el puerto serie, 2. Abrir el puerto serie. 3. Leer y escribir datos, 4. Manejo de excepciones, 5. Cerrar el puerto serie

La lógica de control de esta serie es aproximadamente la misma, pero existen diferencias en la implementación del código. Después de todo, las estructuras del núcleo. de los dos sistemas operativos son diferentes, las propiedades de configuración del puerto serie de Linux se implementan a través de la estructura struct termios del archivo de encabezado #include lt; termios.hgt;, mientras que las propiedades del puerto serie de Windows se configuran mediante la estructura commprop. Otros puertos serie de lectura y escritura tienen funciones de archivos de lectura y escritura correspondientes. Ambos sistemas tratan el puerto serie como un archivo de dispositivo para leer y escribir, por lo que no es difícil entender por qué se utilizan funciones de archivo para procesar el puerto serie. En Linux, puede utilizar las funciones de la biblioteca C estándar para controlar la lectura y escritura del puerto serie. En Windows, puede utilizar las funciones API de WINDOWS para leer y escribir en el puerto serie. Para obtener más información, consulte la "Enciclopedia API de Windows" y la dirección de referencia. se proporciona a continuación, que también tiene instrucciones detalladas

No es difícil implementar la comunicación del puerto COM en una PC, pero debe explicar claramente qué sistema operativo es. Los diferentes sistemas operativos tienen grandes diferencias en el control del puerto serie. puerto.

Hay tres formas de operar el puerto serie en sistemas Windows: control MSCOMM, API de WINDOWS y control de terceros

La API de WINDOWS es relativamente problemática de usar, principalmente para configurar el puerto serie propiedades del puerto, lectura de consultas y manejo de excepciones. Aquí hay una breve descripción de los pasos para controlar el puerto serie:

1 Abra el puerto serie:

Utilice createfile() para abrir el puerto serie y createfile() lo hará. Devuelve el identificador del puerto serie.

handle createfile(

lpctstr lpfilename, // puntero al nombre del archivo

dword dwdesiredaccess, // acceso al modo (lectura-escritura)

dword dwsharemode, // modo compartir

lpsecurity_attributes lpsecurityattributes, // puntero a atributos de seguridad

dword dwcreationdistribution, // cómo crear

dword dwflagsandattributes, // atributos del archivo

maneja htemplatefile // maneja el archivo con atributos para copiar

lpfilename: especifica la preparación del puerto serie, por ejemplo: com1, com2

dwdesiredaccess: especifica el método de acceso al puerto serie, por ejemplo: generic_read|generic_write

dwsharemode: especifica el método para compartir el puerto serie

lpsecurityattributes: especifica la seguridad del puerto serie Estructura de atributos, nulo es el atributo de seguridad predeterminado

dwcreateiondistribution: debe ser open_existin

dwflagandattributes: el único significativo para el puerto serie es file_flag_overlapped

htemplatefile: debe ser nulo

2. Cierre el puerto serie:

closehandle(hcommdev);

3. p>

bool setupcomm(

p>

handle hfile, // identificador del dispositivo de comunicaciones

dword dwinqueue, // tamaño del buffer de entrada

dword dwoutqueue // tamaño del buffer de salida

);

4.commprop estructura:

Puede usar getcommproperties() para obtener la estructura commprop. La estructura commprop registra varias configuraciones admitidas por el sistema.

typedef struct _commprop { // cmmp

palabra wpacketlength; // tamaño del paquete, en bytes

palabra wpacketversion // versión del paquete

dword dwservicemask; // servicios implementados

dword dwreserved1; // reservado

dword dwmaxtxqueue; // max tx bufsize, en bytes

dword dwmaxrxqueue; // tamaño máximo de buf rx, en bytes

dword dwmaxbaud; // velocidad máxima en baudios, en bps

dword dwprovsubtype // tipo de proveedor específico

dword dwprovcapabilities ; // capacidades admitidas

dword dwsettableparams; // parámetros modificables

dword dwsettablebaud; // velocidades de baudios permitidas

word wsettabledata; /p>

word wsettablestopparity; // bits de parada/paridad permitida

dword dwcurrenttxqueue; // tamaño del búfer de transmisión, en bytes

dword dwcurrentrxqueue; en bytes

dword dwprovspec1; // datos específicos del proveedor

dword dwprovspec2; // datos específicos del proveedor

wchar wcprovchar[1]; -datos específicos

} commprop;

dwmaxbaud:

baud_075 75 bps

baud_110 110 bps

baud_134_5 134,5 bps

baud_150 150 bps

baud_300 300 bps

baud_600 600 bps

baud_1200 1200 bps

baud_1800 1800 bps

baud_2400 2400 bps

baud_4800 4800 bps

baud_7200 7200 bps

baud_9600 960

0 bps

baud_14400 14400 bps

baud_19200 19200 bps

baud_38400 38400 bps

baud_56k 56k bps

baud_57600 57600 bps

baud_115200 115200 bps

baud_128k 128k bps

baud_user velocidades en baudios programables disponibles

dwprovsubtype:

pst_fax dispositivo de fax

protocolo pst_lat lat

dispositivo módem pst_modem

pst_network_bridge puente de red no especificado

puerto paralelo pst_parallelport

pst_rs232 puerto rs-232

pst_rs422 puerto rs-422

pst_rs423 puerto rs-432

pst_rs449 puerto rs-449

pst_scanner dispositivo escáner

pst_tcpip_telnet protocolo telnet tcp/ip

pst_unspecified no especificado

pst_x25 x.25 estándar

dwprovcapabilities

pcf_16bitmode admite el modo especial de 16 bits

pcf_dtrdsr admite dtr (terminal de datos listo)/dsr (dispositivo de datos listo)

pcf_inttimeouts admite tiempo de espera de intervalo

pcf_parity_check admite comprobación de paridad

pcf_rlsd admite rlsd (detección de señal de línea de recepción)

pcf_rtscts admite rts (solicitud de envío)/cts (borrado de envío)

pcf_setxchar Admite configuración xon/xoff

pcf_specialchars admite caracteres especiales

pcf_totaltimeouts admite tiempo de espera total (tiempo ocupado)

pcf_xonxoff admite control de flujo xon/xoff

RS-232 estándar y Windows admiten todas las funciones excepto pcf_16bitmode y pcf_specialchar

dwsettableparams

sp_baud velocidad en baudios configurable

sp_databits configurable Número de bits de datos

sp_handshaking Protocolo de enlace configurable (control de flujo)

sp_parity Modo de paridad configurable

sp_parity_check Permitir/deshabilitar paridad configurable

sp_rlsd puede configurar rlsd (detección de señal de recepción)

sp_stopbits puede configurar el número de bits de parada

El estándar rs-232 y la ventana admiten todas las funciones anteriores

ws

ettabledata

databits_5 5 bits de datos

databits_6 6 bits de datos

databits_7 7 bits de datos

databits_8 8 bits de datos

databits_16 16 bits de datos

ruta de ancho especial databits_16x a través de la línea de hardware serie

Windows 95 admite todas las configuraciones de 16

Estructura 5 .dcb:

typedef struct _dcb {// dcb

dword dcblength; // sizeof(dcb)

dword baudrate; // velocidad en baudios actual

Especificar la velocidad en baudios actual

dword fbinary: 1; // modo binario, sin verificación eof

Especifique si se permite el modo binario,

Debe ser verdadero en Windows 95

dword fparity: 1; // habilitar la verificación de paridad

Especificar si se permite la verificación de paridad

dword foutxctsflow: 1 // control de flujo de salida de cts <; /p>

Especifica si se utiliza cts para detectar el control de envío.

Cuando es verdadero y cts está desactivado, se suspenderá el envío.

dword foutxdsrflow: 1; // control de flujo de salida dsr

Especifica si cts se utiliza para detectar el control de envío.

Cuando es verdadero y cts está desactivado, se suspenderá el envío.

dword fdtrcontrol: 2; // tipo de control de flujo dtr

El valor dtr_control_disable desactiva dtr, el valor dtr_control_enable activa dtr, dtr_control_handshake permite dtr "apretón de manos", dword fdsrsensitivity : 1; // sensibilidad de dsr Cuando este valor es verdadero, los bytes recibidos cuando dsr está desactivado se ignoran

dword ftxcontinueonxoff: 1; // xoff continúa tx

Especifica cuándo se recibe el búfer está lleno y el controlador ha enviado

Si el envío debe detenerse cuando se envían caracteres xoffchar.

Cuando es verdadero, el envío continúa después de que el búfer de recepción recibe el byte xofflim lleno del búfer y el controlador ha enviado el carácter xoffchar para cancelar la recepción de bytes.

Cuando es falso, el envío continúa después de que el búfer de recepción recibe el byte xonchar, lo que indica que el búfer está vacío y el controlador ha enviado el xonchar para reanudar el envío.

dword foutx: 1; // control de flujo de salida xon/xoff

Cuando es verdadero, dejará de enviar después de recibir xoffchar

Después de recibir xonchar, lo hará reiniciar Inicio

dword finx: 1; // xon/xoff en control de flujo

Cuando es verdadero, después de que el búfer de recepción recibe xofflim indicando que el búfer está lleno, se envía xoffchar

Después de que el búfer de recepción recibe xonlim, lo que indica que el búfer está vacío, se envía xonchar

dword ferrorchar: 1 // habilitar el reemplazo de errores

Este valor es verdadero; y fparity Cuando sea verdadero, use los caracteres especificados por el miembro errorchar para reemplazar los caracteres recibidos con errores de paridad

dword fnull: 1; // habilitar la eliminación de nulos

Cuando sea verdadero, elimine el null (valor 0) byte

dword frtscontrol: 2; // control de flujo rts

Cuando rts_control_disable, rts está desactivado

Cuando rts_control_enable, rts está establecido en activado

Cuando rts_control_handshake,

Cuando el búfer de recepción está lleno a menos de la mitad, rts está activado

Cuando el búfer de recepción está más de tres cuartos lleno, rts está desactivado

Cuando rts_control_toggle,

Cuando todavía quedan bytes en el búfer de recepción, rts está activado; de lo contrario, el valor predeterminado está desactivado

dword fabortonerror: 1; // cancelar lecturas/escrituras en caso de error

Cuando es verdadero, las operaciones de lectura y escritura se cancelan cuando ocurre un error

dword fdummy2: 17 // reservado

No usado

p>

palabra reservada; // no usado actualmente

No usado, debe ser 0

palabra xonlim; / umbral de transmisión de xon

Especificado en El número mínimo de bytes permitidos en el búfer de recepción antes de que se envíe el carácter xon

palabra xofflim // umbral de transmisión de xon

> Especifica el número de bytes permitidos en el búfer de recepción antes de enviar el carácter xoff. Número mínimo de bytes permitidos

byte bytesize; // número de bits/byte, 4-8

Especifique los bits de datos utilizados actualmente por el puerto

paridad de bytes; // 0-4=no, impar, par, marca, espacio

Especifica el método de verificación de paridad utilizado actualmente por el puerto especificado, que puede ser:

paridad paridad, marcaparidad, noparidad, paridad impar

bits de parada de bytes // 0, 1, 2 = 1, 1,5, 2

El puerto especificado está actualmente

El número de bits de parada utilizados puede ser:

onestopbit, one5stopbits, twostopbits

char xonchar; // tx y rx xon caracter

Especificado para envío y Recibir valor xon del carácter

char xoffchar; // tx y rx carácter xoff

Especifique el valor xoff del carácter para enviar y recibir

char errorchar // error; carácter de reemplazo

Este carácter se utiliza para reemplazar el valor de la verificación de paridad recibida cuando ocurre un error

char eofchar // fin del carácter de entrada

Cuándo Cuando no se utiliza el modo binario, este carácter se puede utilizar para indicar el final de los datos

char evtchar; // carácter de evento recibido

Cuando se recibe este carácter, se generará un evento. generado

palabra wreserved1; // reservado; no usar no usado

} dcb

6. los dos métodos siguientes

bool getcommstate(hcomm, amp; dcb);

bool setcommstate(hcomm, amp; dcb);

buildcommdcb(szsettings, amp; dcb);

El formato de szsettings: parada de datos de paridad en baudios

Ejemplo: "baud=96 parity=n data= 8 stop=1 "

Abreviatura: "96;, n, 8, 1"

Valores válidos para szsettings

baud:

11 o 110 = 110 pb

15 o 150 = 150 pb

30 o 300 = 300 pb

60 o 600 = 600 pb

p>

12 o 1200 = 1200 bps

24 o 2400 = 2400 bps

48 o 4800 = 4800 bps

96 o 9600 = 9600 bps

19 o 19200= 19200bps

paridad:

n=ninguna

e=par

o= impar

m=marca

s=espacio

datos:

5, 6, 7, 8

stopbit

1, 1.5, 2

8.commconfig estructura:

typedef struct _comm_config {

dword dwsize

palabra wv

ersión;

palabra reservada

dcb dcb;

dword dwprovidersubtype;

dword dwprovideroffset; dwprovidersize;

wchar wcproviderdata[1];

} commconfig, *lpcommconfig

Bool commconfigdialog(

lptstr lpszname,

p>

hwnd hwnd,

lpcommconfig lpcc

para configurar el puerto serie.

9. Configuración del tiempo de espera:

El tiempo de espera se puede configurar a través de la estructura commtimeouts,

typedef struct _commtimeouts {

dword readintervaltimeout;

El texto original hace referencia a "Implementación de VC de rutinas de comunicación de puerto serie" Autor: Ruan Bangqiu

/Visual-C/2007-3-22/VC-ShiXianChuanKouTongShenLiChengZuoZhe-RuanBangQiu-bbjm10723 .htm

Recuerde hacer las preguntas una por una la próxima vez. Incluso ayudarle a encontrar información es más conveniente.