亚洲精品一二区_国产黄色片网站_99久久久成人国产精品_蜜臀网_国产精品一区二区三区免费_成人av中文字幕_91精品国产欧美一区二区成人

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > FreeModbus溫濕度傳感器試驗

FreeModbus溫濕度傳感器試驗 時間:2018-08-16      來源:未知

【實驗目的】

● 學習STM32的Cortex-M0系列芯片的使用

● 學習IAR開發(fā)軟件的使用方法,如仿真調(diào)試

● 通過本實驗掌握ModBus協(xié)議

【實驗環(huán)境】

● STM32F051 Cortex-M0模塊

● IAR開發(fā)工具和相應的仿真器

● PC機 XP、win7/win8/win10(32/64)

【實驗內(nèi)容】

利用STM32F051庫函數(shù)編寫ModBus實驗程序,實現(xiàn)M0模塊上電默認為從機,當接收到命令時可以,可以自動切換為主機,向溫濕度傳感器發(fā)送請求命令,溫濕度傳感器響應返回數(shù)據(jù)。M0通過無線ZigBee(串口2)發(fā)送出去。ZigBee協(xié)調(diào)接收無線數(shù)據(jù)并顯示到串口上。

【實驗原理】

圖 STM32F051原理圖

溫濕度傳感:

【實驗步驟】

完成第“開發(fā)環(huán)境搭建”章節(jié)的IAR環(huán)境搭建,就可以做傳感器實驗了,首先打開光盤中的傳感器工程文件。

工程源碼路徑:【智能農(nóng)業(yè)光盤資料\01程序源碼\03M0節(jié)點源碼\01Modbus_STM32F051(溫濕度1 01)\Project】

編譯下載程序(先編譯后下載)

打開“設備管理”。

查看COM口,打開串口調(diào)試助手。波特率9600,串口號COM8。

M0模塊與485總線板子連接在一起。并確保溫濕度傳感器連接到485上。

【實驗現(xiàn)象】

利用串口調(diào)試助手,串口轉485調(diào)試板,485總線的線和調(diào)試板相連接。

在串口發(fā)送區(qū)發(fā)送請求命令,返回讀到的溫濕度環(huán)境信息:

發(fā)送請求命令:01 03 00 00 00 02 C4 0B

根據(jù)ModBus協(xié)議:01:設備地址 03:設備地址 00 00:起始寄存器地址 00 02:從起始地址,讀取2個地址,讀取數(shù)據(jù)值。C4 0B: CRC校驗

返回環(huán)境信息:01 03 04 00 B8 01 51 BA 7A

根據(jù)ModBus協(xié)議:01:設備地址 03:設備地址 04:數(shù)據(jù)長度 00 B8:溫度值 01 51:濕度值

BA 7A:CRC校驗

【實驗代碼】

定義主從關系,默認ModBusSlave = 1,此時程序為從機,和溫濕度傳感器是并聯(lián)。

COBOL Code

uint8_t ModBusSlave = 1;

uint8_t ModBusMaster = 0;

當從機接收到命令時,會有從機轉變?yōu)橹鳈C,主動采集溫濕度傳感器環(huán)境信息。并1S上報一次環(huán)境數(shù)據(jù)。

(1)接收到從機轉主機的命令(485發(fā)來的數(shù)據(jù)):

00 06 00 03 00 01 B9 DB

廣播地址 + 06 + 0003 + 00 01 + CRC校驗

06表示ModBus 寫保持寄存器命令。

0003表示寫第幾個寄存器。

0001表示向寄存器中寫的內(nèi)容。為1有485網(wǎng)絡切換到ZigBee網(wǎng)絡(主機模式)

B9DB表示CRC校驗

ZigBee協(xié)調(diào)器插到電腦上USB,通過串口調(diào)試助手打開ZigBee協(xié)調(diào)器的COM口(波特率115200),顯示接收到M0傳感器采集的數(shù)據(jù)。數(shù)據(jù)格式是21 5A 打頭數(shù)據(jù),含有設備地址、傳感器類型和數(shù)據(jù)。

M0上傳的協(xié)議數(shù)據(jù)如下:

uint8_t usSendBuf[SendLong] = {0x21,0x5A, SlaveID,0x00,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x6B};

第5、6、7位為數(shù)據(jù)位,其他的是固定寫法。

接收數(shù)據(jù)

數(shù)據(jù):215A0100740000000000006B

位號:01234567891011

含義:標記網(wǎng)絡從機ID保留類型采集的數(shù)據(jù)保留位

第0字節(jié)位是標記位,用于判斷次數(shù)據(jù)包是否是合法的需要的數(shù)據(jù)包。

第1字節(jié)位是用于區(qū)分網(wǎng)絡類型的,分為二種網(wǎng)絡:zigbee-5A,RS485-52。

第2字節(jié)表示的是節(jié)點的地址位(ID),1~255之間。

第4字節(jié)位是節(jié)點的類型,包括::溫濕度-74,土壤溫濕度-74,光感-6C,紅外-69,C02-63,加熱器-57,加濕器-48,通風-46,照明-4C,噴濕-44,遮陽-53,報警-41 等多種類型的傳感器。

(2)接收到主機轉從此機的命令(ZigBee發(fā)來的數(shù)據(jù)):

數(shù)據(jù):236352626F7901

位號:0123456

含義:標記標記網(wǎng)絡預留預留預留

第0,1字節(jié)位是標記位,用于判斷次數(shù)據(jù)包是否是合法的需要的數(shù)據(jù)包。

第0字節(jié)標記位:0x23(#) 表示此數(shù)據(jù)為命令字段

第1字節(jié)標記位:0x63(c) 表示此數(shù)據(jù)為網(wǎng)絡切換命令

第2字節(jié)位是網(wǎng)絡位:用于判斷要切換到那種網(wǎng)絡

0x5A(Z):zigbee網(wǎng)絡

0x52(R):rs485網(wǎng)絡

第3字節(jié)位:此系統(tǒng)預留--必須為0

第4,5字節(jié)位:此系統(tǒng)預留--必須為0

第6字節(jié)位:此系統(tǒng)預留--必須為0

主程序

int main(void)

{

uint8_t i;

uint8_t RxData;

uint8_t Senddata[13] ={0};

uint8_t sendflag = 0;

/*!< At this stage the microcontroller clock setting is already configured,

this is done through SystemInit() function which is called from startup

file (startup_stm32f0xx.s) before to branch to application main.

To reconfigure the default setting of SystemInit() function, refer to

system_stm32f0xx.c file

*/

/* SysTick end of count event each 10ms */

RCC_GetClocksFreq(&RCC_Clocks);

SysTick_Config(RCC_Clocks.HCLK_Frequency / 100);

/* Add your application code here

*/

LED_Init();

//初始化繼電器

Relay_Init(Relay1_PORT,Relay1_PIN);

Relay_Init(Relay2_PORT,Relay2_PIN);

Relay_Init(Relay485_PORT,Relay485_PIN);

Usart_Init(USART2,115200);

if(ModBusMaster)

Usart_Init(USART1,9600);

if(ModBusSlave)

{

//模式 從地址 端口 波特率 校驗位

eMBInit(MB_RTU, MSlaveID, 0x01, 9600, MB_PAR_NONE);

//啟動FreeModbus

eMBEnable();

}

QueueInit(&FIFO_485);

/* Infinite loop */

while (1)

{

if(ModBusMaster)

{

//向ZigBee發(fā)送接收到ModBus的數(shù)據(jù) ModBus ====》ZigBee

if(FIFO_485.count >= 1)

{

QueueOut(&FIFO_485,&RxData);

if(RxData == SlaveID)

{

Senddata[0] = RxData;

QueueOut(&FIFO_485,&RxData);

if(RxData == 0x03)

{

Senddata[1] = RxData;

for(i=2;i<12;i++)

{

QueueOut(&FIFO_485,&RxData);

Senddata[i] = RxData;

}

usSendBuf[5] = 0;

usSendBuf[6] = (Senddata[3] << 8) | (Senddata[4] /10);

usSendBuf[7] = (Senddata[5] << 8) | (Senddata[6] /10);

for(i=0;i < 12;i++)

{

USART_SendData(USART2, usSendBuf[i]);

/* Loop until the end of transmission */

while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET)

{}

}

}

}

}

if(FIFO_485.count == 0 )

{

Delay(150);

//發(fā)送ModBus命令,通過ZigBee上報給網(wǎng)關(不來)

ModBusSend(HUM1_buf);

}

//發(fā)送zigbee串口2接收到的ModBus命令---->請求傳感器命令

if(RxZigbeelen == RxZigbeelong)

{

//判斷接收zigbee的數(shù)據(jù),是否為485繼電器切換命令

if((Rx_Zigbee_buf[1] == 0x63) && (Rx_Zigbee_buf[2] == 0x52))

{

USART_Cmd(USART1, DISABLE);

USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);

//繼電器切換為常閉狀態(tài)

GPIO_ResetBits(Relay485_PORT, Relay485_PIN);

//清空zigbee接收緩沖區(qū)的數(shù)據(jù)

memset(Rx_Zigbee_buf,0,64);//sizeof(char)*RxModbuslen);

RxZigbeelen = 0;

ModBusSlave = 1;

ModBusMaster = 0;

if(ModBusSlave)

{

//模式 從地址 端口 波特率 校驗位

eMBInit(MB_RTU, MSlaveID, 0x01, 9600, MB_PAR_NONE);

//啟動FreeModbus

eMBEnable();

}

}//判斷是否為控制繼電器命令(開)

else if(Rx_Zigbee_buf[3] == 'Z'){

if(Rx_Zigbee_buf[4] == MSlaveID){ //判斷控制的地址

if(Rx_Zigbee_buf[6] == '1'){ //繼電器的開

//控制繼電器撥到常開 PB.8

GPIO_SetBits(Relay2_PORT,Relay2_PIN );

//清空zigbee接收緩沖區(qū)的數(shù)據(jù)

memset(Rx_Zigbee_buf,0,64);//sizeof(char)*RxModbuslen);

RxZigbeelen = 0;

}else if(Rx_Zigbee_buf[6] == '0'){

//控制繼電器撥到常開 PB.8

GPIO_ResetBits(Relay2_PORT,Relay2_PIN );

//清空zigbee接收緩沖區(qū)的數(shù)據(jù)

memset(Rx_Zigbee_buf,0,64);//sizeof(char)*RxModbuslen);

RxZigbeelen = 0;

}

}

}

}

else if(RxZigbeelen > RxZigbeelong)

{

memset(Rx_Zigbee_buf,0,64);//sizeof(char)*RxModbuslen);

RxZigbeelen = 0;

}

//如果485切換成功,則燈滅

if(Led_flag == 1)

{

LED2_OFF();//關閉led燈

Led_flag = 0;

}

}

if(ModBusSlave)

{

eMBPoll( );

//從機接收到數(shù)據(jù)判斷,可改變主從模式,下面關閉從模式

if((usRegHoldingBuf[3] & 0xFF) == 0x01)

{

USART_Cmd(USART1, DISABLE);

USART_ITConfig(USART1, USART_IT_RXNE, DISABLE);

//主從切換的繼電器切換到常開

GPIO_SetBits(Relay485_PORT,Relay485_PIN );

if(ModBusSlave)

{

eMBDisable();

ModBusSlave = 0;

ModBusMaster = 1;

if(ModBusMaster)

Usart_Init(USART1,9600);

Delay(5);

}

//清空

usRegHoldingBuf[3] &= ~(1 << 0);

}

if(Led_flag == 0)

{

LED2_ON();//開led燈

Led_flag = 1;

}

}

}

}

上一篇:C語言中常見的筆試題

下一篇:大型程序管理神器之CMake

熱點文章推薦
華清學員就業(yè)榜單
高薪學員經(jīng)驗分享
熱點新聞推薦
前臺專線:010-82525158 企業(yè)培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5,京公海網(wǎng)安備11010802025203號

回到頂部

主站蜘蛛池模板: 人人看人人做人人爱精品 | 美女又黄又免费 | 欧美五级在线观看视频播放 | 全免费a级毛片免费毛视频 全免费观看a级毛片 | 日本高清xxxx| 中文字幕在线看片 | 欧美两性网 | 国产精品国产精品 | 91精品国产91热久久久久福利 | jizz另类| 亚洲日本一区二区三区在线 | 日本免费观看视频 | 日本成人激情视频 | 亚洲天堂影院 | 欧美一区二区三 | 国产成人精品久久 | 99热成人精品热久久66 | 激情图片激情视频激情小说 | 日日操日日爽 | 日韩第二页| 欧洲精品欧美精品 | 久久久久久国产精品免费 | 99精品久久久久久久免费看蜜月 | 亚洲综合在线观看视频 | 亚洲日本中文 | 欧美精品一二三区 | www.youjizz.com在线观看 | 国产精品21区 | 韩国三级视频网站 | 国产成人咱精品视频免费网站 | 国产一区二区不卡视频 | 亚洲午夜精品久久久久久成年 | 国产成人艳妇在线观看 | 久久久精品免费视频 | 中文字幕人成不卡一区 | 欧美三级日韩 | 欧美噜噜 | 国内精品久久久久久影院8f | 久久99国产一区二区三区 | 亚色网址| 人人澡人人插 |