热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Linux/Android系统开发串口驱动源码,FIFO模式

该驱动适用于采用linux和android系统平台的CC串口开发。FIFO发送模式:创建数据发送FIFO队列,在多任务数据发送情境下,既

该驱动适用于采用linux和android系统平台的C/C++串口开发。

FIFO发送模式:创建数据发送FIFO队列,在多任务数据发送情境下,既能保证数据发送任务能够得到执行,又可解决数据发送冲突问题。

select接收数据:有效监听串口接收数据,提高执行效率,减少出错概率。

 

串口参数配置驱动,参考:https://blog.csdn.net/weixin_40779546/article/details/81703482

select监听串口数据,参考:https://blog.csdn.net/weixin_40779546/article/details/81449852

 

源代码如下:

uart.h

//
// Created by taxiang&xuezi on 2018/4/2.
//#ifndef NDKAPPECG_UART_H
#define NDKAPPECG_UART_H
#include "typedef.h"#ifdef UART_GLOBALS
#define UART_EXT
#else
#define UART_EXT extern
#endif#define UART_DBG 1#define UART_TX_EVENT_FIFO (32)
#define UART_BUF_SIZE (1024)enum UART_EVENT_SET{UART_EVENT_IDLE = 0,//eventUART_EVENT_VERION,UART_EVENT_DATA_START,UART_EVENT_DATA_STOP,UART_EVENT_DEFAULT,
};struct S_UART_TX_EVENT_SET{s32 fifo[UART_TX_EVENT_FIFO];s32 head;s32 tail;
};struct S_UART_RX {s32 fd;u8 buf[UART_BUF_SIZE];s32 len;
};struct S_UART_TX {s32 fd;u8 buf[UART_BUF_SIZE];s32 len;
};UART_EXT struct S_UART_RX s_uart3_rx;
UART_EXT struct S_UART_TX s_uart3_tx;
UART_EXT struct S_UART_TX_EVENT_SET s_uart_tx_event;UART_EXT s32 uart_insert_tx_event(int txevent);
UART_EXT s32 uart_tx_task(struct S_UART_TX *uart_ptr);
UART_EXT s32 uart_rx_task(s32 fd,s32 recv_len,s8 *recv_data);
#endif //NDKAPPECG_UART_H

uart.c/uart.cpp

//
// Created by taxiang&xuezi on 2018/4/2.
//#define UART_GLOBALS
#include "includes.h"#ifdef UART_DBG
#define UART_PRINT0(X) printf(X);
#define UART_PRINT1(X,A) printf (X,A);
#define UART_PRINT2(X,A,B) printf (X,A,B);
#define UART_PRINT3(X,A,B,C) printf (X,A,B,C);
#else
#define UART_PRINT0(X)
#define UART_PRINT1(X,A)
#define UART_PRINT2(X,A,B)
#define UART_PRINT3(X,A,B,C)
#endif/*******************************************************************************
* 函数名称: s32 uart_insert_tx_event(s32 tx_event)
* 函数功能: 串口添加发送事件到fifo
* 输入参数:
* 输出参数:
* 返回值 :
*******************************************************************************/
s32 uart_insert_tx_event(s32 tx_event)
{s_uart_tx_event.fifo[s_uart_tx_event.head] = tx_event;s_uart_tx_event.head++;if (s_uart_tx_event.head >= UART_TX_EVENT_FIFO) {s_uart_tx_event.head = 0;}return 0;
}/*******************************************************************************
* 函数名称: s32 uart_tx_task(struct S_UART_TX *uart_ptr)
* 函数功能: 串口fifo发送任务
* 输入参数:
* 输出参数:
* 返回值 :
*******************************************************************************/
s32 uart_tx_task(struct S_UART_TX *uart_ptr)
{if(s_uart_tx_event.head &#61;&#61; s_uart_tx_event.tail){return 1;}switch(s_uart_tx_event.fifo[s_uart_tx_event.tail]){case UART_EVENT_VERION:sprintf((char*)uart_ptr->buf, "Verion0.0.1\n");uart_ptr->len &#61; strlen((char*)uart_ptr->buf);break;case UART_EVENT_DATA_START:sprintf((char*)uart_ptr->buf, "data_start");uart_ptr->len &#61; strlen((char*)uart_ptr->buf);run_log("uart tx:%s",uart_ptr->buf);break;case UART_EVENT_DATA_STOP:sprintf((char*)uart_ptr->buf, "data_stop");uart_ptr->len &#61; strlen((char*)uart_ptr->buf);run_log("uart tx:%s",uart_ptr->buf);break;default:break;}s_uart_tx_event.fifo[s_uart_tx_event.tail] &#61; UART_EVENT_IDLE;s_uart_tx_event.tail&#43;&#43;;if(s_uart_tx_event.tail >&#61; UART_TX_EVENT_FIFO) {s_uart_tx_event.tail &#61; 0;}if(uart_ptr->len !&#61; 0) {int write_len &#61; write(uart_ptr->fd,uart_ptr->buf,uart_ptr->len);if(write_len &#61;&#61; uart_ptr->len){run_log("uart send done");return 0;}else if(write_len <&#61; 0){err_log("uart send failed");return -1;}}return 0;
}
/*******************************************************************************
* 函数名称: s32 uart_rx_task(s32 fd,s32 recv_len,s8 *recv_data)
* 函数功能:
* 输入参数:
* 输出参数:
* 返回值 :
***************************************************************s****************/
s32 uart_rx_task(s32 fd,s32 recv_len,s8 *recv_data)
{s8 in_buf[recv_len];s8 buf[recv_len];memset(in_buf,&#39;\0&#39;,recv_len);memset(buf,&#39;\0&#39;,recv_len);fd_set read_set;struct timeval tv;s32 max_fd &#61; 0;s32 tmp_len &#61; 0;s32 ret_val &#61; 0;s32 read_size;do{FD_ZERO(&read_set);if(fd >&#61; 0){FD_SET(fd,&read_set);}max_fd &#61; fd &#43; 1;tv.tv_sec &#61; 0;tv.tv_usec &#61; 300000;do{ret_val &#61; select(max_fd,&read_set,0,0,&tv);}while((ret_val &#61;&#61; -1) && (errno &#61;&#61; EINTR));if(ret_val &#61;&#61; -1){run_log("select(2)");}else if(ret_val &#61;&#61; 0){//timeoutfd &#61; -1;}if((fd>&#61;0) && FD_ISSET(fd,&read_set)){read_size &#61; read(fd,buf,(recv_len-tmp_len));tmp_len &#43;&#61; read_size;if(read_size &#61;&#61; -1){fd &#61; -1;}if(read_size > 0){buf[(read_size&#43;1)] &#61; &#39;\0&#39;;strcat(in_buf,buf);memset(buf,0x00,recv_len);}else{fd &#61; -1;}}}while(fd >&#61; 0);memcpy(recv_data,in_buf,tmp_len);return tmp_len;
}


推荐阅读
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 实现一个通讯录系统,可添加、删除、修改、查找、显示、清空、排序通讯录信息
    本文介绍了如何实现一个通讯录系统,该系统可以实现添加、删除、修改、查找、显示、清空、排序通讯录信息的功能。通过定义结构体LINK和PEOPLE来存储通讯录信息,使用相关函数来实现各项功能。详细介绍了每个功能的实现方法。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
author-avatar
mobiledu2502857673
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有