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瀏覽量
3966 -
中科藍訊
+關注
關注
9文章
54瀏覽量
9849
發布評論請先 登錄
相關推薦
無線網解碼器怎么連接
無線網解碼器的連接方式可能因設備型號、品牌以及應用場景的不同而有所差異。以下提供的是一種較為通用的連接步驟,但請注意,在實際操作中應參考具體設備的說明書或官方指導進行操作。 一、設備準備 無線
無線網橋接路由器怎么接
無線網橋接路由器的連接過程相對復雜,但按照以下步驟操作,可以確保連接的成功和網絡的穩定性。 一、準備工作 設備檢查 : 確保有兩個支持無線橋
無線網橋的工作原理和特點是什么
無線網橋(Wireless Bridge)是一種在無線網絡中連接兩個或多個網絡段的設備,它允許數據在不同的網絡之間傳輸。無線網橋通常用于連接
無線網橋可以當wifi用嗎
無線網橋(Wireless Bridge)是一種無線通信設備,它主要用于連接兩個或多個網絡,實現數據的傳輸。無線網橋可以在不同的網絡之間建立連接
wds無線橋接怎么設置
無線分布式系統(Wireless Distribution System,簡稱WDS)是一種允許無線網絡設備之間進行橋接的技術。通過WDS,可以將多個無線設備
有線網卡和無線網卡分別指的是什么
有線網卡和無線網卡是計算機或網絡設備中用于連接網絡的兩種不同類型的網絡接口卡。它們的主要區別在于傳輸媒介和連接方式。
無線網橋的工作原理 無線網橋的安裝注意事項
無線網橋的工作原理 無線網橋的安裝注意事項? 無線網橋是一種用于擴充無線網絡覆蓋范圍的設備,它可以通過無線信號來
無線網卡驅動怎么安裝 無線網卡怎么連接臺式電腦
如今,隨著科技的不斷發展,無線網絡已經成為了我們生活中不可或缺的一部分。對于臺式電腦用戶而言,如果沒有內置無線網卡,就需要通過安裝外置無線網卡來連接
連接兩個局域網應該使用無線網橋還是使用光纖轉換器對接呢?
連接兩個局域網應該使用無線網橋還是使用光纖轉換器對接呢? 連接兩個局域網時,使用無線網橋還是光纖轉換器對接的選擇應基于特定的需求和條件來決定。本文將從不同的角度分析和比較這兩種方法,以
如何將以太網連接轉換為無線網絡連接
如何將以太網連接轉換為無線網絡連接? 將以太網連接轉換為無線網絡連接是一種常見的需求,特別是在現代家庭中。有幾種方法可以實現這一轉換,包括使用無線
什么是無線網卡?它是如何工作的?如何安裝無線網卡?
什么是無線網卡?它是如何工作的?如何安裝無線網卡? 無線網卡(無線適配器)是一種設備,用于使計算機或其他設備能夠連接到
無線網卡槽位有哪些種類及其優勢介紹
介紹各種類型的無線網卡槽以及它們的優勢。 1. PCI槽:PCI(Peripheral Component Interconnect)槽是最常用的無線網卡插槽。它是一種用于將外接設備與計算機主板進行
選擇無線網卡的原則和方法
選擇無線網卡的原則和方法 無線網卡是一種用于連接電腦或其他設備與無線網絡的設備,它可以通過Wi-Fi信號接收和發送數據。隨著無線網絡的廣泛應
評論