在上次调通ESP8266的基础上,在PSoC 6上增设了一个串口,为了能和ESP8266完成正常的收发处理,需要修改一些设置
1、声明一个串口,使用uart5
// uart5用于和ESP8266通信
#defineSAMPLE_UART_NAME "uart5"
// 设备句柄
static rt_device_tserial;
复制代码在系统配置中,
我关闭了串口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的联动处理,已经完成。接下来,要加入抽水当面的动作了。