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 :Station模式(接收模式)
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
功能:查看已接入设备的 IP
5、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 号
:数字参数,表明发送数据的长度,最大长度为 2048
15、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 号
:数字参数,表明发送数据的长度,最大长度为 2048
18、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
错误: ERROR
20、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 "applications\myuart\myuart.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!\r\n";
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!\r\n";
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 "applications\myuart\myuart.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, world\n");
while (1)
{
uart_sendstring("AT\r\n");
rt_pin_write(pin, PIN_LOW);
rt_thread_mdelay(500);
rt_pin_write(pin, PIN_HIGH);
rt_thread_mdelay(500);
}
}
6、效果展示
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
国产单片机
+关注
关注
1文章
20浏览量
3963 -
中科蓝讯
+关注
关注
9文章
54浏览量
9848
发布评论请先 登录
相关推荐
无线网解码器怎么连接
无线网解码器的连接方式可能因设备型号、品牌以及应用场景的不同而有所差异。以下提供的是一种较为通用的连接步骤,但请注意,在实际操作中应参考具体设备的说明书或官方指导进行操作。 一、设备准备 无线
无线网桥接路由器怎么接
无线网桥接路由器的连接过程相对复杂,但按照以下步骤操作,可以确保连接的成功和网络的稳定性。 一、准备工作 设备检查 : 确保有两个支持无线桥
无线网桥的工作原理和特点是什么
无线网桥(Wireless Bridge)是一种在无线网络中连接两个或多个网络段的设备,它允许数据在不同的网络之间传输。无线网桥通常用于连接
无线网桥可以当wifi用吗
无线网桥(Wireless Bridge)是一种无线通信设备,它主要用于连接两个或多个网络,实现数据的传输。无线网桥可以在不同的网络之间建立连接
wds无线桥接怎么设置
无线分布式系统(Wireless Distribution System,简称WDS)是一种允许无线网络设备之间进行桥接的技术。通过WDS,可以将多个无线设备
有线网卡和无线网卡分别指的是什么
有线网卡和无线网卡是计算机或网络设备中用于连接网络的两种不同类型的网络接口卡。它们的主要区别在于传输媒介和连接方式。
无线网桥的工作原理 无线网桥的安装注意事项
无线网桥的工作原理 无线网桥的安装注意事项 无线网桥是一种用于扩充无线网络覆盖范围的设备,它可以通过无线信号来
无线网卡驱动怎么安装 无线网卡怎么连接台式电脑
如今,随着科技的不断发展,无线网络已经成为了我们生活中不可或缺的一部分。对于台式电脑用户而言,如果没有内置无线网卡,就需要通过安装外置无线网卡来连接
连接两个局域网应该使用无线网桥还是使用光纤转换器对接呢?
连接两个局域网应该使用无线网桥还是使用光纤转换器对接呢? 连接两个局域网时,使用无线网桥还是光纤转换器对接的选择应基于特定的需求和条件来决定。本文将从不同的角度分析和比较这两种方法,以
如何将以太网连接转换为无线网络连接
如何将以太网连接转换为无线网络连接 将以太网连接转换为无线网络连接是一种常见的需求,特别是在现代家庭中。有几种方法可以实现这一转换,包括使用无线
什么是无线网卡?它是如何工作的?如何安装无线网卡?
什么是无线网卡?它是如何工作的?如何安装无线网卡? 无线网卡(无线适配器)是一种设备,用于使计算机或其他设备能够连接到
无线网卡槽位有哪些种类及其优势介绍
介绍各种类型的无线网卡槽以及它们的优势。 1. PCI槽:PCI(Peripheral Component Interconnect)槽是最常用的无线网卡插槽。它是一种用于将外接设备与计算机主板进行
选择无线网卡的原则和方法
选择无线网卡的原则和方法 无线网卡是一种用于连接电脑或其他设备与无线网络的设备,它可以通过Wi-Fi信号接收和发送数据。随着无线网络的广泛应
评论