【全志H616 使用标准库 完成自制串口库(分文件实现) orangepi zero2(开源)】.md updata: 23/11/07

news2024/11/26 4:41:53

文章目录

      • H616 把玩注意:
        • Linux内核版本5.16 及以上,需手动配置i2c-3 uart5驱动
          • 配置示例
        • 分文件编译时需将每个文件一同编译 (空格隔开)
          • 例: ggc a.c b.c b.h -lpthread -lxxx..;
      • 常用命令
        • 查看驱动文件
        • 查看内核检测信息/硬件
      • 使用wiringPi库 完成串口通讯程序:
        • serialTest.c
      • 使用标准库 完成自制串口库(分文件实现):
        • uartTool.h
        • uartTool.c
        • my_uart_ttyS5_test.c

H616 把玩注意:

Linux内核版本5.16 及以上,需手动配置i2c-3 uart5驱动

uart5 即ttyS5串口通讯口

配置示例
orangepi@orangepizero2:~/y$ uname -r //查看内核版本
5.16.17-sun50iw9 

//打开修改boot下的配置文件
orangepi@orangepizero2:~/y$ sudo vi  /boot/orangepiEnv.txt
    1 verbosity=7
    2 bootlogo=serial
    3 console=both
    4 disp_mode=1920x1080p60
    5 overlay_prefix=sun50i-h616
    6 rootdev=UUID=5e468073-a25c-4048-be42-7f5    cfc36ce25
    7 rootfstype=ext4
    8 overlays=i2c3 uart5  //在这里添加适配i2c-3和uart5
    9 usbstoragequirks=0x2537:0x1066:u,0x2537:    0x1068:u
分文件编译时需将每个文件一同编译 (空格隔开)
例: ggc a.c b.c b.h -lpthread -lxxx…;
常用可封装成一个build.sh 脚本,方便编译;
例:
orangepi@orangepizero2:~/y$ cat build.sh 
gcc $1 uartTool.h uartTool.c -lwiringPi -lwiringPiDev -lpthread -lm -lcrypt -lrt 
给sh脚本执行权限后,使用即可完成编译:
orangepi@orangepizero2:~/y$ ./build.sh my_uartxxx.c 

常用命令

查看驱动文件

例_串口:ls /dev/ttyS*
在这里插入图片描述

查看内核检测信息/硬件

例_usb设备:ls /dev/bus/usb

使用wiringPi库 完成串口通讯程序:

serialTest.c
/* serialTest.c */
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

int fd;

void* func1()
{
  char buf[32] = {0};
  char *data = buf;

  while(1){
    memset(data,'\0',32);
    printf("input send data to serial: \n");
    scanf("%s",data);
    //发送数据_串口
    int i = 0;
    while(*data){
      serialPutchar (fd, *data++) ;      
    }
  }
}

void* func2()
{
  while(1){
     while(serialDataAvail(fd)){ 
      //接收数据_串口
      printf("%c",serialGetchar (fd));
      //清空/刷新写入缓存区(标准输出流 stdout);
      //确保打印输出立即显示在控制台上,而不是在缓冲区中等待。
      fflush (stdout) ;
     }
  }
}

int main ()
{
  
  unsigned int nextTime ;

  pthread_t t1,t2;

  if ((fd = serialOpen ("/dev/ttyS5", 115200)) < 0)
  {
    fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
    return 1 ;
  }

 
  pthread_create(&t1,NULL,func1,NULL); 
  pthread_create(&t2,NULL,func2,NULL); 

   if (wiringPiSetup () == -1)
  {
    fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
    return 1 ;
  } 

  
  while(1){sleep(10);};
  
  return 0 ;
}

使用标准库 完成自制串口库(分文件实现):

uartTool.h
/* uartTool.h */
int mySerialOpen (const char *device, const int baud);
void mySerialsend (const int fd,const char* s);
int mySerialread (const int fd,char* buf);
uartTool.c
/* uartTool.c*/
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdarg.h>
#include <string.h>
#include <termios.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "wiringSerial.h"

int mySerialOpen (const char *device, const int baud)
{
	struct termios options ;
	speed_t myBaud ;
	int     status, fd ;

	switch (baud)
	{
		case    9600:	myBaud =    B9600 ; break ;
		case  115200:	myBaud =  B115200 ; break ;
		default:
						return -2 ;
	}

	if ((fd = open (device, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK)) == -1)
		return -1 ;
	fcntl (fd, F_SETFL, O_RDWR) ;

	// Get and modify current options:
	tcgetattr (fd, &options) ;
	cfmakeraw   (&options) ;
	cfsetispeed (&options, myBaud) ;
	cfsetospeed (&options, myBaud) ;

	options.c_cflag |= (CLOCAL | CREAD) ;
	options.c_cflag &= ~PARENB ;
	options.c_cflag &= ~CSTOPB ;
	options.c_cflag &= ~CSIZE ;
	options.c_cflag |= CS8 ;
	options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG) ;
	options.c_oflag &= ~OPOST ;

	options.c_cc [VMIN]  =   0 ;
	options.c_cc [VTIME] = 100 ;	// Ten seconds (100 deciseconds)
	tcsetattr (fd, TCSANOW, &options) ;
	ioctl (fd, TIOCMGET, &status);
	status |= TIOCM_DTR ;
	status |= TIOCM_RTS ;
	ioctl (fd, TIOCMSET, &status);
	usleep (10000) ;	// 10mS
	return fd ;
}


void mySerialsend (const int fd,const char* s)
{
	int ret;
	ret = write (fd, s, strlen (s));
	if (ret < 0){
		printf("Serial Puts Error\n");
	}
}

int mySerialread (const int fd,char* buf)
{
	int n_read = read (fd, buf, 1);
	if(n_read < 0){
		perror("read error");
	}
	return n_read ;
}
my_uart_ttyS5_test.c
/* my_uart_ttyS5_test.c */
#include <stdio.h>
#include <string.h>
#include <errno.h>
// #include <wiringPi.h>
// #include <wiringSerial.h>
#include <stdlib.h>
#include <pthread.h>
#include <unistd.h>

#include "uartTool.h"

int fd;

void* func1()
{
    char data[32] = {0};
    

    while(1){
        memset(data,'\0',32);
        scanf("%s",data);
        //发送数据_串口
        mySerialsend (fd, data) ;     
    }
}

void* func2()
{
    char buf[32] = {0};
    while(1){
        while(mySerialread(fd,buf)){ 
        //接收数据_串口
        printf("%s",buf);        
        }
    }
}

int main ()
{

    pthread_t t1,t2;

    if ((fd = mySerialOpen ("/dev/ttyS5", 115200)) < 0)
    {
        fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;
        return 1 ;
    }
    
    pthread_create(&t1,NULL,func1,NULL); 
    pthread_create(&t2,NULL,func2,NULL); 
    
    while(1){sleep(10);};
    
    return 0 ;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1182844.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2000-2022年上市公司专利申请、创新绩效数据

2000-2022年上市公司专利申请、创新绩效数据 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;年份、股票代码、股票简称、行业名称、行业代码、省份、城市、区县、行政区划代码、城市代码、区县代码、首次上市年份、上市状态、专利申请总量、发明专利申请总量、实用新型…

技术分享 | 使用 cURL 发送请求

cURL 是一个通过 URL 传输数据的&#xff0c;功能强大的命令行工具。cURL 可以与 Chrome Devtool 工具配合使用&#xff0c;把浏览器发送的真实请求还原出来&#xff0c;附带认证信息&#xff0c;脱离浏览器执行&#xff0c;方便开发者重放请求、修改参数调试&#xff0c;编写脚…

OJ项目——使用JWT生成Token

目录 前言 1、项目中需要修改哪些东西&#xff1f; 1.1、引入依赖 1.2、编写JWT工具类 1.3、登陆成功后&#xff0c;把以前的session修改为token 1.4、登录拦截器的修改 1.5、展示前端部分代码 前言 有兴趣的小伙伴&#xff0c;可以先看看这篇文章&#xff0c;如果使用s…

python 之 集合的相关知识

文章目录 1. 创建集合使用花括号 {}使用 set() 函数 2. 集合的特点3. 集合操作添加元素删除元素 4. 集合运算5. 不可变集合总结 在 Python 中&#xff0c;集合&#xff08;Set&#xff09;是一种无序且不重复的数据集合。它是由一组唯一元素组成的。下面是关于集合的一些基本知…

6.判断是不是闰年

#include<stdio.h>void fun(int year){if(year%40&&year%100!0||year%4000)printf("%d 是闰年\n",year);elseprintf("%d 不是闰年\n",year);}int main(){int year;scanf("%d",&year);fun(year);return 0;}

java记一次replace替换中文双引号失败的问题

事情的起因是一个Java项目中要调用第三方接口&#xff0c;而且无法远程访问该接口进行调试&#xff0c;只能本地写完功能后现场部署测试。 其中接口文档是这样描述的&#xff1a; 实际第三方接口返回值是带中文双引号的字符串【“1”】或者带有英文双引号的字符串【"1&qu…

Python武器库开发-常用模块之subprocess模块(十九)

常用模块之subprocess模块(十九) subprocess模块介绍 subprocess 模块允许我们启动一个新进程&#xff0c;并连接到它们的输入/输出/错误管道&#xff0c;从而获取返回值。subprocess 它可以用来调用第三方工具&#xff08;例如&#xff1a;exe、另一个python文件、命令行工具…

Bun 1.0.7 版本发布,实现多个 Node.js 兼容改进

导读Bun 是一个集打包工具、转译器和包管理器于一体的 JavaScript 运行时&#xff0c;由 Jarred Sumner 发布了 1.0.7 版本。本次更新实现了对 Node.js 运行时的多项兼容性改进&#xff0c;并修复了近 60 个 bug。 根据发布说明&#xff0c;本版本对 “bun install” 命令进行…

yolov8+多算法多目标追踪+实例分割+目标检测+姿态估计(代码+教程)

多目标追踪实例分割目标检测 YOLO (You Only Look Once) 是一个流行的目标检测算法&#xff0c;它能够在图像中准确地定位和识别多个物体。 本项目是基于 YOLO 算法的目标跟踪系统&#xff0c;它将 YOLO 的目标检测功能与目标跟踪技术相结合&#xff0c;实现了实时的多目标跟…

Linux笔记——Ubuntu子系统从系统盘迁移到非系统盘

Linux笔记——Ubuntu子系统从系统盘迁移到非系统盘 一、子系统迁移1. 关闭linux子系统2. 使用move-wsl进行迁移 二、 虚拟机子系统瘦身 安了子系统还没用几天&#xff0c;C盘提示我没空间了。。。剩余0kb的那种。。。Ubuntu安装的时候默认按C盘了&#xff0c;所以还是移走腾点地…

【神经网络】【GoogleNet】

1、引言 卷积神经网络是当前最热门的技术&#xff0c;我想深入地学习这门技术&#xff0c;从他的发展历史开始&#xff0c;了解神经网络算法的兴衰起伏&#xff1b;同时了解他在发展过程中的**里程碑式算法**&#xff0c;能更好的把握神经网络发展的未来趋势&#xff0c;了解神…

第1天:Python基础语法(一)

** 1、Python简介 ** Python是一种高级、通用的编程语言&#xff0c;由Guido van Rossum于1989年创造。它被设计为易于阅读和理解&#xff0c;具有简洁而清晰的语法&#xff0c;使得初学者和专业开发人员都能够轻松上手。 Python拥有丰富的标准库&#xff0c;提供了广泛的功…

生态环境领域基于R语言piecewiseSEM结构方程模型

结构方程模型&#xff08;Sructural Equation Modeling&#xff0c;SEM&#xff09;可分析系统内变量间的相互关系&#xff0c;并通过图形化方式清晰展示系统中多变量因果关系网&#xff0c;具有强大的数据分析功能和广泛的适用性&#xff0c;是近年来生态、进化、环境、地学、…

AI 绘画 | Stable Diffusion 涂鸦功能与局部重绘

在 StableDiffusion图生图的面板里&#xff0c;除了图生图&#xff08;img2img&#xff09;选卡外&#xff0c;还有局部重绘(Inpaint)&#xff0c;涂鸦(Sketch)&#xff0c;涂鸦重绘(Inpaint Sketch),上传重绘蒙版&#xff08;Inpaint Uplaod&#xff09;、批量处理&#xff08…

图像标注工具lableImg安装出错怎么办?

我们要训练自己的图像识别模型&#xff0c;首先要进行图像的标注。labelimg就是一款可视化的图像标注工具。它是用Python编写的&#xff0c;通过Qt实现其图形界面&#xff0c;尽管它只支持矩形框标注&#xff0c;但因跨平台&#xff0c;支持Linux、Mac OS、Windows&#xff0c;…

部分iOS机型 new Date() 时间 NAN

部分 iOS 机型 new Date() 时间 NAN 解决代码 是因为部分 iOS 机型 new Date(2023-01-01 00:00:00) 时&#xff0c; 获取时间戳的时间年月日用 - 分隔&#xff0c;将 - 分隔改为 / 分隔即可 new Date(2023/01/01 00:00:00)

【java】实现自定义注解校验——方法二

自定义注解校验的实现步骤&#xff1a; 1.创建注解类&#xff0c;编写校验注解&#xff0c;即类似NotEmpty注解 2.编写自定义校验的逻辑实体类&#xff0c;编写具体的校验逻辑。(这个类可以实现ConstraintValidator这个接口&#xff0c;让注解用来校验) 3.开启使用自定义注解进…

独立开发者学习的技术栈

# 前端 语言 - HTML - CSS/Sass/PostCSS - JavaScript/TypeScriptJS框架 - Vue - NuxtJS - React - NextJS - RemixJS CSS框架 - Tailwindcss - Bulma# 设计语言 - Ant Design - Material Design#后端 语言 - JavaScript/TypeScript - Python - Java - PHP 框架 - NestJS - Exp…

github 上传代码报错 fatal: Authentication failed for ‘xxxxxx‘

问题 今天一时兴起创建了个 github 新仓库&#xff0c;首次上传本地代码时&#xff0c;遇到了一个报错。本来以为是账号密码的问题&#xff0c;搞了好几次&#xff0c;发现都没错的情况下还是上传不上去。目测判断是认证相关问题&#xff0c;具体报错信息如下&#xff1a; rem…

JavaScript基础入门03

目录 1.条件语句 1.1if 语句 1.1.1基本语法格式 1.1.2练习案例 1.2三元表达式 1.3switch 2.循环语句 2.1while 循环 2.2continue 2.3break 2.4for 循环 3.数组 3.1创建数组 3.2获取数组元素 3.3新增数组元素 3.3.1. 通过修改 length 新增 3.3.2. 通过下标新增 …