S32K148-uart

不好意思,上个星期因为项目和个人原因,落下一次博客分享。最近一直在搞上位机,之前用的CAN通讯做的上位机,现在因为项目原因换成modbus-rtu,所以就跟大家说说关于modbus协议中用到的uart口。

uart学名通用异步收发器

硬件不做阐述

软件通信协议重点关注几个方面:空闲位,起始位,数据位,奇偶校验位,停止位,波特率

S32K148配置过程

1)引脚配置,注意uart模块使能(专家系统自动给外设时钟使能)

 

 2)uart配置

 

初始化代码:


uint8_t UART0_bufferIdx;
uint32_t UART0_bytesRemaining;
uint8_t UART0_ReceiveBuffer[200];


void
UART0_init(void) { LPUART_DRV_Init(INST_LPUART1, &lpuart1_State, &lpuart1_InitConfig0); LPUART_DRV_InstallRxCallback(INST_LPUART1, UART0_Callback, (void *)0); LPUART_DRV_ReceiveData(INST_LPUART1, UART0_ReceiveBuffer, 1); }

uart回调函数

void UART0_Callback(void *driverState, uart_event_t event, void *userData)
 {
    (void) driverState;
    (void) userData;

     status_t state;
    state = LPUART_DRV_GetReceiveStatus(INST_LPUART1, &UART0_bytesRemaining);
    /*等待传输完成*/
//    while(state == STATUS_BUSY);

    if (state != STATUS_BUSY)
            if(state == STATUS_SUCCESS)
            {

                /*字符串附加终止符*/
                UART0_bufferIdx++;
                UART0_ReceiveBuffer[UART0_bufferIdx] = 0U;
                //接收缓存数据复制到Databuffer
                //memcpy(Databuffer,ReceiveBuffer,bufferIdx);

                UART0_bufferIdx = 0;
                /*重新接收数据*/
                LPUART_DRV_ReceiveData(INST_LPUART1, UART0_ReceiveBuffer, 1);
            }
            else
            {
                //可做其他逻辑判断

            }
        /*接收缓存FULL*/
    if (event == UART_EVENT_RX_FULL)
    {
        if ((UART0_ReceiveBuffer[UART0_bufferIdx] != '\n') && (UART0_bufferIdx != (BUFFER_SIZE - 2U)))
        {
            /*每接收一字节数据,就将储存位置指向数组的下一位,直到接收到换行符 */
            UART0_bufferIdx++;
            LPUART_DRV_SetRxBuffer(INST_LPUART1, &UART0_ReceiveBuffer[UART0_bufferIdx], 1U);

        }
    }
}

 

posted @ 2022-08-23 16:21  涛哥nihao  阅读(704)  评论(0)    收藏  举报