之前都是copy网上的代码来实现接入onenet的,这次就突破一下自己,自己从0到1写出来(因为网上暂时还没有【哭泣】)
持续更新.....
已经连上了,等我优化代码再更新文章!
目录
所需材料:
gd32f103c8t6
esp-01s
步骤:
1.实现串口助手通讯
1.1 gd32f103c8t6的串口配置
gd32的串口和stm32的串口还是有一定的区别,但是gd32变的更简单了,下面我们一起来分析代码
uart.c代码
#include "uart.h"
void GD_USART_Config()
{
// GPIO时钟使能
rcu_periph_clock_enable(RCU_GPIOA);
// rcu_periph_clock_enable(RCU_AF); //打开重映射时钟
//
// /* USART0 串口重映射使能 */
// gpio_pin_remap_config(GPIO_USART0_REMAP, ENABLE);
// USART时钟使能
rcu_periph_clock_enable(RCU_USART0);
// 配置TX为推挽复用模式
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
// 配置RX为浮空输入模式
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
// 配置串口的工作参数
usart_deinit(USART0);
usart_baudrate_set(USART0, 115200U); // 波特率
usart_word_length_set(USART0, USART_WL_8BIT); // 帧数据字长
usart_stop_bit_set(USART0, USART_STB_1BIT); // 停止位
usart_parity_config(USART0, USART_PM_NONE); // 奇偶校验位
usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE); // 硬件流控制RTS
usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE); // 硬件流控制CTS
usart_receive_config(USART0, USART_RECEIVE_ENABLE); // 使能接收
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); // 使能发送
usart_enable(USART0); // 使能串口
// 使能USART中断
nvic_irq_enable(USART0_IRQn, 0, 0);
// 使能串口接收中断
usart_interrupt_enable(USART0, USART_INT_RBNE);
}
/**
@brief 串口写入数据
@param pData -[in] 写入数据
@param dataLen -[in] 写入数据长度
@return 无
*/
void UART_Write(uint8_t *pData, uint32_t dataLen)
{
uint8_t i;
for(i = 0; i < dataLen; i++)
{
usart_data_transmit(USART0, pData[i]); // 发送一个字节数据
while(RESET == usart_flag_get(USART0, USART_FLAG_TBE)); // 发送完成判断
}
}
/**
* @brief 重定向c库函数printf到USARTx
* @retval None
*/
int fputc(int ch, FILE *f)
{
usart_data_transmit(USART0, (uint8_t)ch);
while(RESET == usart_flag_get(USART0, USART_FLAG_TBE));
return ch;
}
/**
* @brief 重定向c库函数getchar,scanf到USARTx
* @retval None
*/
int fgetc(FILE *f)
{
uint8_t ch = 0;
ch = usart_data_receive(USART0);
return ch;
}
这里实现的串口的配置,重定向c库函数getchar,scanf, 重定向c库函数printf。这样串口就能实现发数据。
那么串口这里就实现了发送,那我们接下来就实现接收,因为8266模块收到AT指令后,回返回一个参数,我们判断这个参数是否和我们预期的一样,所以就需要用到中断接收。
1.2 gd32的串口接收
因为我们需要知道AT指令返回了什么,与我们预期的结果是否一致,所以需要用到串口接收,然后把所有收到的数据存到一个数组里面,就是常说的bueffer,总体的框架如下图。
代码解析:
1.首先串口接收到数据,USART1数据寄存器的USART_INT_FLAG_RBNE会自动置一。所以我们第一件事情就是将标志位清零,为了确保下次有数据传过来
2.esp8266_buf[esp8266_cnt++] = usart_data_receive(USART1);这里就是将串口接收到的数据一位一位的存进一个buffer数组里面,里面串口是1个bit,1个bit 的发,还是从低位开始发的,所以我们这样写是最完美的。
2.移植onenet提供的代码
接下来我们就移植onenet提供的代码onenet论坛
打开网址里面的百度网盘链接,并下载里面的文件。
解压后的文件如下图,
然后我们打开第8个,如图
看到里面有这4个,除了main,其他都移植到你工程项目里面(前提是你的工程项目没有),如果你工程项目有的话,你就把没有的移植进去,然后main里面的,你缺什么就移什么,然后就去改wifi热点,和onenet 的产品ID和设备号,需要改哪些东西,文件夹里面有说明,打开看就完事,简简单单
注:虽然是stm32的例程,但是并不影响我们操作
移植完后就变成了像我这样
编译之后都是 0 error 0,waring ,编译唯一的区别就是,把stm32的串口,中断服务函数改为gd32的串口,服务函数,其他东西理都不用理,是的,理都不用理,这个很重要,画起来!
最后在这个文件里面修改这些东西,这些东西不用我教了吧。不懂的可以看我stm32连接onenet 的内容部分, 再修改一下wifi密码就完事了
然后接烧录代码,就可以了!
可以看到自己的产品是在线的就说明成功了,后面就可以上传数据和下发命令了!