杰理AC63串口收发实例

发布时间:2024年01月11日

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

文章来源:https://blog.csdn.net/ydgd118/article/details/135511675
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。