全志H616开发学习笔记(三):WiringPi安装与基本使用

官方外设SDK——WiringPi安装与基本使用

所谓外设,指通过IO口、串口等方式连接,通过IIC、PWM等方式控制的外部设备

外设和开发板建立连接,但大多数时候开发板与外设并不一定是一个厂家生产的,外设往往并不能被直接识别。所以要实现对设备的控制,就需要驱动程序。在Windows平台上有51单片机、STM32的开发经验,到了Linux环境,第一阶段先基于一个官方的外设开发SDK:wiringPi来学习设备的控制,接着学习自己编写设备驱动,加载驱动,应用层访问驱动,这样会对基于ARM Linux外设驱动开发难度和过程有一个更立体的感受。

wiringPi安装

  • 库文件获取git clone https://github.com/orangepi-xunlong/wiringOP(如果开发板网络未配置好,可在Windows环境下载文件后通过MobaXterm传到orangepi

  • 进入库目录,清除编译信息并执行构建./build clean;./build

  • 检验gpio口能否正常读取:

该命令输出了开发板上的物理针脚(从1-26有用,27后不存在!)以及与编程时实际使用编号的对应关系。供电口所在方向为右后方,由于开发板没有标注针脚,使用时注意不要插错针脚。

串口基础回顾

串口是串行接口的简称,也叫串行通信接口或串行通讯接口(常指COM接口),采用穿行通信方式。

串口协议的内容重点,包括波特率、奇偶校验位、数据位、停止位、数据寄存器的配置等

串行接口的特点:数据一位一位地顺序传送,通信线路简单,只要一对传输线路就可以实现全双工双向通信(可直接利用电话线作为传输线),大大降低了通信的成本,特别适合远距离通信。

串口接线:TX-RX,RX-TX交叉接线

常见的串口协议有RS232 RS422 等,单片机一般使用非标准的异步串行UART,即一头TTL电平,一头RS232电平

这节课的目标,就是基于全志的Linux系统,通过串口向PC机发送数据,并通过串口调试助手查看数据

在一些较为复杂的(学习、开发)场景中,香橙派、树莓派等“有系统”的开发板,由于性能上比较强大,可以承担复杂的数据运算、用户界面交互等工作,充当上位机的角色;而对于一些需要和底层交互,但又不好直接从Linux上面操作,比如温湿度传感器、振动传感器等基础模块,这些底层的交互可以交给51单片机去完成

基于wiringPi的串口开发

前面也接触过了,香橙派初始刷机登录的时候,就是采用的串口通信,这组串口ttyS0主要用于指令的传递,对于数据通信,我们常用ttyS5,即上面GPIO引脚图中的TXD.5RXD.5

首先看一下wiringPi串口的示例代码的运行效果:

该程序顺序向串口输出了ASCII码为0-255的字符,打开AiThinker串口调试助手,向串口发送数据,屏幕上也将显示对应的ASCII码。但是示例代码的逻辑是收和发在一个进程里边,有一点难以阅读

我们将其进行改造,通过创建线程的方式,主进程用于收,一个线程用于发。

点击展开
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include<stylib.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include<pthread.h>
int fd;
void* sendMessage(){
char* sendBuf;
senbBuf = (char*)malloc(sizeof(32)*32)
while(1){
mmset(sendBuf,'\0',32);
scanf("%s",sendBuf);
while(*sendBuf){
serialPutchar(fd, *sendBuf++);
}
}
}
int main ()
{
int count ;
unsigned int nextTime ;

pthread_t idSend;
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) ;
}
}

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

这里注意serialOPen时选择串口S5,并在接收字符时直接当字符而不是ASCII码输出。

这些函数我们也可以自己实现,因为WiringPiSetup实际上也是调用了C语言库中的标准函数,而Linux对串口也有专用的系统API可供调用

至于wiringPi库的串口源码,以及对应到C库源码的具体实现,如果想要了解可以先阅读serialTest.c,使用SourceInsight一步一步跟到无法往下查找,最终查到的函数,在glibc-2.3.5项目中,按Ctrl+/进行全局查找即可。

小结:这些函数相当于还是对应到标准的文件:serialOpenserialGetcharserialPutChar,到基本C的层级,对应openreadwrite等基本方法。在Linux上进行开发,这些封装好的函数能够熟练使用就行了。


全志H616开发学习笔记(三):WiringPi安装与基本使用
https://dockingyuan.top/2022/11/21/OrangePiZero2/3-官方外设SDK安装及验证/
作者
Yuan Yuan
发布于
2022年11月21日
许可协议