JZsdk_Uart.c 4.4 KB
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#include <fcntl.h>
#include <unistd.h>
#include <termios.h>
#include <sys/time.h> 


#include "BaseConfig.h"

#include "JZsdk_uart/JZsdk_Uart_UartDeal.h"
#include "JZsdk_Hal.h"

static unsigned char *Get_UartDevPath(int UartDev)
{
    switch (UartDev)
    {
        case UART_4G:
            return COMM_4G_UART_NUM;    
        break;

        case UART_DEV_1:
            return UART_DEV1_NUM;
        break;

        case UART_DEV_2:
            return UART_DEV2_NUM;
        break;
        
        default:
            return NULL;
            break;
    }
}

/********************
 * 
 * 
 *  串口使能
    使能一个串口 返回设备号
    变量1   串口设备名
	变量2  比特率
	返回 int 设备号
	例子: UartDeal_Base_CreateReceive("/dev/ttyS2", 115200)
 * 
 * 
 * **************************/
T_JZsdkReturnCode JZsdk_Uart_UartEnabled(unsigned char *UartDev, unsigned int BitRate, int *UartFd)
{
    if (UartFd == NULL)
    {
        JZSDK_LOG_ERROR("UartFd 为空");
        return JZ_ERROR_SYSTEM_MODULE_CODE_INVALID_PARAMETER;
    }

    //1、串口初始化
    //(*UartFd) = open(UartDev, O_RDWR);
    (*UartFd) = open(UartDev, O_RDWR | O_NOCTTY | O_NDELAY);
    if ((*UartFd) < 0)
    {
        JZSDK_LOG_ERROR("打开串口 %s 失败", UartDev);
        return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
    }
    else
    {
        JZSDK_LOG_INFO("打开串口 %s 成功", UartDev);
    }

    //2、获取终端信息
    struct  termios options;
	if(tcgetattr((*UartFd),&options)!= 0)									//获取终端信息
	{
		JZSDK_LOG_ERROR("获取终端信息失败!\n");
		return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
	}		

    //3、设置比特率
	switch (BitRate)
	{
        case 115200:
            cfsetispeed(&options, B115200);
            cfsetospeed(&options, B115200);
            break;
        case 230400:
            cfsetispeed(&options, B230400);
            cfsetospeed(&options, B230400);
            break;
        case 460800:
            cfsetispeed(&options, B460800);
            cfsetospeed(&options, B460800);
            break;
        case 921600:
            cfsetispeed(&options, B921600);
            cfsetospeed(&options, B921600);
            break;
        case 1000000:
            cfsetispeed(&options, B1000000);
            cfsetospeed(&options, B1000000);
            break;
		default:
			return JZ_ERROR_SYSTEM_MODULE_CODE_FAILURE;
			break;
	}

    options.c_cflag |= (unsigned) CLOCAL;
    options.c_cflag |= (unsigned) CREAD;
    options.c_cflag &= ~(unsigned) CRTSCTS;
    options.c_cflag &= ~(unsigned) CSIZE;
    options.c_cflag |= (unsigned) CS8;
    options.c_cflag &= ~(unsigned) PARENB;
    options.c_iflag &= ~(unsigned) INPCK;
    options.c_cflag &= ~(unsigned) CSTOPB;
    options.c_oflag &= ~(unsigned) OPOST;
    options.c_lflag &= ~((unsigned) ICANON | (unsigned) ECHO | (unsigned) ECHOE | (unsigned) ISIG);
    options.c_iflag &= ~((unsigned) BRKINT | (unsigned) ICRNL | (unsigned) INPCK | (unsigned) ISTRIP | (unsigned) IXON);
    options.c_cc[VTIME] = 0;
    options.c_cc[VMIN] = 0;

    tcflush((*UartFd),TCIOFLUSH);										//刷清输入、输出队列
	tcsetattr((*UartFd),TCSAFLUSH,&options);									//串口设置使能
	
    JZSDK_LOG_INFO("使能串口 波特率%d成功",BitRate);

	return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}





/****************
 * 
 *  串口重初始化
 *  该函数仅能被JZsdk_HalPort_Init调用,请勿直接使用
 * 
 * ************************/
T_JZsdkReturnCode JZsdk_Uart_ReInit(int UART_DEV_NAME, int BitRate)
{
    T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
    int UartFd = 0;

    //JZSDK_LOG_INFO("初始化串口 0x%x", UART_DEV_NAME);

    //检查是否已经初始化
    if(JZsdk_HalPort_UseFlag(UART_DEV_NAME) == JZ_FLAGCODE_ON)
    {
        //先注释掉原来的串口
        JZsdk_HalPort_SetUseFlag(UART_DEV_NAME, JZ_FLAGCODE_OFF);

        //然后关闭串口 注:该函数有延时
        JZsdk_Uart_CloseUartThead(UART_DEV_NAME);
    }

    //2、串口初始化
    ret = JZsdk_Uart_UartEnabled(Get_UartDevPath(UART_DEV_NAME), BitRate, &UartFd);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        return ret;
    }

    //3、串口接收初始化
    JZsdk_Uart_UartDeal_Receive(UartFd, UART_DEV_NAME);

    JZSDK_LOG_INFO("init %s sucess", JZsdk_DefineCode_GetPortName(UART_DEV_NAME));

    return ret;
}