逆向学习物联网-感知层设计-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 ); //关灯

            }

        }

 

 

    }

}

posted @ 2021-11-03 23:27  cqmcu_yth  阅读(116)  评论(0)    收藏  举报