小白學習匯總
單片機源程序如下:
- #include "stm32f10x.h"
- #include"crc.h"
- /*ModBus 計算CRC碼的步驟為:
- (1).預置16位寄存器為FFFFH。稱此寄存器為CRC寄存器;
- (2).把第一個8位數據與CRC寄存器的低位相異或,把結果放于CRC寄存器;
- (3).把寄存器的內容右移一位(朝低位),用0填補最高位,檢查最低位;
- (4).如果最低位為0:重復第3步(再次移位)如果最低位為1:CRC寄存器與多項式A001(1010 0000 0000 0001)進行異或;
- (5).重復步驟3和4,直到右移8次,這樣整個8位數據全部進行了處理;
- (6).重復步驟2到步驟5,進行下一個8位數據的處理;
- (7).最后得到的CRC寄存器即為CRC碼。(CRC碼 = CRC_L +CRC_H)
- */
- /*****************crc校驗**********************************************/
- //crc生成函數,并將crc存儲在預先定于的數組中
- //調用方式crc16(指向數據的指針,需要校驗的數據長度)
- u16 crc16(u8 *ptr,u8 len)
- {
- unsigned long wcrc=0XFFFF;//預置16位crc寄存器,初值全部為1
- int i=0,j=0;//定義計數
- for(i=0;i<len;i++)//循環計算每個數據
- {
- wcrc^=*ptr++;//將八位數據與crc寄存器亦或.指針地址增加,指向下個數據
- for(j=0;j<8;j++)//循環計算數據的
- {
- if(wcrc&0X0001)//判斷右移出的是不是1,如果是1則與多項式進行異或。
- {
- wcrc=wcrc>>1^0XA001;//先將數據右移一位再與上面的多項式進行異或
- }
- else//如果不是1,則直接移出
- {
- wcrc>>=1;//直接移出
- }
- }
- }
- return wcrc<<8|wcrc>>8;//低八位在前,高八位在后
- }
復制代碼- #include "sys.h"
- #include "delay.h"
- #include "usart.h"
- #include "timer.h"
- extern u8 Rcv_Busy;//用來說明串口能不能繼續接收下一幀數據
- int main(void)
- {
-
- delay_init(); //延時函數初始化
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //設置NVIC中斷分組2:2位搶占優先級,2位響應優先級
- uart_init(115200); //串口初始化為9600
- TIM3_Int_Init(499,7199);//定時器初始化為50ms中斷一次
- while(1)
- {
- if(Rcv_Busy==1)//串口忙
- ModHandle();//處理接受到的數據
- }
- }
復制代碼
所有資料51hei提供下載:
modbus實驗.rar
(286.49 KB, 下載次數: 297)
2018-5-5 02:19 上傳
點擊文件名下載附件
UartAssist.rar
(524.68 KB, 下載次數: 148)
2018-5-4 11:50 上傳
點擊文件名下載附件
|