As we all know, most of the devices are treated as files in Linux, so is the UART for which I will give some introduction about the programming, the operations on UART are the same as the operations on files.

1. Steps about the UART programming in Linux

  1. Open the UART
  2. Initialize the UART
  3. Read from or Write to the UART
  4. Close the UART

2. Open the UART

Since the UART is treated as file, we must open the file before any other operation is done on the file.

2.1 device name

In linux, the UART device is accessed through the device file of UART device, which means we access the UART device by accessing the device files(e.g. /dev/ttyS0, /dev/ttyS1, /dev/ttyS2)

2.2 options

Call the Open() function to open the UART device, we need to use the parameter "O_NOCTTY" when opening the UART device. O_NOCTTY: It means we have opened one terminal device, the program will not become the controlling terminal of this port, if this parameter is not used, any input will affect the process of the system. O_NDELAY: It means we don't care the status of the UART's DCD signal.

2.3. Steps of opening the UART

2.3.1 open()

Open the UART by calling the function Open(), the returned value is the file descriptor.

2.3.2 fcntl()

Get the status of the UART, make sure whether the mode is blocked or not.

2.3.3 isatty()

Test whether the opened file descriptor is terminal device or not.

2.3.4 Function

int UART0_Open(int fd, char *port)
{
	fd = open(port, O_RDWR|O_NOCTTY|O_NDELAY);
	if(fd==FALSE)
	{
		perror("Can't open the serial port\n");
		return(FALSE);
	}
	if(fcntl(fd, F_SETFL, 0)<0)
	{
		printf("Fcntl failed\n");
		return(FALSE);
	}
	else
	{
		printf("Fcntl=%d\n", fcntl(fd,F_SETFL,0));
	}
	if(isatty(STDIN_FILENO)==0)
	{
		printf("Standard input is not a terminal device\n");
		return(FALSE);
	}
	else
	{
		printf("Isatty success\n");
	}
	printf("fd->open=%d\n", fd);
	return(fd);
}

3. Initialize the UART

通过这 10 个基础命令开始掌握 Linux 命令行。

你可能认为你是 Linux 新手,但实际上并不是。全球互联网用户有 3.74 亿,他们都以某种方式使用 Linux,因为 Linux 服务器占据了互联网的 90%。大多数现代路由器运行 Linux 或 Unix,TOP500 超级计算机也依赖于 Linux。如果你拥有一台 Android 智能手机,那么你的操作系统就是由 Linux 内核构建的。

换句话说,Linux 无处不在。

但是使用基于 Linux 的技术和使用 Linux 本身是有区别的。如果你对 Linux 感兴趣,但是一直在使用 PC 或者 Mac 桌面,你可能想知道你需要知道什么才能使用 Linux 命令行接口(CLI),那么你来到了正确的地方。

下面是你需要知道的基本的 Linux 命令。每一个都很简单,也很容易记住。换句话说,你不必成为比尔盖茨就能理解它们。

Linux Command Line Interface

1、 ls

你可能会想:“这是(is)什么东西?”不,那不是一个印刷错误 —— 我真的打算输入一个小写的 l。ls,或者说 “list”, 是你需要知道的使用 Linux CLI 的第一个命令。这个 list 命令在 Linux 终端中运行,以显示在存放在相应文件系统下的所有主要目录。例如,这个命令:


ls /applications

显示存储在 applications 文件夹下的每个文件夹,你将使用它来查看文件、文件夹和目录。

显示所有隐藏的文件都可以使用命令 ls -a

2、 cd

这个命令是你用来跳转(或“更改”)到一个目录的。它指导你如何从一个文件夹导航到另一个文件夹。假设你位于 Downloads 文件夹中,但你想到名为 Gym Playlist 的文件夹中,简单地输入 cd Gym Playlist 将不起作用,因为 shell 不会识别它,并会报告你正在查找的文件夹不存在。要跳转到那个文件夹,你需要包含一个反斜杠。改命令如下所示:


cd Gym\ Playlist

要从当前文件夹返回到上一个文件夹,你可以在该文件夹输入cd ..。把这两个点想象成一个后退按钮。

3、 mv

该命令将文件从一个文件夹转移到另一个文件夹;mv 代表“移动”。你可以使用这个简单的命令,就像你把一个文件拖到 PC 上的一个文件夹一样。

例如,如果我想创建一个名为 testfile 的文件来演示所有基本的 Linux 命令,并且我想将它移动到我的 Documents 文件夹中,我将输入这个命令:


mv /home/sam/testfile /home/sam/Documents/

命令的第一部分(mv)说我想移动一个文件,第二部分(home/sam/testfile)表示我想移动的文件,第三部分(/home/sam/Documents/)表示我希望传输文件的位置。

4、 快捷键

这个快速小窍门会演示如何从Ubuntu 17.10和18.04的桌面上移除回收站图标,会讨论图形和命令行两种方法。

从Ubuntu 17.10开始,Canonical使用了一个客制化的GNONE桌面作为默认的桌面环境。这个客制化的版本和之前使用的默认的桌面环境Unity很相似。

虽然我发现新的Gnome桌面是非常好,但我不喜欢其中的一点,就是桌面的回收站的图标,这让我想起来在Windows XP时代,在桌面上有一个回收站图标,但是没有直接的移除它的方法。

Ubuntu Desktop

Ubuntu 18.04和17.10是差不多一样的,在系统的默认设置里面是找不到隐藏这个回收站图标的选项的。

那么如何移除回收站的图标呢?Gnome Tweaks工具可以帮到忙!

使用GNOME Tweaks工具来从桌面移除回收站图标

如果你还没有安装它的话,你需要安装它,因为Gnome Tweaks工具可以让你细微调整你的系统,包括在Ubuntu 18.04里面安装新的主题,我不能够想象没有这个工具会是什么状态。

你可以从软件中心找到它,直接搜索它:

这里的技术技巧最初是来自谷歌的“Testing on the Toilet” (TOTT)。这里是一个修订和扩增版本。

脚本安全

我的所有bash脚本都以下面几句为开场白:

#!/bin/bash
set -o nounset
set -o errexit

这样做会避免两种常见的问题:

  1. 引用未定义的变量(缺省值为“”)
  2. 执行失败的命令被忽略

需要注意的是,有些Linux命令的某些参数可以强制忽略发生的错误,例如“mkdir -p” 和 “rm -f”。

还要注意的是,在“errexit”模式下,虽然能有效的捕捉错误,但并不能捕捉全部失败的命令,在某些情况下,一些失败的命令是无法检测到的。(更多细节请参考这个帖子。)

脚本函数

在bash里你可以定义函数,它们就跟其它命令一样,可以随意的使用;它们能让你的脚本更具可读性:

ExtractBashComments() {
   egrep "^#"
}
cat myscript.sh | ExtractBashComments | wc
comments=$(ExtractBashComments < myscript.sh)

还有一些例子:

SumLines() {  
# iterating over stdin - similar to awk      
  local sum=0
  local line=””
  while read line ; do
      sum=$((${sum} + ${line}))
  done
  echo ${sum}
}

SumLines < data_one_number_per_line.txt

log() {  
# classic logger
 local prefix="[$(date +%Y/%m/%d\ %H:%M:%S)]: "
 echo "${prefix} $@" >&2
}

log "INFO" "a message"

尽可能的把你的bash代码移入到函数里,仅把全局变量、常量和对“main”调用的语句放在最外层。

变量注解

Bash里可以对变量进行有限的注解。最重要的两个注解是:

  1. local(函数内部变量)
  2. readonly(只读变量)
# a useful idiom: DEFAULT_VAL can be overwritten
#       with an environment variable of the same name
readonly DEFAULT_VAL=${DEFAULT_VAL:-7}

myfunc() {
# initialize a local variable with the global default
  local some_var=${DEFAULT_VAL}
  ...
}

这样,你可以将一个以前不是只读变量的变量声明成只读变量:

简介

awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。

awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言 , 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。

使用方法

awk '{pattern + action}' {filenames}

尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。

awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

调用awk

有三种方式调用awk

1. 命令行方式

awk [-F field-separator] ‘commands’ input-file(s) 其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。

2. shell脚本方式

将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。 相当于shell脚本首行的: