串口应用程序编程

1.串口的作用

UART:通用异步收发传输器,简称串口。 

作用1:调试u-boot,内核,应用程序时,主要使用串口打印调试信息

作用2:外接各种模块。比如GPS,蓝牙模块等 

串口结构简单,只有三个引脚(1)TXD (2)RXD (3)GND

TXD引脚用于发送数据,RXD引脚用于接收数据。

发送数据结构:

开始位数据位校验位停止位

注:串口双方使用的逻辑电平要一样,如果不一样,需要引入电平转化芯片。现在相对电脑没有串口,所以需要使用USB转串口芯片,在通过USB线接到电脑。

注:串口是TTL电平。

2.TTY体系中设备节点的差别

 串口子系统属于TTY体系的一部分,所以我们要讲解在TTY中设备节点的差别。

TTY中有许多设备节点:

/dev/ttyS0,/dev/ttySAC0,/dev/tty,/dev/tty0,/dev/tty1 .....,/dev/ttyn,/dev/console

TTY有许多术语:

TTY/Terminal/Console/UART

那么它们到底是什么?

TTY

TTY:输入输出设备的驱动程序被命名为TTY,代表一个体系(输入设备用shell打开)

Terminal

Terminal:虚拟终端(键盘,显示屏等)

虚拟终端对应的设备节点有:/dev/tty0,/dev/tty1 .....,/dev/ttyn。

(1).其中/dev/tty1 .....,/dev/ttyn表示不同的虚拟终端。

(2)./dev/tty0:不同的shell打开不同的终端,但是只能有一个shell在前台,那么如果我想发数据给前台怎么办?使用/dev/tty0,当不同的shell位于前台时,/dev/tty0就会访问它们的设备节点 。 

UART

在TTY体系里面,它不仅仅支持键盘和显示器,还支持串口,对于串口,它就没有虚拟终端的概念,我们可使用shell去打开串口,这个shell打开的是串口是真实终端:/dev/ttyS0,/dev/ttySAC0

shell打开的程序有虚拟终端也要真实终端,我不关心终端是虚拟的还是真实的,那么有没有办法找到我的终端吗?可以访问/dev/tty,通过它可以找到这个程序原本所使用的终端。

Console

Terminal与Console的差别

Terminal有远端的意思,中文为:终端。Console编译为控制台,可以理解为权限更大,可以查看更多信息。

(1).Console是某个Terminal

(2).Terminal并不都是Console

(3).我们可以从多个Terminal中选择某个作为Console

/dev/console

/dev/console如何选择哪个Terminal,内核的打印信息从哪个设备上显示出来?

:可以通过内核的cmdline来指定。比如console = ttyS0,console = tty

我不想去分辨这个设备是串口还是虚拟设备,有没有方法得到这个设备?有,通过/dev/console

console = ttyS0时,:/dev/console就是ttyS0

console = tty时,:/dev/console就是运行程序的虚拟终端

console = tty0时,:/dev/console就是前台程序的虚拟终端

console = ttyN时,:/dev/console就是/dev/ttyN

注:如果console有多个取值时,使用最后一个取值来判断

3 TTY驱动程序框架

3.1 TTY驱动程序初始框架

TTY就是个输入输出设备,有许多输入输出设备:比如串口,键盘作为硬件层。对于不同的硬件,会有对应的驱动层,我想让应用程序(应用层)不去区分硬件是串口还是键盘,怎么办呢? 那就有一层名为TTY(该层帮我屏蔽了不同输入输出设备的差别),怎么来帮我区分不同的设备的呢?不同的输入输出设备的驱动程序会向TTY层注册某个结构体,应用程序可以通过TTY这层使用统一的接口来访问到不同的设备。串口为真实终端,键盘为虚拟终端。对于串口这类设备,流程就是这样,但是对于虚拟终端,又多加了一层叫virtual terminal,驱动程序从键盘获得数据后会把数据发给某个virtual terminal里面, 应用程序要显示的数据也会先存入某个Buf,等那个终端位于前台时,再从Buf里把那个信息显示出来。

总结:

对于串口硬件层,驱动层,TTY层,应用程序层。
对于键盘,显示屏等硬件层,驱动层,virtual terminal层,TTY层,应用程序层。

那么有这些就够了吗?

3.2 行规层

引入:当PC端与开发板上的串口连接时,我们从PC端依次输入lsa,然后输入删除键,最后输入回车,内部流程是什么?

3.2.1 行规层接收普通字符

PC端的串口与ARM的串口连接,相互传输数据,输入l,就是PC把字符l发给ARM板,在ARM板上有驱动程序,它从硬件上得到这个字符l后,把字符l上传给“行规层(line discipline)”,在行规层发现l是普通的字符,就把这个字符重新发给驱动程序,驱动程序又重新把字符l重新发给PC端,PC接收到这个字符l后在屏幕上显示出来

注:行规层收到字符后又马上它发回去称回显 (echo)

3.2.2 行规层接收删除键

字符s和a与l的流程一样,输入完三个字符后,我又输入删除键,PC同理一样发给ARM板,ARM板也同理发给行规层,行规层里面有个Buf用于保留发来的数据(及是lsa),但是在接收到删除键后,会把Buf的最新一位删除掉,删除后,同理,ARM板也会把删除键重新发给PC,PC端接收到数据后。也把数据a给删除了。

3.2.3 行规层接收回车

PC发给ARM板回车时,RM板也同理发给行规层,行规层发现传来的数据是回车时,行规层就会把Buf中的数据(ls)上传给APP(应用层)。APP一般来说是shell,当APP接收到ls后,它回去查看当前文件下有哪些文件,然后把结果发给行规层,行规层把结果发给串口驱动程序,串口驱动程序又发给PC,PC接收到数据后显示在屏幕上。

3.2.4 行规层作用

行规层它位于终端设备驱动程序和用户进程之间,负责对输入和输出的字符数据进行处理和转换

总结来说,行规层是位于终端设备驱动程序和用户进程之间的一层软件机制,用于处理终端设备和网络连接中的数据流。它提供了输入处理、输出处理、规范模式和原始模式的切换以及控制字符处理等功能。通过行规层,用户可以更加灵活地操控和控制终端设备和网络连接。

所以真正的TTY框架手写版

3.3 TTY驱动程序框架图解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值