一、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 ;
}

















