243 lines
7.8 KiB
C
243 lines
7.8 KiB
C
/*
|
||
* Copyright (c) 2006-2023, RT-Thread Development Team
|
||
*
|
||
* SPDX-License-Identifier: Apache-2.0
|
||
*
|
||
* Change Logs:
|
||
* Date Author Notes
|
||
* 2023-10-08 RT-Thread first version
|
||
*/
|
||
|
||
#include <rtthread.h>
|
||
|
||
#define DBG_TAG "main"
|
||
#define DBG_LVL DBG_LOG
|
||
#include <rtdbg.h>
|
||
#include <rtdevice.h>
|
||
#include "string.h"
|
||
#include "stdlib.h"
|
||
|
||
#define LED0_PIN 21
|
||
#define LED1_PIN 69
|
||
#define BEEP_PIN 80
|
||
|
||
rt_device_t uart2;
|
||
rt_device_t uart3; // 设备
|
||
rt_sem_t uart3_recv_sem; // 接收数据的中间信号
|
||
rt_sem_t uart2_recv_sem;
|
||
static char *cmd=NULL;
|
||
static int idle = 0;
|
||
|
||
static rt_uint8_t buf[128];
|
||
static rt_uint8_t buf_len = 128;
|
||
static rt_uint8_t buf2[128];
|
||
static rt_uint8_t buf2_len = 128;
|
||
|
||
void toHex(char *dst, char *src)
|
||
{
|
||
while (*src)
|
||
{
|
||
char c = *src;
|
||
char high = (c >> 4) & 0x0F, low = c & 0x0F;
|
||
high = high < 10 ? high + '0' : high + 'A' - 10;
|
||
low = low < 10 ? low + '0' : low + 'A' - 10;
|
||
char buf[2] = "";
|
||
rt_sprintf(buf, "%c%c", high, low);
|
||
strncat(dst, buf, 2);
|
||
|
||
src++;
|
||
}
|
||
}
|
||
|
||
void unHex(char *dst, char *hexstr, int hex_len)
|
||
{
|
||
unsigned short *p = (unsigned short *)hexstr;
|
||
int i = 0;
|
||
while (i < hex_len)
|
||
{
|
||
unsigned char *q = (unsigned char *)p;
|
||
unsigned char h_char = *q;
|
||
unsigned char l_char = *(q + 1);
|
||
h_char = h_char < 'A' ? h_char - 48 : h_char - 65 + 10;
|
||
l_char = l_char < 'A' ? l_char - 48 : l_char - 65 + 10;
|
||
|
||
unsigned char c = (h_char << 4) + l_char;
|
||
char tmp_buf[2] = "";
|
||
rt_sprintf(tmp_buf, "%c", c);
|
||
strncat(dst, tmp_buf, 1);
|
||
i += 2;
|
||
p++;
|
||
}
|
||
}
|
||
|
||
void uart3_init(){
|
||
// 1. 查找uart3设备
|
||
uart3 = rt_device_find("uart3");
|
||
|
||
//2. 控制uart3设备:波特率、数据位、停止位、校验位等
|
||
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
|
||
config.baud_rate=BAUD_RATE_9600;
|
||
rt_device_control(uart3, RT_DEVICE_CTRL_CONFIG, &config);
|
||
|
||
// 3. 打开uart3设备 【DMA接收方式打开的】
|
||
rt_device_open(uart3, RT_DEVICE_OFLAG_RDWR|RT_DEVICE_FLAG_DMA_RX);
|
||
}
|
||
void uart2_init(){
|
||
uart2 = rt_device_find("uart2");
|
||
struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;
|
||
config.baud_rate=BAUD_RATE_115200;
|
||
rt_device_control(uart2, RT_DEVICE_CTRL_CONFIG, &config);
|
||
|
||
rt_device_open(uart2, RT_DEVICE_OFLAG_RDWR|RT_DEVICE_FLAG_DMA_RX);
|
||
}
|
||
|
||
static rt_thread_t beep_th;
|
||
|
||
void beep_on_entry(void *arg){
|
||
rt_kprintf("beep starting\n");
|
||
while(1){
|
||
rt_pin_write(BEEP_PIN, PIN_LOW);
|
||
rt_thread_delay(1);
|
||
rt_pin_write(BEEP_PIN, PIN_HIGH);
|
||
rt_thread_delay(1);
|
||
}
|
||
}
|
||
|
||
// 接收uart3设备的数据回调函数
|
||
// 重要说明:
|
||
// 1) size 在中断接收时,只是 1个 字节
|
||
// 2) size 在DMA方式接收时,表示DMA内存中存放的字节个数, 默认最大的字节数为64(RT-Thread Settings配置的)
|
||
rt_err_t uart3_rx_callback(rt_device_t dev, rt_size_t size){
|
||
rt_kprintf("dma rx uart3 data size: %d\n", size);
|
||
buf_len = size;
|
||
rt_sem_release(uart3_recv_sem);
|
||
return RT_EOK;
|
||
}
|
||
rt_err_t uart2_rx_callback(rt_device_t dev, rt_size_t size){
|
||
rt_kprintf("dma rx uart2 data size: %d\n", size);
|
||
buf2_len = size;
|
||
rt_sem_release(uart2_recv_sem);
|
||
return RT_EOK;
|
||
}
|
||
|
||
rt_thread_t uart3_read_th1;
|
||
rt_thread_t uart2_read_th2;
|
||
|
||
void uart2_read_task(void *arg)
|
||
{
|
||
//char pub_buf[128]="";
|
||
while(idle){
|
||
while(rt_device_read(uart2, 0, buf2, buf2_len) != buf_len){
|
||
rt_sem_take(uart2_recv_sem, RT_WAITING_FOREVER);
|
||
}
|
||
cmd = "AT+MQCON=0,4,\"client2\",3600,1,0\r\n";
|
||
rt_device_write(uart3, 0, cmd, strlen(cmd)+1);
|
||
rt_thread_mdelay(1000);
|
||
cmd = "AT+MQPUB=0,\"dht\",2,0,0,3,313233\r\n";
|
||
rt_device_write(uart3, 0, cmd, strlen(cmd)+1);
|
||
// toHex((char *)pub_buf,(char *) buf2);
|
||
// char length=strlen(pub_buf)/2;
|
||
// char *ptr = &length;
|
||
// cmd = "AT+MQPUB=0,\"temp\",2,1,0";
|
||
// rt_device_write(uart3, 0, cmd, strlen(cmd));
|
||
// rt_device_write(uart3, 0,ptr, 1);
|
||
// rt_device_write(uart3, 0, pub_buf, strlen(pub_buf));
|
||
// rt_device_write(uart3, 0,"\r\n", 1);
|
||
}
|
||
memset(buf2, 0, sizeof(buf2));
|
||
}
|
||
|
||
void uart3_read_task(void *arg){
|
||
|
||
while(1){
|
||
while(rt_device_read(uart3, 0, buf, buf_len) != buf_len){
|
||
rt_sem_take(uart3_recv_sem, RT_WAITING_FOREVER);
|
||
}
|
||
rt_kprintf("data: %s\n", buf);
|
||
char *m=NULL;
|
||
if((m=rt_strstr((char *)buf, "+MQPUB:")) != NULL){
|
||
int8_t mq_cmd_len = 0;
|
||
char *q=strtok((char *)(m+21), ",");
|
||
mq_cmd_len = atoi(q);
|
||
q = strtok(NULL, ",");
|
||
char cmd_buf[64]="";
|
||
unHex(cmd_buf, q, mq_cmd_len*2);
|
||
cmd_buf[strlen((cmd_buf)-1)] = 0;
|
||
rt_kprintf("%s\n", cmd_buf);
|
||
// 接收指令
|
||
if(rt_strncmp("beep:", (char *)cmd_buf, 5) == 0){
|
||
if(rt_strstr((char *)cmd_buf, "on") != RT_NULL){
|
||
beep_th = rt_thread_create("beep_thread", beep_on_entry,
|
||
RT_NULL, 512, 10, 5);
|
||
if(beep_th != RT_NULL){
|
||
rt_thread_startup(beep_th);
|
||
}
|
||
}else if(beep_th != RT_NULL)
|
||
rt_thread_delete(beep_th);
|
||
}else if(rt_strncmp("led0:", (char *)cmd_buf, 4) == 0){
|
||
if(rt_strstr((char *)cmd_buf, "on") != RT_NULL)
|
||
rt_pin_write(LED1_PIN, PIN_LOW);
|
||
else
|
||
rt_pin_write(LED1_PIN, PIN_HIGH);
|
||
}
|
||
else if(rt_strncmp("get_data",(char*)cmd_buf,8)==0){
|
||
idle=1;
|
||
//rt_device_write(uart2, 0,cmd_buf, strlen(cmd_buf));
|
||
if(rt_device_set_rx_indicate(uart2,uart2_rx_callback)!=RT_EOK){
|
||
rt_kprintf("rt_device_set_rx_indicate fail!");
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
//rt_device_write(uart3, 0, "OK\r", sizeof("OK\r"));
|
||
// 解析buf中的消息
|
||
memset(buf, 0, sizeof(buf));
|
||
|
||
}
|
||
|
||
int main(void)
|
||
{
|
||
// 创建信号量
|
||
uart3_recv_sem = rt_sem_create("sem1", 0, RT_IPC_FLAG_PRIO);
|
||
uart2_recv_sem = rt_sem_create("sem2", 0, RT_IPC_FLAG_PRIO);
|
||
|
||
rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); // 使能led0的GPIO
|
||
rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT); // 使能led1的GPIO
|
||
rt_pin_mode(BEEP_PIN, PIN_MODE_OUTPUT); // 使能Beep的GPIO
|
||
rt_pin_write(LED0_PIN, PIN_HIGH);
|
||
rt_pin_write(LED1_PIN, PIN_HIGH);
|
||
|
||
uart3_init();
|
||
// 4. 发送数据
|
||
cmd = "AT+MQNEW=47.109.34.218,1883,60000,128\r\n";
|
||
rt_device_write(uart3, 0, cmd, strlen(cmd)+1);
|
||
rt_thread_mdelay(1000);
|
||
cmd = "AT+MQCON=0,4,\"client1\",3600,1,0\r\n";
|
||
rt_device_write(uart3, 0, cmd, strlen(cmd)+1);
|
||
rt_thread_mdelay(1000);
|
||
cmd = "AT+MQSUB=0,\"stm32\",2\r\n";
|
||
rt_device_write(uart3, 0, cmd, strlen(cmd)+1);
|
||
|
||
|
||
// 5. 设置设备的接收回调
|
||
if(rt_device_set_rx_indicate(uart3, uart3_rx_callback) != RT_EOK){
|
||
rt_kprintf("rt_device_set_rx_indicate fail!");
|
||
}
|
||
|
||
uart3_read_th1 = rt_thread_create("th1", uart3_read_task, RT_NULL, 512, 10,
|
||
5);
|
||
uart2_read_th2=rt_thread_create("th2",uart2_read_task, RT_NULL, 512, 10, 5);
|
||
if(uart3_read_th1 != RT_NULL){
|
||
rt_kprintf("th1 create ok!\n");
|
||
rt_thread_startup(uart3_read_th1);
|
||
}
|
||
if(uart2_read_th2 != RT_NULL){
|
||
rt_kprintf("th2 create ok!\n");
|
||
rt_thread_startup(uart2_read_th2);
|
||
}
|
||
|
||
while(1);
|
||
return RT_EOK;
|
||
}
|