Red de conocimientos turísticos - Información de alquiler - Envío y recepción de datos a través del puerto serie

Envío y recepción de datos a través del puerto serie

Utiliza el puerto serie RS-485 para la comunicación.

1. Defina el búfer para recibir datos del puerto serie. El número máximo de bytes que se pueden guardar es 64 u8 RS485_RX_BUF1[64]

2. Defina la longitud de. datos enviados por el receptor u8 RS485_RX_CNT

3. Generalmente hay dos funciones que pueden enviar datos, a saber, printf y USART_SendData.

USART_SendData pasa caracteres y comandos individuales.

4. Defina un bit de bandera u32 flags_send1 para el remitente; flags_send1

5. Hay muchos eventos para enviar. Defina un tipo de enumeración de datos y coloque todos los eventos para enviar. . en datos de tipo enumeración.

El primer dato del tipo de enumeración es 1 y los demás datos se incrementan en 1 en secuencia. Defina una función de envío de eventos SendCmd(u8 cmd)

Definición

7. Suponga que desea pasar el evento E_CKEYDN_INUSE1 Para implementar este evento, debe pasar el evento como parámetro. a la función SendCmd(u8 cmd )

En este momento flags_send1 |= EBIT(9)=; Desde el cuarto punto, sabemos que flags_send1 son datos enteros sin signo de 32 bits.

Por lo tanto flags_send1 = 0000 0000 0000 0000 0000 0000 0001 1111 1111

8. (1) Función UARTSend1()

En este momento flags_send1 = 0000 0000 0000 0000 0000 0000 00 1 1111 1111

sb[2] = (flags_send1 gt; gt; 0) amp; 0xff = 1111 1111;

sb[3] = (flags_send1 gt; gt; 8) amp; 0xff = 0000 0001;

sb[4] = (flags_send1 gt; gt; 16) amp; 0xff = 0000 0000;

sb[5] = (flags_send1 gt; gt; 24) amp; 0xff = 0000 0000;

(2) función checksum()

d0=(senddata gt; gt; 0) amp; /p >

d1=(enviar datos gt; gt; 8) amp; 0xff=0000 0001 amp; 0xff=0000 0000 0000 0001

d2=(enviar datos gt; gt; 16) amp; 0xff= 0000 0000 amp; 0xff = 0000 0000 0000

d3=(senddata gt; gt; 24)

suma= 0000 0010 0000 0000;

~sum=1111 1101 1111 1111;

sb[6] = (suma gt; gt; 0) amp; 0xff = 1111 1111 amp; 0xff = 1111 1111;

sb[7] = (suma gt; gt; 8) amp; 0xff = 1111 1101; ¿Los dos primeros dígitos de sb[8] deberían definirse como 0x55, 0xaa?

0xaa es 1010 1010 y 0x55 es 0101 0101. En el principio de codificación de comunicación, se deben evitar demasiadas repeticiones de 0 o 1, porque cuando la transmisión se vuelve larga 0/1, la interferencia del pulso truncará el datos, aumenta la probabilidad de tasa de error de bits. Si el comunicador no puede aceptar 10101010 o 01010101, entonces hay algún problema con la línea. Esta es una forma de determinar el estado de una línea.

9. El puerto serie 1 recibe datos

(1) Implementado mediante la función UARTRead1 ()

recibir = (RS485_RX_BUF1[2] lt; lt; 0 ; p> (2) Pasar la recepción a la función de suma de comprobación (u32 senddata)

d0= 0000 0000 1111 1111;

d1=0000 0000 0000 0001

d2= 0000 0000 0000

d3=0000 0000 0000 0000

suma= 0000 0001 0000 0000 0000

~suma = 1111 1110 1111 1111

(3) Defina el bit de indicador de datos de recepción como u32 flags_receive1;

Al juzgar si RS485_RX_BUF1[6] y RS485_RX_BUF1 son iguales a ((sum gt; gt; 0) amp; 0xff), ((sum gt; gt; 8) amp; 0xff) para determinar si los datos leídos son correctos.

RS485_RX_BUF2[6] == 1111 1111

RS485_RX_BUF2[7] == 1111 1110

Correcto

Los datos recibidos son flags_receive1 = recibir= 0000 0000 0000 0000 0000 0000 0001 1111 1111;

Cuando es incorrecto, flags_receive1 |= EBIT(E_ERROR); la posición del indicador de datos recibidos es un bit de error.