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.