文章目录

  • 串口的认识
    • 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串口开发相关推荐

  1. 【嵌入式Linux】基于orangepi的官方外设开发

    目录 一.WiringPi外设SDK安装 二.蜂鸣器开发 1. 蜂鸣器配合时间函数开发: 三.超声波测距模块开发 1. 原理说明 2. 时间函数 3. 超声波测距代码实现 四.sg90舵机开发 1. ...

  2. Orangepi Zero2 全志H616(一):配置初始化和启动流程

    目录 一,Orangepi简单说明 ①为什么使用全志H616 ②基本特性 ③配套操作系统支持 二,刷机和系统启动 ①准备工具 ②登录系统 ● 开发板供电 ● 登录 ● 开发板上板载LED灯测试说明 ③ ...

  3. 【Orangepi Zero2 全志H616】wiringPi外设SDK安装

    Orangepi Zero2 全志H616开发板 一.网络配置 命令扫描周围的WIFI热点 nmcli dev wifi 命令接入网络 nmcli dev wifi connect xxxxxxxx ...

  4. Linux 串口编程四 串口设备程序开发

    Linux 串口编程和程序相对来说是很简单的,之所以用博客连载来展示,主要是想在学会使用的基础上掌握相关背景,原理以及注意事项.相信在遇到问题的时候,我们就不会对于技术的概念和 API 的使用浅尝辄止 ...

  5. Linux 串口编程三 使用termios与API进行串口程序开发

    在 termios 结构体以及内部终端控制标志中,并非所有的参数对于实际的物理串口都是有效的,在使用过程中也不需要对于所有标志的作用都有所理解.事实上,快速掌握一项技术的核心点也是一种学习能力.对于使 ...

  6. linux 串口工具_会C++就能开发Linux/Android应用!这款Yoxios X3串口屏火了...

    大家好,我是小月月.今天给大家介绍一款搭载YOXIOS操作系统的YOXIOS X3串口屏,只要你会C/C++就能开发Linux/Android应用!而且小月月带来了福利--"免费试用名额&q ...

  7. 【嵌入式Linux】嵌入式Linux应用开发基础知识之串口应用编程

    文章目录 前言 1.ARM芯片是如何使用串口发送/接收数据的 2. TTY体系中设备节点的差别 做个小实验 3.TTY驱动程序框架 4.在STM32MP157上做串口实验的准备工作 4.1.使能设备树 ...

  8. 【Orangepi Zero2 全志H616】语音刷抖音 / 手机连接Linux热拔插相关

    目录 一.手机连接Linux步骤 二.adb控制指令 三.基于Linux串口实现语音刷抖音 1.语音模块控制详情 2.代码实现 一.手机连接Linux步骤 1.把手机接入开发板 2.安装adb工具,在 ...

  9. orangepi——uart串口开发(TX,RX)

    基于wiringPi的串口开发 1.简介 串口是嵌入式常用的一种通信方式,串口协议涉及到波特率.奇偶校验位.数据位.停止位等.如何配置寄存器. 串行接口的简称,按照一位一位的顺序传输. wiringP ...

最新文章

  1. ABAP门派现状报告
  2. Android 动画的分类
  3. 关于各操作系统对UVC协议支持的说明
  4. HaaS EDU K1设备资源总体介绍
  5. ajax 七牛云上传图片,学习笔记:利用七牛云上传图片小结
  6. 通信教程 | USB、HDMI、DP接口及速度
  7. 如何将ts文件转为mp4格式
  8. 应聘引擎程序需做哪些准备
  9. 晶品特装科创板上市:市值68亿 主打地面无人装备研发与产销
  10. 手机文件share.php,华为P30手机怎么使用Huawei Share功能?一碰传文件
  11. Better to follow, follow to be better(2019 ICCV)
  12. WEB网络渗透的基础知识
  13. A1490. osu!(乔明达)|概率与期望|卡常|矩阵
  14. Win10清除COM接口占用
  15. 谁动了你的五元组-Linux Netfilter NAT之nf_nat_alloc_null_binding
  16. 复旦大学计算机网络期末考试试题,复旦大学学习计算机科学技术学院期末试题练习题.doc...
  17. iebook第一门户直达服务让您生意快人一步
  18. TLS/SSL如何使用公钥加密
  19. 在线支付篇(微信)——native方式(付款码支付)
  20. 老罗的锤子砸了王自如的评测

热门文章

  1. USB CDC从理论到实践
  2. 老子云携手福昕鲲鹏,首次实现3D OFD三维版式文档的重大突破
  3. 如何能成为注册信息系统审计师(CISA)?
  4. 【干货】各区块链底层数据存储分析(一)
  5. linux蓝屏修复工具,linux 开机蓝屏怎么处理
  6. php 情书,php输出笛卡尔情书的秘密
  7. ffmpeg的操作参数
  8. 分布式中间件之消息中间件
  9. VBI和Teletext关系
  10. 基金 thread.php,基金k线