JZsdk_Uart.c 5.7 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"

/********************
 * 
 * 
 *  串口使能
    使能一个串口 返回设备号
    变量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;
}





/****************
 * 
 * 
 * 
 *  串口重初始化
 * 
 * 
 * 
 * 
 * ************************/
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 (UART_DEV_NAME == UART_DEV_1)
    {
        //1、检查串口是否已经初始化
        if(JZsdk_HalPort_UseFlag(UART_DEV_1) == JZ_FLAGCODE_ON)
        {
            //先注释掉原来的串口
            JZsdk_HalPort_SetUseFlag(UART_DEV_1, JZ_FLAGCODE_OFF);

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

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

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

        //4、将串口的标志位打开
        JZsdk_HalPort_SetUseFlag(UART_DEV_1, JZ_FLAGCODE_ON);
    }

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

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

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

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

        //4、将串口的标志位打开
        JZsdk_HalPort_SetUseFlag(UART_DEV_2, JZ_FLAGCODE_ON);
    }
    
    //初始化的是4g设备
    if (UART_DEV_NAME == UART_4G)
    {
        //1、检查串口是否已经初始化
        if(JZsdk_HalPort_UseFlag(UART_4G) == JZ_FLAGCODE_ON)
        {
            //先注释掉原来的串口
            JZsdk_HalPort_SetUseFlag(UART_4G, JZ_FLAGCODE_OFF);

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

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

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

        //4、将串口的标志位打开
        JZsdk_HalPort_SetUseFlag(UART_4G, JZ_FLAGCODE_ON);
    }

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}