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 p>
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.