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

一、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 ;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值