打印
[PSoC™ Creator]

英飞凌CYW20829+串口收发

[复制链接]
372|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
关于英飞凌CYW20829的串口收发实现,从以下几个方面进行详细说明:
UART(通用异步接收器/发送器)是嵌入式开发中最常用的设备间通信协议之一。它使用两个引脚(TX和RX)实现数据传输(设备间需要共地),如果是单向传输可以只用一个引脚。在使用串口时,需要关注的是数据流以及波特率。一个标准的数据流由10个数据位组成,包括1位起始位、7位有效数据位、1位奇偶校验位(可选)和1位停止位。
下面正式开始,并上传我进行的步骤:
打开软件,找到UART_Transmit_and_Receive工程并打开MIAN程序。

串口初始化
在英飞凌CYW20829的开发中,串口初始化是数据传输的前提。初始化通常包括设置波特率、数据位、停止位和校验位等参数。
HAL库进行配置:
cyhal_uart_cfg_t uart_config = {  
    .data_bits = 8,       // 数据位  
    .stop_bits = 1,       // 停止位  
    .parity = CYHAL_UART_PARITY_NONE, // 校验位  
    .rx_buffer = NULL,    // 接收缓冲区(示例中未使用)  
    .rx_buffer_size = 0   // 接收缓冲区大小(示例中未使用)  
};  
cyhal_uart_init(&uart_obj, CYBSP_BT_UART_TX, CYBSP_BT_UART_RX, CYBSP_BT_UART_CTS, CYBSP_BT_UART_RTS, NULL, &uart_config);  
cyhal_uart_set_baud(&uart_obj, 115200, NULL); // 设置波特率为115200
串口发送与接收
发送数据
串口发送数据通常使用cyhal_uart_putc或cyhal_uart_put_async等函数。
接收到的数据原样返回:
int main(void) {  
    cy_rslt_t result;  
    uint8_t read_data;  
  
    result = cybsp_init();  
    if (result != CY_RSLT_SUCCESS) {  
        CY_ASSERT(0);  
    }  
  
    app_uart_init(); // 假设app_uart_init中包含了上述的串口初始化代码  
  
    __enable_irq();  
  
    for (;;) {  
        if (CY_RSLT_SUCCESS == cyhal_uart_getc(&uart_obj, &read_data, 0)) {  
            cyhal_uart_putc(&uart_obj, read_data);  
        }  
    }  
}
接收数据
接收数据同样可以使用cyhal_uart_getc函数,但如果是非阻塞方式或需要处理多个字节的数据,可能需要使用更复杂的逻辑,如设置接收缓冲区、使用中断或轮询等。
使用回调函数来处理接收到的数据:
void APP_UartCB(void *callback_arg, cyhal_uart_event_t event) {  
    static uint8_t uart_rx_buffer[1]; // 假设每次只接收一个字节  
  
    switch (event) {  
        case CYHAL_UART_IRQ_RX_DONE:  
            cyhal_uart_putc(&uart_obj, uart_rx_buffer[0]); // 将接收到的数据原样返回  
            cyhal_uart_read_async(&uart_obj, uart_rx_buffer, 1); // 重新启动异步接收  
            break;  
        default:  
            break;  
    }  
}  
  
void app_uart_init(void) {  
    // ...(串口初始化代码,同上)  
  
    cyhal_uart_register_callback(&uart_obj, APP_UartCB, NULL);  
    cyhal_uart_enable_event(&uart_obj, CYHAL_UART_IRQ_RX_DONE, 2, true);  
    cyhal_uart_read_async(&uart_obj, uart_rx_buffer, 1); // 启动异步接收  
}


复制代码
// 定义一个无限循环,用于持续地从UART读取数据并发送数据  
for (;;)  
{  
    // 尝试从UART读取一个字节的数据  
    // cy_retarget_io_uart_obj 是之前已经初始化好的UART对象  
    // read_data 是用来存储读取到的数据的变量  
    // 第三个参数0表示这是一个阻塞调用,即如果没有数据可读,函数将等待直到有数据可读  
    if (CY_RSLT_SUCCESS == cyhal_uart_getc(&cy_retarget_io_uart_obj, &read_data, 0))  
    {  
        // 如果成功从UART读取到数据  
        // 尝试将读取到的数据发送回UART  
        if (CY_RSLT_SUCCESS != cyhal_uart_putc(&cy_retarget_io_uart_obj, read_data))  
        {  
            // 如果发送数据失败,则调用handle_error函数处理错误  
            handle_error();  
        }  
    }  
    else  
    {  
        // 如果从UART读取数据失败(比如因为超时或硬件问题),则调用handle_error函数处理错误  
        handle_error();  
    }  
  
    // 注意:这里没有添加任何形式的延时或条件判断来跳出循环  
    // 这意味着程序将无限期地继续执行上述操作  
}


输出返回结果:






使用特权

评论回复
沙发
weifeng90| | 2024-7-11 07:40 | 只看该作者
这种收发数据处理不好

使用特权

评论回复
板凳
meiyaolei|  楼主 | 2024-7-12 16:11 | 只看该作者
weifeng90 发表于 2024-7-11 07:40
这种收发数据处理不好

是的,不怎么好玩

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:工程师
简介:超越自我,为设计激发灵感和想象。

127

主题

567

帖子

2

粉丝