JZsdk_Uart.c 4.1 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_Uart.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;
}







/*
*   串口重初始化,比较特殊,该函数仅能用于已经被初始化的串口
*   注意, 外部初始化串口应该用hal uart reinit
*/
T_JZsdkReturnCode JZsdk_UartReinit(T_JZsdk_UartInfo* pUartInf, int PortId)
{
    //然后关闭串口 注:该函数有延时
    JZsdk_Uart_CloseUartThead(PortId);

    return JZsdk_UartInit(pUartInf);
}

//该函数仅被hal.c引用,注意, 外部初始化串口应该用haluartinit
T_JZsdkReturnCode JZsdk_UartInit(T_JZsdk_UartInfo* pUartInfo)
{
    T_JZsdkReturnCode ret = JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;

    //串口初始化
    ret = JZsdk_Uart_UartEnabled(pUartInfo->DevicePath, pUartInfo->Baudrate, &pUartInfo->UartId);
    if (ret != JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS)
    {
        return ret;
    }

    //串口接收初始化
    JZsdk_Uart_UartDeal_Receive(pUartInfo->UartId, pUartInfo->Base.PortId);

    JZSDK_LOG_INFO("init %s sucess", JZsdk_DefineCode_GetPortName(pUartInfo->Base.PortId));

    return JZ_ERROR_SYSTEM_MODULE_CODE_SUCCESS;
}