① 串口發送與接收數據
使用RS-485串口進行通訊。
1.定義串口接收數據的緩沖區,最大可以保存64個位元組 u8 RS485_RX_BUF1[64];
2.定義接收發送數據的長度 u8 RS485_RX_CNT;
3.發送數據的函數一般有兩個printf和 USART_SendData,這里主要說USART_SendData的使用。printf實現的是格式化字元串,字元串比較有優勢。
USART_SendData傳遞單個字元和指令。
4.給發送方定義一個標記位 u32 flags_send1; flags_send1
5.要發送的事件很多定義一個枚舉類型的數據,將所有要發送的事件放入枚舉類型數據中。
枚舉類型數據將第一個定為1,其他的數據依次加1.
6.定義一個發送事件函數SendCmd(u8 cmd)
定義
7.假設要傳遞E_CKEYDN_INUSE1事件,要實現事件的傳遞,就應該將事件做參數傳入SendCmd(u8 cmd)函數
此時flags_send1 |= EBIT(9)=;由第四點知道flags_send1是一個32位的無符號整型數據。所以 flags_send1 = 0000 0000 0000 0000 0000 0001 1111 1111
8.(1)UARTSend1()函數
此時的flags_send1 = 0000 0000 0000 0000 0000 0001 1111 1111;
sb[2] = (flags_send1 >> 0) & 0xff = 1111 1111;
sb[3] = (flags_send1 >> 8) & 0xff = 0000 0001;
sb[4] = (flags_send1 >> 16) & 0xff = 0000 0000;
sb[5] = (flags_send1 >> 24) & 0xff = 0000 0000;
(2)checksum()函數
d0=(senddata >> 0) & 0xff=0000 0001 1111 1111;
d1=(senddata >> 8) & 0xff=0000 0001 & 0xff=0000 0000 0000 0001;
d2=(senddata >> 16) & 0xff=0000 0000 & 0xff = 0000 0000 0000 0000;
d3=(senddata >> 24) & 0xff=0000 0000 & 0xff = 0000 0000 0000 0000;
sum=0000 0010 0000 0000;
~sum=1111 1101 1111 1111;
sb[6] = (sum >> 0) &0xff = 1111 1111 & 0xff = 1111 1111 ;
sb[7] = (sum >> 8) &0xff = 1111 1101;
(3)
為什麼定義sb[8]的前兩位是0x55,0xaa?
0xaa是1010 1010,0x55是0101 0101在通訊編碼原理中,應該避免過多的重復0或者1,因為當傳輸變成一個長0/1時,一個脈沖干擾就會將數據截斷,增加誤碼的概率。若通訊機不能接受10101010或者01010101,那麼就是線路出現問題。這是一個判斷線路狀態的手段。
9.串口1接收數據
(1)通過UARTRead1()函數實現
receive += (RS485_RX_BUF1[2] << 0) = 0000 0000 0000 0000 0000 0000 1111 1111; ;
receive += (RS485_RX_BUF1[3] << 8) = 0000 0000 0000 0000 0000 0001 1111 1111
receive += (RS485_RX_BUF1[4] << 16) = 0000 0000 0000 0000 0000 0001 1111 1111
receive += (RS485_RX_BUF1[5] << 24) = 0000 0000 0000 0000 0000 0001 1111 1111
(2)將receive傳入checksum(u32 senddata)函數中
d0= 0000 0000 1111 1111;
d1=0000 0000 0000 0001
d2= 0000 0000 0000 0000
d3=0000 0000 0000 0000
sum=0000 0001 0000 0000
~sum = 1111 1110 1111 1111
(3)定義接收數據標記位是 u32 flags_receive1;
通過判斷RS485_RX_BUF1[6] 、RS485_RX_BUF1是否等於 ((sum >> 0) & 0xff)、((sum >> 8) & 0xff))來判斷讀入的數據是不是正確的。
RS485_RX_BUF2[6] ==1111 1111
RS485_RX_BUF2[7] == 1111 1110
正確時
接收到的數據是flags_receive1 = receive= 0000 0000 0000 0000 0000 0001 1111 1111;
不正確時 flags_receive1 |= EBIT(E_ERROR); 接收數據標記位置為錯誤位。