1、 资源介绍可以看到,AB32VG1拥有三个全双工串口
资源分配:
UART0 -> 上位机通讯
UART1 -> ESP8266无线网络
UART2 -> 待分配
UART1所对应的引脚为PA3和PA4,其中PA3为RX1,PA4为TX1
2、ESP8266介绍:3、连接图
单片机与ESP8266采用串口通讯(AT指令),功能:获取网络数据及设备联网
坑1、在程序实现之前,需要注意的点,在配置中需要打开“硬件”下的UART1功能,要注意配置截图中有没有SDK软件包,如果没有打开UART1口编译不通过。(升级软件版本2.1.2)
坑2、还有一个坑的地方,例程中:搞不明白为什么要错位,错位后收到的数据为乱码 坑3、波特率显示问题(要么整体改)
要么单独定义判断i的值
4、AT指令1、 AT+RST 功能:重启模块2、AT+CWMODE= 功能:mode=1 :Sta
tion模式(接收模式) mode=2:AP模式(发送模式) mode=3:AP+Station模式3、AT+ CWSAP= ,,, 功能:配置AP参数(指令只有在AP模式开启后有效) ssid:接入点名称 pwd:密码 chl:通道号 ecn:加密方式:(0-OPEN, 1-WEP, 2-WPA_PSK, 3-WPA2_PSK, 4-WPA_WPA2_PSK) 注意:此设置完成后,连接网络会可能出现连接不上的情况,请发送 AT+RST 命令并等待几分钟之 后再连接。4、AT+CWLIF 功能:查看已接入设备的 IP5、AT+CIFSR 功能:查看本模块的 IP 地址 注意: AP 模式下无效!会造成死机现象!6、AT+CWMODE? 功能:查看本机配置模式7、AT+CIPMUX? 功能:查询本模块是否建立多连接 说明: :0-单路连接模式, 1-多路连接模式8、AT+CIPMODE? 功能:查询本模块的传输模式说明: :0-非透传模式, 1-透传模式9、AT+CIPSTO? 功能:查询本模块的服务器超时时间10、AT+CIPMUX=1 功能:开启多连接模式11、AT+CIPSERVER=1,8080 功能:创建服务器关闭 server 服务如下图所示:说明: :0-关闭 server 模式, 1-开启 server 模式:端口号,缺省值为 333说明: (1) AT+ CIPMUX=1 时才能开启服务器;关闭 server 模式需要重启(2)开启 server 后自动建立 server 监听,当有 client 接入会自动按顺序占用一个连接。12、AT+CIPSTO=2880 功能:设置服务器超时时间13、AT+CIPSTATUS 功能:查看当前连接说明: :连接的 id 号 0-4:字符串参数,类型 TCP 或 UDP:字符串参数, IP 地址:端口号: 0-本模块做 client 的连接, 1-本模块做 server 的连接14、AT+CIPSEND=1,6 功能:向某个连接发送数据指令: 1)单路连接时(+CIPMUX=0),指令为: AT+CIPSEND=2)多路连接时(+CIPMUX=1) ,指令为: AT+CIPSEND= ,响应:收到此命令后先换行返回”>”,然后开始接收串口数据当数据长度满 length 时发送数据。如果未建立连接或连接被断开,返回 ERROR如果数据发送成功,返回 SEND OK说明: :需要用于传输连接的 id 号:数字参数,表明发送数据的长度,最大长度为 204815、AT+CIPSERVER=0 功能:关闭 server 服务 指令: AT+CIPSERVER=[,]说明: :0-关闭 server 模式, 1-开启 server 模式:端口号,缺省值为 333响应: OK说明: (1) AT+ CIPMUX=1 时才能开启服务器;关闭 server 模式需要重启(2)开启 server 后自动建立 server 监听,当有 client 接入会自动按顺序占用一个连接。16、AT+CIPSTART=2,"TCP","192.168.4.101",8080 功能:建立 TCP 连接指令: 1)单路连接时(+CIPMUX=0),指令为: AT+CIPSTART= ,,2)多路连接时(+CIPMUX=1),指令为: AT+CIPSTART=,,,响应:如果格式正确且连接成功,返回 OK,否则返回 ERROR如果连接已经存在,返回 ALREAY CONNECT说明: :0-4,连接的 id 号:字符串参数,表明连接类型, ”TCP”-建立 tcp 连接, ”UDP”-建立 UDP 连接:字符串参数,远程服务器 IP 地址:远程服务器端口号17、AT+CIPSEND=2,8指令: 1)单路连接时(+CIPMUX=0),指令为: AT+CIPSEND=2)多路连接时(+CIPMUX=1) ,指令为: AT+CIPSEND= ,响应:收到此命令后先换行返回”>”,然后开始接收串口数据当数据长度满 length 时发送数据。如果未建立连接或连接被断开,返回 ERROR如果数据发送成功,返回 SEND OK说明: :需要用于传输连接的 id 号:数字参数,表明发送数据的长度,最大长度为 204818、AT+CWLAP 功能:查看当前无线路由器列表响应:正确: (终端返回AP列表)+ CWLAP: ,,OK错误: ERROR说明: < ecn >:0-OPEN, 1-WEP, 2-WPA_PSK, 3-WPA2_PSK, 4-WPA_WPA2_PSK:字符串参数,接入点名称:信号强度19、AT+CWJAP=”MERSAIN”,”XXXXXXXX” 功能:加入当前无线网络指令: AT+CWJAP=,< pwd >说明: :字符串参数,接入点名称:字符串参数,密码,最长64字节ASCII响应:正确: OK错误: ERROR20、AT+CWJAP? 功能:检测是否真的连上该路线网络 指令: AT+CWJAP?响应:返回当前选择的AP+ CWJAP:OK说明: :字符串参数,接入点名称21、AT+CIFSR 功能:查看模块 IP 地址指令: AT+CIFSR响应:正确: + CIFSR:OK错误: ERROR说明: :字符串参数,接入点名称
5、程序实现
myuart.c文件/* * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2021-11-04 Administrator the first version */#include #include "string.h"#include "applicationsmyuartmyuart.h"/* 用于接收消息的信号量 */static struct rt_semaphore rx_sem;static rt_device_t serial;/* 接收数据回调函数 */static rt_err_t uart_input(rt_device_t dev, rt_size_t size){ /* 串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 */ rt_sem_release(&rx_sem); return RT_EOK;}static void serial_thread_entry(void *parameter){ char ch; while (1) { /* 从串口读取一个字节的数据,没有读取到则等待接收信号量 */ while (rt_device_read(serial, -1, &ch, 1) != 1) { /* 阻塞等待接收信号量,等到信号量后再次读取数据 */ rt_sem_take(&rx_sem, RT_WAITING_FOREVER); } /* 读取到的数据通过串口错位输出 */ //ch = ch + 1; //rt_device_write(serial, 0, &ch, 1); rt_kprintf("%c",ch); } }static int uart_sample(int argc, char *argv[]){ rt_err_t ret = RT_EOK; char uart_name[RT_NAME_MAX]; char str[] = "hello RT-Thread!rn"; if (argc == 2) { rt_strncpy(uart_name, argv[1], RT_NAME_MAX); } else { rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX); } /* 查找系统中的串口设备 */ serial = rt_device_find(uart_name); if (!serial) { rt_kprintf("find %s failed!n", uart_name); return RT_ERROR; } /* 初始化信号量 */ rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); /* 以中断接收及轮询发送模式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_INT_RX); /* 设置接收回调函数 */ rt_device_set_rx_indicate(serial, uart_input); /* 发送字符串 */ rt_device_write(serial, 0, str, (sizeof(str) - 1)); /* 创建 serial 线程 */ rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10); /* 创建成功则启动线程 */ if (thread != RT_NULL) { rt_thread_startup(thread); } else { ret = RT_ERROR; } return ret;}/* 导出到 msh 命令列表中 */MSH_CMD_EXPORT(uart_sample, uart device sample);/*自定义的函数*//*初始化函数*/int uart_init(char *port){ rt_err_t ret = RT_EOK; char uart_name[RT_NAME_MAX]; char str[] = "hello RT-Thread!rn"; rt_strncpy(uart_name, port, RT_NAME_MAX); /* 查找系统中的串口设备 */ serial = rt_device_find(uart_name); if (!serial) { rt_kprintf("find %s failed!n", uart_name); return RT_ERROR; } /* 初始化信号量 */ rt_sem_init(&rx_sem, "rx_sem", 0, RT_IPC_FLAG_FIFO); /* 以中断接收及轮询发送模式打开串口设备 */ rt_device_open(serial, RT_DEVICE_FLAG_INT_RX); /* 设置接收回调函数 */ rt_device_set_rx_indicate(serial, uart_input); /* 发送字符串 */ rt_device_write(serial, 0, str, (sizeof(str) - 1)); /* 创建 serial 线程 */ rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 1024, 25, 10); /* 创建成功则启动线程 */ if (thread != RT_NULL) { rt_thread_startup(thread); } else { ret = RT_ERROR; } return ret;}/*结束*//*发送字符串*/int uart_sendstring(char *str) { rt_device_write(serial, 0, str, (strlen(str) - 1));}/*结束*/
myuart.h文件
/* * Copyright (c) 2006-2021, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2021-11-04 Administrator the first version */#ifndef APPLICATIONS_MYUART_MYUART_H_#define APPLICATIONS_MYUART_MYUART_H_/*默认串口*/#define SAMPLE_UART_NAME "uart1"int uart_init(char *port);int uart_sendstring(char *str);#endif /* APPLICATIONS_MYUART_MYUART_H_ */
main文件
/* * Copyright (c) 2020-2021, Bluetrum Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2020/12/10 greedyhao The first version *//** * Notice! * All functions or data that are called during an interrupt need to be in RAM. * You can do it the way exception_isr() does. */#include #include "board.h"#include "applicationsmyuartmyuart.h"int main(void){ uint8_t pin = rt_pin_get("PE.1"); uart_init("uart1"); rt_pin_mode(pin, PIN_MODE_OUTPUT); rt_kprintf("Hello, worldn"); while (1) { uart_sendstring("ATrn"); rt_pin_write(pin, PIN_LOW); rt_thread_mdelay(500); rt_pin_write(pin, PIN_HIGH); rt_thread_mdelay(500); }}
6、效果展示