逆向学习物联网-感知层设计-08Main程序设计
1.0业务框图
1.1 将驱动程序添加到工程中
1)添加文件到工程
2)添加工程文件编译路径
1.2 中断服务程序设计:接收数据
2 typedef struct 3 { 4 unsigned char rCh;//接受一个字节 5 unsigned int rNum;//接受字节个数 6 unsigned char buffer[200]; 7 8 } COM_DATA; 9 10 COM_DATA gg_ComData; 11 12 13 void Com_Init ( void ) 14 { 15 UART_Start_Receive_IT ( &huart2, &gg_ComData.rCh, 1 ); 16 17 } 18 19 unsigned char Com_CheckRecvOk ( unsigned char *recvBuffer, unsigned int *recvNum ) 20 { 21 static unsigned int old_num = 0; 22 23 if ( gg_ComData.rNum == old_num && gg_ComData.rNum > 0 ) 24 { 25 memcpy ( recvBuffer, gg_ComData.buffer, old_num ); 26 *recvNum = old_num; 27 old_num = 0; 28 gg_ComData.rNum = 0; 29 return 0; //接收完成 30 } 31 old_num = gg_ComData.rNum; 32 return 1; //还在接收 33 } 34 35 36 void HAL_UART_RxCpltCallback ( UART_HandleTypeDef *huart ) 37 { 38 if ( gg_ComData.rNum < 200 ) 39 { 40 gg_ComData.buffer[gg_ComData.rNum] = gg_ComData.rCh; 41 gg_ComData.rNum++; 42 } 43 UART_Start_Receive_IT ( &huart2, &gg_ComData.rCh, 1 ); 44 } |
44.1 编写系统main()函数,实现系统功能
1) 系统初始化
void User_Init ( void ) { printf ( "user init start---" ); HAL_TIM_Base_Start ( &htim2 );
Com_Init();//接收数据初始化
Lamp_Set ( 0 ); //灯灭 DHT11_Init();//试读第1个数据 OLED_Init();//显示屏幕初始化
OLED_ShowString ( 0, 0, ( u8 * ) "-Reverse_IOT-", 16 ); printf ( "user init end---" ); } |
2) 定时1秒,采集状态,显示
//4----------------------------------- //刷新OLED显示,1秒刷新显示1次 if ( tDisp++ > 1000 ) { tDisp = 0;
ReadStatus(); Oled_Refresh(); } |
u8 g_Temperature = 0; u8 g_Humidity = 0; u8 g_Lamp = 0;
void ReadStatus ( void ) { g_Lamp = Lamp_Get(); if ( DHT11_Read_Data ( &g_Temperature, &g_Humidity ) ) { return; } } |
void Oled_Refresh ( void ) { char strTemp1[16] = "-SYSTEM MONITOR-"; char strTemp2[16] = {0}; char strTemp3[16] = {0}; char strTemp4[16] = {0};
//OLED_Clear();
sprintf ( strTemp2, "Temp:%d ", g_Temperature ); sprintf ( strTemp3, "Humi:%d ", g_Humidity ); sprintf ( strTemp4, "Lamp:%d ", g_Lamp );
OLED_ShowString ( 0, 0, ( u8 * ) strTemp1, 16 );
OLED_ShowString ( 0, 2, ( u8 * ) strTemp2, 16 ); OLED_ShowString ( 0, 4, ( u8 * ) strTemp3, 16 ); OLED_ShowString ( 0, 6, ( u8 * ) strTemp4, 16 );
} |
3) 定时3秒上传:温度,湿度,LAMP状态。
if ( tComm++ > 3000 ) { tComm = 0; SendStatusData();
} |
//上传状态数据
void SendStatusData ( void ) {
char strData[100];
sprintf ( strData, ( char * ) "{\"temperature\":%d,\"humidity\":%d,\"lamp\":%d}", ( int ) g_Temperature, ( int ) g_Humidity, ( int ) g_Lamp );
HAL_UART_Transmit ( &huart2, ( uint8_t * ) strData, strlen ( strData ), 0xFFFF );
} |
4) 接收远程控制LAMP,
//2----------------------------------------- //接收用户发来的命令 if ( Com_CheckRecvOk ( recvBuffer, &recvNum ) == 0 ) {
ExeCommand ( );
SendStatusData();//立即响应 tComm = 0;
} |
void ExeCommand ( void ) { //接收数据进行处理 cJSON *root = NULL; cJSON *item = NULL; //cjson??
root = cJSON_Parse ( ( char * ) recvBuffer ); if ( !root ) {
//出错 } else //成功 { char strDev[30] = {0}; char strCmd[30] = {0};
//灯控判断cJSON_GetObjectItem item = cJSON_GetObjectItem ( root, "dev" ); strcpy ( strDev, item->valuestring );
item = cJSON_GetObjectItem ( root, "cmd" ); strcpy ( strCmd, item->valuestring );
cJSON_Delete ( root );//释放内存
if ( memcmp ( strDev, "LED1", 4 ) == 0 ) { if ( memcmp ( strCmd, "ON", 2 ) == 0 ) { Lamp_Set ( 1 ); //开灯 } if ( memcmp ( strCmd, "OFF", 3 ) == 0 ) { Lamp_Set ( 0 ); //关灯 }
} if ( memcmp ( strDev, "LED0", 4 ) == 0 ) { if ( memcmp ( strCmd, "ON", 2 ) == 0 ) { Lamp_Set ( 1 ); //开灯 } if ( memcmp ( strCmd, "OFF", 3 ) == 0 ) { Lamp_Set ( 0 ); //关灯 } }
} } |