当前位置: 首页 > news >正文

杰理AC63串口收发实例

在event.h文件中预定义串口消息

#define DEVICE_EVENT_FROM_MY_UART      (('M' << 24) | ('Y' << 16) | ('U' << 8) | '\0')

在app_spp_and_le.c文件里对SYS_DEVICE_EVENT做处理,添加收到DEVICE_EVENT_FROM_MY_UART消息时的处理函数my_rx_handler();

    case SYS_DEVICE_EVENT:if ((u32)event->arg == DEVICE_EVENT_FROM_MY_UART) {my_rx_handler();} else if ((u32)event->arg == DEVICE_EVENT_FROM_POWER) {return app_power_event_handler(&event->u.dev, spple_set_soft_poweroff);}

自己新建一个uart_test文件,定义以下串口接收中断回调函数和数据包处理函数

//发出消息通知系统调用my_rx_handler();
static void my_uart_isr_cb(void *ut_bus, u32 status)
{struct sys_event e;/* printf("{##%d}"); */if (status == UT_RX || status == UT_RX_OT) {e.type = SYS_DEVICE_EVENT;e.arg  = (void *)DEVICE_EVENT_FROM_MY_UART;e.u.dev.event = 0;e.u.dev.value = 0;sys_event_notify(&e);}
}//串口接收数据包处理函数//这是收到一帧数据后由串口回调函数通知系统调用的的处理,不是单个字节的串口中断处理
void my_rx_handler(void)
{u8 len = 0;len = uart_bus->read(my_ubuff, -1, 0);printf("Total length : %d \r\n",len);printf(u8 i=0;i<len;i++){printf("%c",my_ubuff[i]);}
}

定义以下串口初始化函数

const uart_bus_t *uart_bus;//定义一个串口结构体
static u8 devBuffer_static[UART_DB_SIZE] __attribute__((aligned(4)));       //dev DMA memory
u8 my_ubuff[200] = {0};
int my_uart_init(void)
{struct uart_platform_data_t u_arg = {0};u_arg.tx_pin = UART_DB_TX_PIN;u_arg.rx_pin = UART_DB_RX_PIN;u_arg.rx_cbuf = devBuffer_static;u_arg.rx_cbuf_size = UART_DB_SIZE;u_arg.frame_length = UART_DB_SIZE;u_arg.rx_timeout = 6;  //ms,兼容波特率较低u_arg.isr_cbfun = my_uart_isr_cb;//中断回调,也可以在中断回调里直接收数据u_arg.baud = UART_BAUD_RATE;u_arg.is_9bit = 0;uart_bus = uart_dev_open(&u_arg);if (uart_bus != NULL) {printf("uart_dev_open() success\n");
//        __this->udev = uart_bus;return 0;}return -1;
}

到此处,串口已经OK了,可以写几个发送函数测试一下。当然也可以使用电脑串口助手测试AC63串口接收。

static void my_uart_putbyte(char a)
{if (uart_bus != NULL) {uart_bus->putbyte(a);}
}static void my_uart_write(char *buf, u16 len)
{if (uart_bus != NULL) {uart_bus->write(buf, len);}
}void send_test(void)
{my_uart_write("123456789\r\n", strlen("123456789\r\n"));
}void uart_test(void)
{sys_timer_add(NULL, send_test, 3000);}

串口的底层操作,大家不必关心了,杰理SDK已经给做的很好的。当然也可以直接在串口回调函数里处理数据包,不必发出消息通知系统再调用数据处理,这一点杰理还是很灵活的,由开发者自己根据实际情况选用。

http://www.lryc.cn/news/277860.html

相关文章:

  • 麦芯(MachCore)开发教程1 --- 设备软件中间件
  • reset命令
  • Linux内核--进程管理(十二)LinuxIO基础知识与概念
  • gem5学习(11):将缓存添加到配置脚本中——Adding cache to the configuration script
  • 上海雏鸟科技无人机灯光秀跨年表演点亮三国五地夜空
  • 学生备考护眼台灯怎么样选择?2024五款好用台灯安利
  • Java学习,一文掌握Java之SpringBoot框架学习文集(6)
  • 美团点评秋招前端测评分享
  • docker安装nodejs,并更改为淘宝源
  • Vue中的class和style绑定
  • 出版实务 | 出版物的成本及其构成
  • docker 部署项目的操作文档,安装nginx
  • spring boot 源码解读与原理分析
  • Python基础(二十四、JSON和pyecharts)
  • Java 并发之《深入理解 JVM》关于 volatile 累加示例的思考
  • GPM合并资料整理-GEM部分
  • STM32使用1.69寸液晶显示模块使用缓冲区实现快速刷新全屏显示字符串功能
  • SpringBoot AOP
  • 鉴源论坛 · 观模丨浅谈Web渗透之信息收集(下)
  • 构建自己的私人GPT-支持中文
  • php将文本内容写入一个文件(面向过程写法)
  • SPDK As IPU Firmware
  • 快速删除node_modules文件夹
  • Mac安装nvm以及使用nvm安装node
  • vue element-ui的table列表中展示缩略图片效果实例
  • C/C++动态内存管理
  • 矩阵中的最长递增路径
  • vue2 element 弹出框拖拽会出现一层阴影问题
  • idea git回滚之前提交记录
  • 什么是Modbus协议?