在上次调通ESP8266的基础上,在PSoC 6上增设了一个串口,为了能和ESP8266完成正常的收发处理,需要修改一些设置

1、声明一个串口,使用uart5

// uart5用于和ESP8266通信

  • #defineSAMPLE_UART_NAME       "uart5"

  • // 设备句柄

  • static rt_device_tserial;
  • 复制代码

    在系统配置中,

    图片1.png

    我关闭了串口DMA模式开关。主要是担心数据不定长,引起收发中发生混乱。

    2、初始化串口uart5

    按照下面的设置,初始化串口uart5。

    // 初始化串口设备

  • int uart_init(void) {

  •     rt_err_tret = RT_EOK;

  •     charuart_name[]="uart5";

  •     charstr[] = "hello RT-Thread!\r\n";

  •     /* 查找系统中的串口设备 */

  • serial = rt_device_find(uart_name);

  •     if(!serial) {

  • rt_kprintf("find %s failed!\n", uart_name);

  •         returnRT_ERROR;

  • }

  • rt_kprintf("find %s !\n", uart_name);

  •     /* 以中断接收及轮询发送模式打开串口设备 */

  • rt_device_open(serial, RT_DEVICE_FLAG_INT_RX);

  •     /* 设置接收回调函数 */

  • rt_device_set_rx_indicate(serial, uart_input);

  •     returnret;

  • }
  • 复制代码

    3、在串口的中断处理函数中,处理收到的信息

    /* 串口接收数据回调函数 */

  • static rt_err_t uart_input(rt_device_tdev, rt_size_tsize) {

  •     uint32_ti=0;

  •     if(serialRxOK == 0) {

  • rt_device_read(serial, -1, serialRxBuff, 32);

  •         for(i=0; i<32;i++) {

  •             if(serialRxBuff==13) {

  •                 // 收到换行符,完整指令

  • rt_kprintf("\r\nuart5 input=%s\r\n", serialRxBuff);

  • serialRxOK = 1;

  • }

  • }

  • }

  •     returnRT_EOK;

  • }
  • 复制代码

    4、在主程序中,对收到的信息进行分析,获取想要的数据


    在主程序中,加入了定时中断处理。每隔一定周期,向ESP8266发送更新时间请求,并根据返回结果更新OLED上的时间显示信息。根据这个时间信息,在每天6:00的时候,向ESP8266发送更新当日气温请求,并根据返回结果更新OLED上的气温显示信息。预定是在每天的7:00的时候,启动浇水处理,按照指定的浇水时长,将水从水桶中抽出来,送给目标花盆。控制抽水马达,需要一个专门的IO口。利用这个IO口控制继电器的开关,实现对抽水马达的电源控制。同时PSoC 6上还有保留一个检测水流出的信息,保证正常的抽水流出动作。

    现在PSoC 6 RTT与ESP8266的联动处理,已经完成。接下来,要加入抽水当面的动作了。

    图片2.png