uart - 向日葵的狂享

zhangerxiaoma 2021-08-04 原文


uart

#ifndef __UART_H_
#define __UART_H_
//#include "njrc_buc_ctr.h"
//#include "wavstr_buc_ctr.h"
#define    UART0                "/dev/ttyAT1"    //0
#define UART1                "/dev/ttyAT2"    //1
#define UART2                "/dev/ttyAT3"    //2
#define WIFI_UART            "/dev/ttyAT4"    //3 modem控制的串口
#define UART_422            "/dev/ttyAT5"    //422 功放控制串口
#define FSK_UART            "/dev/ttyAT6"    //
#define UART_TEST            "/dev/ttyS1"
//#define UART_TEST            "/dev/ttyUSB0"
#define BUC_CTR_UART UART0
#define FALSE    0
#define TRUE    1
#define _DEBUG    1
extern int buc_uart_fd;
extern int buc_init(const char * uart_dev);
//extern int buc_write(SET_BUC_DATA *send_buc_data,const int fd);
//extern int buc_read(GET_BUC_DATA * buc_buf, int fd);

#endif

 

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <termios.h>
#include <fcntl.h>
#include <errno.h>
#include <time.h>
#include "uart.h"
//#include "njrc_buc_ctr.h"
//#include "wavstr_buc_ctr.h"
int buc_uart_fd = 0;

static int speed_arr[] =
    { B115200, B57600, B38400, B19200, B9600, B4800, B2400, B1200 };
static int name_arr[] =
    { 115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200 };

void set_speed(int fd, int speed)
{
    int i;
    int status;
    struct termios Opt;

    tcgetattr(fd, &Opt);
    for (i = 0; i < sizeof(speed_arr) / sizeof(int); i++) {
        if (speed == name_arr[i]) {
            tcflush(fd, TCIOFLUSH);
            cfsetispeed(&Opt, speed_arr[i]);
            cfsetospeed(&Opt, speed_arr[i]);
            status = tcsetattr(fd, TCSANOW, &Opt);
            if (status != 0) {
                perror("tcsetattr fd1");
            }
            return;
        }
        tcflush(fd, TCIOFLUSH);
    }
}
int set_Parity(int fd, int databits, int stopbits, int parity)
{
    struct termios options;

    if (tcgetattr(fd, &options) != 0) {
        perror("SetupSerial 1");
        return FALSE;
    }
    options.c_cflag &= ~CSIZE;
    switch (databits) {
    case 7:
        options.c_cflag |= CS7;
        break;
    case 8:
        options.c_cflag |= CS8;
        break;
    default:
        fprintf(stderr, "Unsupported data size\n");
        return FALSE;
    }
    switch (parity) {
    case \'n\':
    case \'N\':
        options.c_cflag &= ~PARENB;
        options.c_iflag &= ~INPCK;
        break;
    case \'o\':
    case \'O\':
        options.c_cflag |= (PARODD | PARENB);
        options.c_iflag |= INPCK;
        break;
    case \'e\':
    case \'E\':
        options.c_cflag |= PARENB;
        options.c_cflag &= ~PARODD;
        options.c_iflag |= INPCK;
        break;
    case \'S\':
    case \'s\':
        options.c_cflag &= ~PARENB;
        options.c_cflag &= ~CSTOPB;
        break;
    default:
        fprintf(stderr, "Unsupported parity\n");
        return FALSE;
    }
    switch (stopbits) {
    case 1:
        options.c_cflag &= ~CSTOPB;
        break;
    case 2:
        options.c_cflag |= CSTOPB;
        break;
    default:
        fprintf(stderr, "Unsupported stop bits\n");
        return FALSE;
    }

    options.c_iflag &=
        ~(IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL |
          IXON);
    options.c_oflag &= ~OPOST;
    options.c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);

    /* Set input parity option */
    if (parity != \'n\') {
        options.c_iflag |= INPCK;
    }
    options.c_cc[VTIME] = 150;    // 15 seconds
    options.c_cc[VMIN] = 0;

    tcflush(fd, TCIFLUSH);        /* Update the options and do it NOW */
    if (tcsetattr(fd, TCSANOW, &options) != 0) {
        perror("SetupSerial 3");
        return FALSE;
    }
    return TRUE;
}

/*=============================================================
 * * Function    : buc_init
 * * Description : open buc com
 * * Input Para  : ttyS(num)
 * * Output Para : buc_fd,dev fd
 * * Return Value: if error return -1 ,else return dev fd
 * *=============================================================*/
int buc_init(const char * uart_dev)
{
    int uart_fd = -1;

    if ((uart_fd = open(uart_dev, O_RDWR | O_NONBLOCK)) < 0)    // buc
    {

        perror("open() uart_fd");
        uart_fd = open(uart_dev, O_RDWR | O_NONBLOCK);
    }else;
    set_speed(uart_fd, 9600);
    if (set_Parity(uart_fd, 8, 1, \'N\') == 0)
        close(uart_fd);
    return uart_fd;
}

#if 0
/*=============================================================
 * * Function    : buc_write
 * * Description : write to buc cmd
 * * Input Para  : write msg, dev_fd
 * * Output Para : NULL
 * * Return Value: if error return -1 ,else return 0
 * *=============================================================*/
int buc_write(SET_BUC_DATA *send_buc_data,const int fd)
{
    char buf[100] = { 0 };
    int size, ret = 0, pos = 0;

    size = send_buc_data->buc_buf_len;
    memcpy(buf, send_buc_data->set_buc_buf, size);
    while (size > 0) {
        ret = write(fd, buf + pos, size);
        if (ret < 0) {
            if (errno == EINTR) {
                continue;
            }else{
                perror("write()");
                return -1;
            }
        }else;
        size -= ret;
        pos += ret;

    }
    return 0;
}

/*=============================================================
 * * Function    : buc_read
 * * Description : read msg from buc
 * * Input Para  : read msg struct addr, dev_fd
 * * Output Para : read msg
 * * Return Value: if error return -1 ,else return 0
 * *=============================================================*/
int buc_read(GET_BUC_DATA * buc_buf, int fd)
{
    int num = 0, num_tmp = 0, return_num = 0;
    char i = 0;
    int loop = 50;
    if(buc_buf->buc_buf_len < 1)
        buc_buf->buc_buf_len = 47;
    buc_buf->read_len = 0;
    if (fd < 1) {
        fd = buc_init(BUC_CTR_UART);
        buc_uart_fd = fd;
    }
    if (fd > 0) {
        while (loop) {
            usleep(300);
            num_tmp = read(fd, &(buc_buf->get_buc_buf[num]), buc_buf->buc_buf_len+1);
            if(num_tmp > -1){
                num += num_tmp;
            }else;
            if (num >= buc_buf->buc_buf_len) {
                break;
            } else;
            loop--;
        }
//        if (num >= buc_buf->buc_buf_len) {
#if _DEBUG
            printf("num:%d\n",num);
            for (i = 0; i < num; i++) {
                //printf("[%d][%02x]%c ",i, buc_buf->get_buc_buf[i], buc_buf->get_buc_buf[i]);
                printf("[%d]%c " ,i,buc_buf->get_buc_buf[i]);
            }
            printf("\n");
#endif
//         } else;
    }else
        return_num = -1;

    buc_buf->read_len = num;
    return return_num;
}
#endif

 

发表于
2019-04-24 16:13 
向日葵的狂享 
阅读(195
评论(0
编辑 
收藏 
举报

 

版权声明:本文为zhangerxiaoma原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/zhangerxiaoma/p/10763003.html

uart - 向日葵的狂享的更多相关文章

  1. my live / PC keyboard / ThinkPad TrackPoint Keyboard II / KT-1525 / KU-1255 / KC-1957 / 4x30k12182 / FRU:5D50X49562 / Thinkpad Mluti Connect Bluttooth Keyboard with Trackpoint

    S ThinkPad TrackPoint Keyboard II  https://support.leno […]...

  2. Layui前端框架介绍 – jack_Meng

    Layui前端框架介绍 开始使用 – 入门指南 layui(谐音:类UI) 是一款采用自身模块规范 […]...

  3. 百度VS高德:LBS开发平台ios SDK对比评测 – Stars-OnMyWay

    百度VS高德:LBS开发平台ios SDK对比评测   随着iPhone6手机的热销,目前的iOS应用开发市场 […]...

  4. 使用nodejs + wecharty打造你的个人微信机器人

    开源地址:https://github.com/isnl/wechat-robot 注: 从2017年6月下旬 […]...

  5. Ghost系统安装教程图解 – … 黒液…

    随着ghost11的发布,雨林木风也顺应时代发展,推出了自己新的Ghost系统,但是不少朋友在安装新的系统的时 […]...

  6. Linux小白教程:ubuntu 关于root权限的种种 – wqlblogger

    Linux小白教程:ubuntu 关于root权限的种种 要实现用root登录,按如下步骤操作:1.在终端运行 […]...

  7. 一款全面高效的日志分析工具,操作更简单 – ManageEngine

    一款全面高效的日志分析工具,操作更简单 Eventlog Analyzer是用来分析和审计系统及事件日志的管理 […]...

  8. tomcat配置默认访问项目和HTTP端口号 – 张子扬

    tomcat配置默认访问项目和HTTP端口号 tomcat配置 下载压缩包,解压。 配置JAVA_HOME, […]...

随机推荐

  1. 数据结构 二分查找 递归与非递归算法

    #include <stdlib.h> #include <stdio.h> //二分 […]...

  2. android + php 后台开发

    android+php 安卓与服务器的数据交互 在我们进行android开发的时候,避免不了的要进行登录注册, […]...

  3. 搭建Hadoop的HA高可用架构(超详细步骤+已验证)

    一、集群的规划 Zookeeper集群: 192.168.182.12 (bigdata12)192.168. […]...

  4. 数据挖掘入门系列教程(四点五)之Apriori算法

    目录 数据挖掘入门系列教程(四点五)之Apriori算法 频繁(项集)数据的评判标准 支持度(support) […]...

  5. IDEA创建SpringBoot项目,推荐maven方式

    IDEA创建SpringBoot项目主要有2种常用方式。 一.直接通过创建Spring Initializr […]...

  6. js 把字符串转换成数组,数组去重后再转成字符串

    js 把字符串转换成数组,数组去重后再转成字符串 数组去重使用ES6标准函数 function unique( […]...

  7. Windows下Qt+libusb PC程序与斑马打印机使用USB通信(1)——window环境下libusb的编译

    Qt没有USB类,所以这里我决定使用第三方库libusb。 1、下载libusb,下载网址:https://s […]...

  8. 2. Vue语法–插值操作&动态绑定属性 详解

    目录 1. 设置vue模板 2. vue语法–插值操作 3. 动态绑定属性–v-bin […]...

展开目录

目录导航