杰理AC63串口收发实例

本文详细描述了如何在event.h中预定义串口消息,以及在app_spp_and_le.c中处理来自特定设备的串口事件。还介绍了如何创建串口接收中断回调函数、数据包处理函数以及初始化和发送测试功能,展示了杰理SDK的灵活性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在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已经给做的很好的。当然也可以直接在串口回调函数里处理数据包,不必发出消息通知系统再调用数据处理,这一点杰理还是很灵活的,由开发者自己根据实际情况选用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydgd118

您的鼓励是我最大的动力!谢赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值