Orangepi Zero2 基于官方外设开发(二)

news2024/12/24 9:49:04

一、OLED屏显示-IIC协议

1、相关介绍

IIC及OLED相关内容请参考以下文章:

IIC协议_单行梦想家的博客-CSDN博客

OLED显示屏_单行梦想家的博客-CSDN博客

2、OrangePi的IIC接口

由原理图可知,Orange Pi Zero 2 可用的 i2c i2c3

 Linux系统启动后,先确认存在IIC的i2c-3的设备节点

 安装i2c-tools:sudo apt-get install i2c-tools

查看屏幕地址:sudo i2cdetect -y 3

 3、验证官方代码

将官方代码拷贝至自己创建的文件夹里

运行官方代码

 显示结果:

 4、显示自己想要的内容

#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>

#include "oled.h"
#include "font.h"

int oled_show(struct display_info *disp) {
	int i;
	char buf[100];

	oled_putstrto(disp, 0, 9+1, "Welcome to my home");
	disp->font = font1;
	oled_putstrto(disp, 0, 20, "---adjahirhimj---");
	disp->font = font1;
	oled_send_buffer(disp);
	return 0;
}

void show_usage(char *progname) {
	printf("\nUsage:\n%s <I2C bus device node >\n", progname);
}

int main(int argc, char **argv) {
	int e;
	char filename[32];
	struct display_info disp;

	if (argc < 2) {
		show_usage(argv[0]);
		
		return -1;
	}

	memset(&disp, 0, sizeof(disp));
	sprintf(filename, "%s", argv[1]);
	disp.address = OLED_I2C_ADDR;
	disp.font = font2;

	e = oled_open(&disp, filename);

	e = oled_init(&disp);
	oled_show(&disp);
	return 0;
}

显示结果:

 二、串口

1、串口介绍

详细介绍请参考以下文章:

51单片机-串口_51单片机串口配置_单行梦想家的博客-CSDN博客

2、基于wiringPi开发

①创建一个线程用来发送,主线程接收数据

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdlib.h>

int fd;

//线程调用处理函数
void *Sendhandler()
{
	char *sendBuf;
	sendBuf = (char *)malloc(32*sizeof(32));
	while(1){
		memset(sendBuf,'\0',32);
		scanf("%s",sendBuf);
		while(*sendBuf){
			serialPutchar(fd,*sendBuf++);
		}
	}
}

int main ()
{
	int count ;
	unsigned int nextTime ;

	pthread_t idSend;//线程ID

	if ((fd = serialOpen ("/dev/ttyS5", 115200)) < 0)
	{
		fprintf (stderr,  "Unable to open serial device: %s\n", strerror (errno)) ;
		return 1 ;
	}
    
    //创建线程
	pthread_create(&idSend,NULL,Sendhandler,NULL);

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

	while(1){
		while (serialDataAvail (fd))
		{
			printf ("%c", serialGetchar (fd)) ;
			fflush (stdout) ;
		}
	}

	printf ("\n") ;
	return 0 ;
}

②改进一下,创建两个线程,一个用来发送,另一个用来接收

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdlib.h>

int fd;

void *Sendhandler()
{
	char *sendBuf;
	sendBuf = (char *)malloc(32*sizeof(32));
	while(1){
		memset(sendBuf,'\0',32);
		scanf("%s",sendBuf);
		while(*sendBuf){
			serialPutchar(fd,*sendBuf++);
		}
	}
}

void *Revhandler()
{
	while(1){
		while (serialDataAvail (fd))
		{
			printf ("%c", serialGetchar (fd)) ;
			fflush (stdout) ;
		}
	}
}

int main ()
{
	int count ;
	unsigned int nextTime ;

	pthread_t idSend;
	pthread_t idRev;

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

	pthread_create(&idSend,NULL,Sendhandler,NULL);
	pthread_create(&idRev,NULL,Revhandler,NULL);
	if (wiringPiSetup () == -1)
	{
		fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
		return 1 ;
	}

	while(1);
	printf ("\n") ;
	return 0 ;
}

3、不使用wiringPi自己实现串口通信

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 ;
	}
	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 serialSendstring (const int fd, const char *s)
{
	int ret;
	ret = write (fd, s, strlen (s));
	if (ret < 0)
		printf("Serial Puts Error\n");
}
int serialGetstring (const int fd, char *buffer)
{
	int n_read;
	n_read = read(fd, buffer,32);
	return n_read;
}

uartTool.h

int myserialOpen (const char *device, const int baud);
void serialSendstring (const int fd, const char *s);
int serialGetstring (const int fd, char *buffer);

uartTest.c

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <pthread.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <stdlib.h>

int fd;

void *Sendhandler()
{
	char *sendBuf;
	sendBuf = (char *)malloc(32*sizeof(32));
	while(1){
		memset(sendBuf,'\0',32);
		scanf("%s",sendBuf);
		while(*sendBuf){
			serialPutchar(fd,*sendBuf++);
		}
	}
}

void *Revhandler()
{
	while(1){
		while (serialDataAvail (fd))
		{
			printf ("%c", serialGetchar (fd)) ;
			fflush (stdout) ;
		}
	}
}

int main ()
{
	int count ;
	unsigned int nextTime ;

	pthread_t idSend;
	pthread_t idRev;

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

	pthread_create(&idSend,NULL,Sendhandler,NULL);
	pthread_create(&idRev,NULL,Revhandler,NULL);
	if (wiringPiSetup () == -1)
	{
		fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;
		return 1 ;
	}

	while(1);
	printf ("\n") ;
	return 0 ;
}

 

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

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

相关文章

针对我国水资源量设计的农田灌溉收费管理平台

安科瑞虞佳豪 降水量 2013年&#xff0c;全国平均降水量661.9mm&#xff0c;折合降水总量62674.4亿立方米&#xff0c;比常年值偏多3.0%。从水资源分区看&#xff0c;松花江、辽河、海河、黄河、淮河、西北诸河6个水资源一级区&#xff08;以下简称北方6区&#xff09;平均降水…

Ubuntu22.04密码忘记怎么办 Ubuntu重置root密码方法

在Ubuntu 22.04 或其他更高版本上不小心忘记root或其他账户的密码怎么办&#xff1f; 首先uname -r查看当前系统正在使用的内核版本&#xff0c;记下来 前提&#xff1a;是你的本地电脑&#xff0c;有物理访问权限。其他如远程登录的不适用这套改密方法。 通过以下步骤&#…

基于GIS的生态敏感性评价与产业路径选择研究:以江西省吉安市为例

导读: 确立绿水青山就是金山银山的理念,建立生态经济体系,是新时代生态环境保护与经济发展的协调之道。对产业规划而言,与生态同行,构建绿色产业体系,是推动地区高质量发展的根本要求。鉴于此,文章从实证角度出发,以江西省吉安市为研究对象,采用生态敏感性评价方法,选…

rv1126板子挂载nfs、拉流测试、固件烧写

目录 一、Ubuntu NFS服务器设置设置有线网卡桥接模式安装NFS并启动NFS二、烧录固件三、配置ipwindow上安装adb修改板子的ip,与ubuntu的桥接网卡同网段四、通过ssh登录开发板五、板子上挂载nfs六、测试拉流七、遇见的问题问题一问题二一、Ubuntu NFS服务器设置 设置有线网卡桥…

openwrt上ipv6 ddns 解析

之前写过一个教程如何在openwrt上使用docker版本的ddns解析工具&#xff0c;使用docker的好处是部署简单&#xff0c;支持的域名种类多&#xff1b;openwrt的docker环境安装起来也很方便&#xff0c;尤其有不少编译好的&#xff0c;带docker环境的镜像可以用&#xff0c;例如笔…

什么是向量数据库?

&#x1f337;&#x1f341; 博主 libin9iOak带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33…

via24种人格力量之学习的力量,爱学习的特征和益处

人格力量是一种可支配的价值观&#xff0c;通常是正向的&#xff0c;有益于学习工作和日常生活的&#xff0c;在via 24种人格力量测试中&#xff0c;爱学习是其中的维度之一&#xff0c;爱学习的人格特征会让人终生受益&#xff0c;但是凡事都适度&#xff0c;如果过度的痴迷于…

检测到会话cookie中缺少HttpOnly属性

绿盟科技"远程安全评估系统"安全评估报告,这里记录一下处理过程。 检测到会话cookie中缺少HttpOnly属性 详细描述 会话cookie中缺少HttpOnly属性会导致攻击者可以通过程序(JS脚本、Applet等)获取到用户的cookie信息&#xff0c;造成用户cookie信息泄露&#xff0c…

Java 中 注解是什么?如何使用

当谈到 Java 中的注解时&#xff0c;我们指的是 Java 5 中引入的一种元数据机制&#xff0c;它允许我们在代码中添加元数据信息并在运行时读取它们。在本文中&#xff0c;我们将深入探讨 Java 中的注解&#xff0c;包括它们是什么、如何使用它们以及一些示例代码。 注解是什么&…

浅读《商用密码应用性评估白皮书》

浅读《商用密码应用性评估白皮书》 密码的重要性商用密码概念商用密码典型应用场景&#xff08;一&#xff09;电信和互联网领域&#xff08;二&#xff09;工业互联网领域&#xff08;三&#xff09;车联网领域&#xff08;四&#xff09;物联网领域&#xff08;五&#xff09…

路径规划算法:基于驾驶训练优化的路径规划算法- 附代码

路径规划算法&#xff1a;基于驾驶训练优化的路径规划算法- 附代码 文章目录 路径规划算法&#xff1a;基于驾驶训练优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要&#xff1a;本文主要介绍利用智能优化…

Redis实战篇(五)

8、达人探店 8.1 达人探店-发布探店笔记 探店笔记类似点评网站的评价&#xff0c;往往是图文结合。对应的表有两个&#xff1a; tb_blog&#xff1a;探店笔记表&#xff0c;包含笔记中的标题、文字、图片等tb_blog_comments&#xff1a;其他用户对探店笔记的评价 具体发布流…

使用SiO2和高介电常数介质的SiC功率MOSFET的栅极阻抗分析

Impedance n.阻抗 dielectric n.电解质 propagation n.传播 标题&#xff1a;Gate Impedance Analysis of SiC power MOSFETs with SiO2 and High-κ Dielectric 阅读日期&#xff1a;2023.7.13 研究了什么 这篇论文研究了SiC功率MOSFET的门电阻Zgg特性&#xff0c;包括SiO2…

大语言模型举例和相关论文推荐

大语言模型如火如荼。甚至已经爆发了“百模大战” 2023年&#xff0c;“百模大战”&#xff0c;一触即发。 因为工作需要&#xff0c;我除了参加行业、企业、研究机构的发布会和闭门会&#xff0c;还需要基于自身的业务&#xff0c;不断了解最新的AI大模型和AIGC应用。 2024…

Java线程状态

Java线程状态 有哪几种 在Java中&#xff0c;线程可以存在多种状态。以下是常见的几种线程状态&#xff1a; 新建状态&#xff08;New&#xff09;&#xff1a;当创建一个线程对象时&#xff0c;线程即处于新建状态。此时尚未调用线程的start()方法。 可运行状态&#xff08;…

26-分布式锁

1、JMeter下载安装 Index of /dist/jmeter/binaries 1.1、JMeter配置 1.1.1、JMeter页面显示中文 将jmeter.properties文件中的language=zh_CN。 1.1.2、JMeter发送请求返回的Response显示中文 将jmeter.properties文件中的sampleresult.default.encoding=UTF-8 1.2、启…

Vue绑定class样式

效果&#xff1a;指定变换成某种颜色 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title><style>.basic{width: 400px;height: 100px;border: 1px solid black;}.happy{backg…

Redis数据类型和使用场景

Redis五大基本数据结构 String,Hash,List,Set,ZSet String String是Redis最基本的数据结构&#xff0c;用来设置KV键值对&#xff0c;redis有16个数据库&#xff0c;可直接在当前数据库中set添加String的KV对。 使用场景 KV对&#xff0c;记录学生ID和姓名。<ID, NAME&g…

【高效】极致简化vuex.js(仅需6行代码),让快速敏捷开发不是梦!

vuex.js import Vue from vue; import Vuex from vuex; Vue.use(Vuex); // 设置vuex所有变量 let state {_qiangGe: false,//需要添加全局变量就在此处回车添加一个即可&#xff0c;非常方便&#xff01;&#xff01;&#xff01; }, getters {}, mutations {}, actions …

Spring【Spring体系结构、IOC_控制反转思想、Spring实现IOC 】(一)-全面详解(学习总结---从入门到深化)

目录 Spring简介 Spring体系结构 IOC_控制反转思想 IOC_自定义对象容器 IOC_Spring实现IOC IOC_Spring容器类型 IOC_对象的创建方式 Spring简介 Spring是一个开源框架&#xff0c;为简化企业级开发而生。它以IOC&#xff08;控制 反转&#xff09;和AOP&#xff0…