Ejemplo de programa de comunicación serie VB
También exploro y desarrollo cada comunicación VBtoCOM por mi cuenta. Las ideas específicas son las siguientes:
Le recomiendo una herramienta: "Herramienta de prueba de puerto serie COM ComTone V1.0 chino. Versión Verde”
1. Abra el software de prueba de su medidor de ruido, ajuste el número de puerto serie, la frecuencia de comunicación, etc. Usaré un termómetro como ejemplo.
Después de iniciar la consulta, se devuelve un valor. Esta recepción: es el valor devuelto 000304012200004b05,
Abra el asistente de monitoreo del puerto serie y monitoree el evento del puerto COM del software:
Esta escritura interna es el comando de consulta emitido por el software de prueba, y la lectura es el comando de datos devuelto por el dispositivo. ¿Privado?Sub?Command1_Click()?'Enviar comando.
If?Not?MSComm1.PortOpen?Then MSComm1.CommPort?= ?7?'El puerto serie es 7 MSComm1.Settings?=?"9600,n,8,1" MSComm1.InBufferCount?=?0?'Borrar la recepción buffer MSComm1.OutBufferCount?=?0?'Borrar el buffer de envío MSComm1. InputMode?=?comInputModeBinary?'Recepción binaria MSComm1.InputLen?=?0?'Leer todos los caracteres en el buffer de recepción MSComm1.PortOpen?=?True?' Abra el puerto serie MSComm1.RTSEnable?=?False?'Establecer en estado de envío
End?If
Dim?pu()?As?Byte
Dim?strdata?As?String
Dim?crc_js ()?As?Byte
ReDim?pu(7)?'Esta matriz es un comando de consulta de 8 bits
pu(0)?=?"&H00"?'Dirección del termómetro
pu(1)?=?"&H03"?'Comando de consulta
pu(2) ?=?"&H00"?'2 y 3 son las direcciones del termómetro
pu(3)?=?"&H00"?'2 y 3 son las direcciones del termómetro
pu( 4)?=?"&H00"?'4 y 5 son la longitud del registro de lectura
p>pu(5)?=?"&H02"?'4 y 5 son la longitud del registro de lectura
pu(6)?=?"&HC5"?'6 y 7 son el código de verificación de corrección CRC. Debido a que no conocemos las reglas de verificación CRC del dispositivo, utilizamos el código de verificación generado por el software de prueba.
pu(7)?=?"&HDA"?'6 y 7 son códigos de verificación CRC
MSComm1.Output?=?pu
'No hace nada , simplemente permite que otras aplicaciones manejen sus eventos.
DoEvents
MSComm1.InBufferCount?=?0?'Borrar el búfer de recepción
MSComm1.RTreshold?=?9?'La longitud de los datos a ser recibido, vimos a través del asistente de detección de COM que los datos devueltos son 9 bytes
MSComm1.RTSEnable?=?True?' cambia al estado de recepción
End?Sub p> p>
¿Privado?Sub?Command2_Click()
Temporizador1.Enabled?=?False
Fin?Sub
Privado?Sub?Form_Unload (Cancelar ?As?Integer)
Si?MSComm1.PortOpen?Entonces
MSComm1.PortOpen?=?False?'Cerrar el puerto serie
¿Fin? Si
Timer1.Enabled?=?False
Fin?Sub
Privado?Sub?MSComm1_OnComm()?'Evento COM
¿Dim?PA( )?As?Byte
Dim?PB?As?String
Seleccionar?Case?MSComm1.CommEvent Case?comEvReceive
MSComm1.InputLen ?=?0 ?'Leer todos los caracteres en el buffer de recepción
PB?=?MSComm1.Input
PA()?=?PB
¿Para? i?= ?0?A?UBound(PA())
'Imprimir?"PA("?&?i?&?")";?PA(i)
Si? Len(Hex(PA(i)))?=?1?Entonces
strdata?=?strdata?&?"0"?&?Hex(PA(i))
Else
strdata?=?strdata?&?Hex(PA(i))
¿Fin?Si
Siguiente
' La cadena de datos devuelta: 000304012600000AC4, dividimos estos 9 bytes de acuerdo con el protocolo de comunicación
'00 es el número de máquina devuelto dentro del protocolo, 03 es el comando de lectura y 04 son los datos devueltos length? 0126? Dado que los datos de temperatura que quiero se expresan en hexadecimal, realizaré el procesamiento de datos a continuación
wd?=?CLng("&H"?&?Left(Right(strdata,?12), ?4) )?/?10?&?"℃"' se convierte en temperatura según el protocolo de comunicación
Text1?=?Text1?&?vbCrLf?&?strdata?&?"?" ?&?wd p>
strdata?=?""
MSComm1.PortOpen?=?False?'Cerrar el puerto serieEnd?Select
End?Sub
Privado ?Sub?Timer1_Timer()
Llamar?Command1_Click
Fin?Sub
Este es el resultado de mi prueba.
El siguiente es el protocolo de comunicación
Este es el resultado de que mi software utilice el asistente de detección