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

文章目录

      • 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 ;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

美妆行业如何通过自媒体提升品牌曝光

自媒体的出现使美妆行业的推广方式产生了变化&#xff0c;自媒体平台的用户年轻化、用户基数大、消费力较强&#xff0c;能够接受新鲜事物&#xff0c;为美妆品牌带来广阔的市场和消费人群。 因此自媒体平台的内容运营十分重要&#xff0c;今天媒介盒子就来和大家聊聊&#xf…

npm install:sill idealTree buildDeps

执行npm install&#xff0c;卡在 sill idealTree buildDeps PS D:\workspace-groovy\attendance-india-web> npm install -g cnpm --registryhttps://registry.npm.taobao.org [..................] / idealTree:node_global: sill idealTree buildDeps[.................…

基于厨师算法的无人机航迹规划-附代码

基于厨师算法的无人机航迹规划 文章目录 基于厨师算法的无人机航迹规划1.厨师搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要&#xff1a;本文主要介绍利用厨师算法来优化无人机航迹规划。 1.厨师搜索算法 …

NSSCTF web刷题记录4

文章目录 [NSSRound#4 SWPU]1zweb(revenge)[强网杯 2019]高明的黑客[BJDCTF 2020]Cookie is so subtle![MoeCTF 2021]fake game[第五空间 2021]PNG图片转换器[ASIS 2019]Unicorn shop[justCTF 2020]gofs[UUCTF 2022 新生赛]phonecode[b01lers 2020]Life On Mars[HZNUCTF 2023 f…

Python 中 Selenium 的 getAttribute() 函数

Selenium 的 Python 模块旨在提供自动化测试过程。 Selenium Python 绑定包括一个用于编写 Selenium WebDriver 功能/验收测试的简单 API。 拥有移动能力并没有多大好处。 我们想要与页面交互&#xff0c;或者更准确地说&#xff0c;与组成页面的 HTML 片段交互。 本文将解释…

基于springboot和vue的校园二手物品交易管理系统

博主24h在线&#xff0c;想要源码文档部署视频直接私聊&#xff0c;全网最低价&#xff0c;9.9拿走&#xff01; 基于VUE的校园二手物品交易管理系统8 1、项目介绍 基于VUE的校园二手物品交易管理系统8拥有两种角色 管理员&#xff1a;闲置物品管理、订单管理、用户管理 用户…

【bug-maven】(一)java: 错误: 不支持发行版本 5 (二):java: 错误: 无效的源发行版:15

【bug-maven】&#xff08;一&#xff09;java: 错误: 不支持发行版本 5 &#xff08;二&#xff09;&#xff1a;java: 错误: 无效的源发行版&#xff1a;15 &#xff08;一&#xff09;java: 错误: 不支持发行版本 5 报错截图&#xff1a; 出错原因&#xff1a; 打开Projec…

SAP-MM-查找采购订单的创建和修改日期

在采购订单页面可以查看采购订单的修改和创建&#xff0c;但是有些内容不能完成看到 例如这个订单显示是用户唐创建&#xff0c;但是他不记得是什么时候创建的&#xff0c;怎么创建的&#xff1f; 点击菜单-环境-表头更改、项目更改&#xff0c;可以查看更改内容 通过这个表可…

C语言——数组

一&#xff0c;数组的概念和特点 数组是存放两个或两个以上相邻储存单元的集合&#xff0c;每个储存单元中存放相同数据类型的数据&#xff0c;而这样的单元也被称为数组元素。 我们将这句话进行拆分&#xff0c;不难发现数组的特点有&#xff1a; 1&#xff0c;数组是存放多…

java计算机毕业设计SpringBoot在线答疑系统

项目介绍 本文从学生的功能要求出发&#xff0c;建立了在线答疑系统&#xff0c;系统中的功能模块主要是实现管理员权限&#xff1b;首页、个人中心、学生管理、教师管理、问题发布管理、疑难解答管理。教师权限&#xff1a;首页、个人中心、疑难解答管理、试卷管理、试题管理…

TCP协议

TCP 1. 格式2. TCP原理2.1 确认应答(安全机制)2.2 超时重传(安全机制)2.3 连接管理机制(安全机制)2.3.1 三次握手2.3.2 四次挥手 2.4 滑动窗口(效率机制) 2.5 流量控制(效率机制) 1. 格式 源/目的端口号&#xff1a;表示数据是从哪个进程来&#xff0c;到哪个进程去&#xff1b…

机器学习——回归

目录 一、线性回归 1、回归的概念&#xff08;Regression、Prediction&#xff09; 2、符号约定 3、算法流程 4、最小二乘法&#xff08;LSM&#xff09; 二、梯度下降 梯度下降的三种形式 1、批量梯度下降&#xff08;Batch Gradient Descent,BGD&#xff09;&#xff…

基于SpringBoot+Vue的点餐管理系统

基于springbootvue的点餐平台网站系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 菜品详情 个人中心 订单 管理员界面 菜品管理 摘要 点餐管理系统是一种用…

一个使用uniapp+vue3+ts+pinia+uview-plus开发小程序的基础模板

uniappuviewPlusvue3tspiniavite 开发基础模板 使用 uniapp vue3 ts pinia vite 开发基础模板&#xff0c;拿来即可使用&#xff0c;不要删除 yarn.lock 文件&#xff0c;否则会启动报错&#xff0c;这个可能和 pinia 的版本有关&#xff0c;所以不要随意修改。 拉取代码…

Java根据一个List内Object的两个字段去重

背景 在Java开发过程中&#xff0c;我们经常会遇到需要对List进行去重的需求。 其中常见的情况是&#xff0c;将数组去重&#xff0c;或者将对象依据某个字段去重。这两种方式均可用set属性进行处理。 今天讨论&#xff0c;有一个List&#xff0c;且其中的元素是自定义的对象&…

vscode git提交

<template><view><cu-custom bgColor"bg-gradual-blue" :isBack"true"><block slot"content">额外加工</block></cu-custom><uni-section title" "><view style"margin: 0 20px;&q…

AI:66-基于机器学习房价预测

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…

pytest 的使用===谨记

发现用例的规则 a) 文件test_.py开头和_test.py结尾 b) Test开头的类中test开头的方法&#xff08;测试类不能带有__init__方法&#xff09; c) 模块中test开头的函数&#xff08;可以不在class中&#xff09; 注意点&#xff1a; pytest是以方法为单位发现用例的&#xff0c;你…

三国志14信息查询小程序(历史武将信息一览)制作更新过程03-主要页面的设计

1&#xff0c;小程序的默认显示 分为三部分&#xff0c;头部的标题、中间的内容区和底部的标签栏。点击标签可以切换不同页面&#xff0c;这是在app.json文件中配置的。代码如下&#xff1a; //所有用到的页面都需要在 pages 数组中列出&#xff0c;否则小程序可能会出现错误或…

Wnmp服务安装并结合内网穿透实现公网远程访问——“cpolar内网穿透”

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包&#xff0c;安装完成后即可得到一个Nginx MyS…