Orangepi Zero2——Linux串口开发
文章目录
- 串口的认识
- UART
- RS-232
- TTL
- 香橙派有三个串口驱动设备文件
- wiringPi示例代码
- 基于wiringPi的串口开发
- 自己实现串口通信
串口的认识
串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方
式的扩展接口。串行接口(Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简
单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成
本,特别适用于远距离通信,但传送速度较慢
是设备间接线通信的一种方式
数据一位一位地顺序传送
双向通信,全双工
传送速度相对较慢
UART
异步串行是指UART(Universal Asynchronous Receiver/Transmitter),通用异步接收/发送。
UART包含TTL电平的串口和RS232电平的串口
RS-232
也称标准串口,最常用的一种[串行通讯接口,比如我们的电脑主机的9针串口 ,最高速率为20kb/s
RS-232是为点对点(即只用一对收、发设备)通讯而设计的,其传送距离最大为约15米。所以RS-232适
合本地设备之间的通信
RS232电平
- 逻辑1为-3~-15V的电压, 逻辑0为3~15V的电压
TTL
TTL是Transistor-Transistor Logic,即晶体管-晶体管逻辑的简称,它是计算机处理器控制的设备内部各部分之间通信的标准技术。
TTL电平
TTL电平信号应用广泛,是因为其数据表示采用二进制规定,
+5V等价于逻辑”1”,0V等价于逻辑”0”。
数字电路中,由TTL电子元器件组成电路的电平是个电压范围,规定:
- 输出高电平>=2.4V,输出低电平<=0.4V;
- 输入高电平>=2.0V,输入低电平<=0.8V
笔记本电脑通过TTL电平与单片机通信 :USB转TTL,使用ch340芯片
香橙派有三个串口驱动设备文件
三个引脚的为s0,是串口调试信息的接口
两排引脚的为s5,是串口通信的接口
香橙派没有s1
wiringPi示例代码
在 examples/serialTest.c
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringPi.h>
#include <wiringSerial.h>int main ()
{int fd ;int count ;unsigned int nextTime ;//serialOpen是对open函数的封装//该函数主要设置结构体struct termios,也就是设备参数初始化,将结构体的参数配置完毕通过函数发送给内核,进而配置硬件的寄存器if ((fd = serialOpen ("/dev/ttyS2", 115200)) < 0){fprintf (stderr, "Unable to open serial device: %s\n", strerror (errno)) ;return 1 ;}if (wiringPiSetup () == -1){fprintf (stdout, "Unable to start wiringPi: %s\n", strerror (errno)) ;return 1 ;}nextTime = millis () + 300 ;for (count = 0 ; count < 256 ; ){if (millis () > nextTime){printf ("\nOut: %3d: ", count) ;fflush (stdout) ;serialPutchar (fd, count) ;nextTime += 300 ;++count ;}delay (3) ;while (serialDataAvail (fd)){printf (" -> %3d", serialGetchar (fd)) ;fflush (stdout) ;}}printf ("\n") ;return 0 ;
}
WiringPi库是也是基于LinuxC库的,分析串口源码可以下载C库一起分析
C库、内核与应用层的关系图如下:
基于wiringPi的串口开发
串口通信是全双工的,可以创建两个线程
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <wiringPi.h>
#include <wiringSerial.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>int fd; //打开串口的描述符void* Sendhandler()
{ char *sendBuf; sendBuf = (char *)malloc(32*sizeof(32));while(1){ memset(sendBuf,'\0',32); scanf("%s",sendBuf); //如果不是\0就一直发送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){sleep(10);} printf ("\n") ; return 0 ;
}
自己实现串口通信
完成功能:
- 通过自己封装的open,write,read函数来完成串口的通信
实现流程:
- 首先要打开文件,得到文件的句柄,在封装的open函数中将termios结构体和status控制字发送给内核,完成硬件的初始化,传输和读取数据就是对句柄进行读写操作
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 ; //1位停止位options.c_cflag &= ~CSIZE ; //用数据位掩码清空数据位设置options.c_cflag |= CS8 ; //数据位为8options.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是控制字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 Sendstring 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 <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 <unistd.h>#include <pthread.h>
#include "uartTool.h"int fd;void* readSerial()
{char buffer[32];while(1){memset(buffer,'\0',sizeof(buffer));serialGetstring(fd, buffer);printf("GET->%s\n",buffer);}
}void* sendSerial()
{char buffer[32];while(1){memset(buffer,'\0',sizeof(buffer));scanf("%s",buffer);serialSendstring(fd, buffer);}
}int main(int argc, char **argv)
{char deviceName[32] = {'\0'};pthread_t readt;pthread_t sendt;if(argc < 2){printf("uage:%s /dev/ttyS?\n",argv[0]);return -1;}strcpy(deviceName, argv[1]);if( (fd = myserialOpen(deviceName, 115200)) == -1){printf("open %s error\n",deviceName);return -1;}pthread_create(&readt, NULL, readSerial,NULL);pthread_create(&sendt, NULL, sendSerial,NULL);while(1){sleep(10);}}
gcc uartTest.c uartTool.c -lpthread
./a.out /dev/ttyS5
Orangepi Zero2——Linux串口开发相关推荐
- 【嵌入式Linux】基于orangepi的官方外设开发
目录 一.WiringPi外设SDK安装 二.蜂鸣器开发 1. 蜂鸣器配合时间函数开发: 三.超声波测距模块开发 1. 原理说明 2. 时间函数 3. 超声波测距代码实现 四.sg90舵机开发 1. ...
- Orangepi Zero2 全志H616(一):配置初始化和启动流程
目录 一,Orangepi简单说明 ①为什么使用全志H616 ②基本特性 ③配套操作系统支持 二,刷机和系统启动 ①准备工具 ②登录系统 ● 开发板供电 ● 登录 ● 开发板上板载LED灯测试说明 ③ ...
- 【Orangepi Zero2 全志H616】wiringPi外设SDK安装
Orangepi Zero2 全志H616开发板 一.网络配置 命令扫描周围的WIFI热点 nmcli dev wifi 命令接入网络 nmcli dev wifi connect xxxxxxxx ...
- Linux 串口编程四 串口设备程序开发
Linux 串口编程和程序相对来说是很简单的,之所以用博客连载来展示,主要是想在学会使用的基础上掌握相关背景,原理以及注意事项.相信在遇到问题的时候,我们就不会对于技术的概念和 API 的使用浅尝辄止 ...
- Linux 串口编程三 使用termios与API进行串口程序开发
在 termios 结构体以及内部终端控制标志中,并非所有的参数对于实际的物理串口都是有效的,在使用过程中也不需要对于所有标志的作用都有所理解.事实上,快速掌握一项技术的核心点也是一种学习能力.对于使 ...
- linux 串口工具_会C++就能开发Linux/Android应用!这款Yoxios X3串口屏火了...
大家好,我是小月月.今天给大家介绍一款搭载YOXIOS操作系统的YOXIOS X3串口屏,只要你会C/C++就能开发Linux/Android应用!而且小月月带来了福利--"免费试用名额&q ...
- 【嵌入式Linux】嵌入式Linux应用开发基础知识之串口应用编程
文章目录 前言 1.ARM芯片是如何使用串口发送/接收数据的 2. TTY体系中设备节点的差别 做个小实验 3.TTY驱动程序框架 4.在STM32MP157上做串口实验的准备工作 4.1.使能设备树 ...
- 【Orangepi Zero2 全志H616】语音刷抖音 / 手机连接Linux热拔插相关
目录 一.手机连接Linux步骤 二.adb控制指令 三.基于Linux串口实现语音刷抖音 1.语音模块控制详情 2.代码实现 一.手机连接Linux步骤 1.把手机接入开发板 2.安装adb工具,在 ...
- orangepi——uart串口开发(TX,RX)
基于wiringPi的串口开发 1.简介 串口是嵌入式常用的一种通信方式,串口协议涉及到波特率.奇偶校验位.数据位.停止位等.如何配置寄存器. 串行接口的简称,按照一位一位的顺序传输. wiringP ...
最新文章
- ABAP门派现状报告
- Android 动画的分类
- 关于各操作系统对UVC协议支持的说明
- HaaS EDU K1设备资源总体介绍
- ajax 七牛云上传图片,学习笔记:利用七牛云上传图片小结
- 通信教程 | USB、HDMI、DP接口及速度
- 如何将ts文件转为mp4格式
- 应聘引擎程序需做哪些准备
- 晶品特装科创板上市:市值68亿 主打地面无人装备研发与产销
- 手机文件share.php,华为P30手机怎么使用Huawei Share功能?一碰传文件
- Better to follow, follow to be better(2019 ICCV)
- WEB网络渗透的基础知识
- A1490. osu!(乔明达)|概率与期望|卡常|矩阵
- Win10清除COM接口占用
- 谁动了你的五元组-Linux Netfilter NAT之nf_nat_alloc_null_binding
- 复旦大学计算机网络期末考试试题,复旦大学学习计算机科学技术学院期末试题练习题.doc...
- iebook第一门户直达服务让您生意快人一步
- TLS/SSL如何使用公钥加密
- 在线支付篇(微信)——native方式(付款码支付)
- 老罗的锤子砸了王自如的评测