SHELL中实现串口通信

在windows下实现串口通信一般采用串口助手之类的东西来发送和接收信息,而LINUX也有相应的串口助手之类的东西,如xgcom,完全的图形化界面,可以在github下载源码,编译安装。当然LINUX下自然minicom之类的终端,但是使用起来也并不顺手(而且不支持16进制的发送和显示)。下面就说说如何不利用额外的工具,直接使用SHELL实现串口的通信。

一、检测串口

在LINUX下首先需要检测串行口驱动是否正常,而串行口设备一般为/dev/ttyS*,如果是USB转串行口的,则为/dev/ttyUSB*,这点只需要在/dev下查看一下即口。

假设现在连接收的设备的为/dev/ttyUBS0,则可以使用命令来查看串口情况:

$ sudo dmesg |grep -i ttyUSB0
[68364.967637] usb 3-4: pl2303 converter now attached to ttyUSB0

显然,该设备已经能够正常工作了。

二、设置串口设备

从串行口设备能正够正常工作起(已连通),串行口本质上已处于连通状态,但是这并不意味着串行口可以正常的进的通信,因为还没有设置串口的基本属性(设置过程对应着串口助手中所说的”打开串口”,而”关闭串口”则对应着将串口设置回归默认设置)。

shell的串口设置工具使用stty,是一个用于设置终端行为的工具。stty是linux的核心工具之一,基本LINUX都会有。

串口有主的设置有下面几个:

波特率(e.g. 9600)
数据位(e.g. 8)
停止位(e.g. 1)
效检位(e.g. 无效检位)

下面使用stty来完成该串口的设置:

$ sudo stty -F /dev/ttyUSB0 raw speed 9600 cs8 -parenb -cstopb cread clocal

为什么是这个样呢?下面逐个来解释一下:

-F /dev/ttyUSB0     使用-F可以指定设备名
raw                 这是一组设置的组合体,详情可man stty
speed 9600          指定波特率
cs8                 指定数据位
-parenb             无奇偶效检
-cstopb             1停止位(如果为2位,则为cstopb)
cread               允许输入能够接收
clocal              禁止调制解调器的控制信号(不明)

在完成设置之后,可以查看一下设置是否工作:

$ sudo tty -F /dev/ttyUSB0 -a
speed 9600 baud; rows 0; columns 0; line = 0;
intr = l; quit = M-I; erase = M-); kill = M-}; eof = ^?; eol = ^S;
eol2 = <undef>; swtch = ^H; start = -; stop = M-e; susp = M-^_; rprnt = ^?;
werase = <undef>; lnext = ^F; flush = <undef>; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt
-echoctl -echoke

其中比较重要的是:

speed 9600 baud; min = 1; -parenb cs8 -cstopb cread clocal

raw设置中有min=1选项,如果min=0的话,那么cat /dev/ttyUSB0将会无法显示

三、串口输入与输出

串口的输入输的输自然是比较简单,只需要将/dev/ttyUSB0当作文件一样,使用重定向或者cat来输入或输出即可。
对于输出自然不用说了,只需要简单的cat即可。

$ sudo cat /dev/ttyUSB0

如果没有数据,那么cat就会停在这个地方不动了,如果有数据,那么cat就会源源不断的将内容显示出来。下面主要说说如何输入。

最简单的的输入方法自然是使用echo命令。echo命令是足够强大的,能够输出各种格式的内容。其中最常见的是输入出文本数据:

$ sudo echo 123 > /dev/ttyUSB0

那么如果我需要输入二进制/八进制/十六进制的数据怎么办?echo自然可以使用-e选项来转换。例如,如果向ttyUSB0中输入一个十六进制的数据”80 8F”,则命令如下:

$ sudo echo  -en "\x80\x8F" > /dev/ttyUSB0

默认的echo会在后面加上换行符,所以需要-n选项去掉默认加上的换行符,关于这一点可以使用 echo -e “\x80\8F” | xxd 来查看

四、小结

直接使用shell来操作串行口的读取和写入,这使得可以使用SHELL控制串行口做一些简单的操作,相对于使用其它语言来说,要方便的多。使用SHELL完成串行的操作只需掌握三个命令:使用stty完成串行口的设置以及使用cat和echo完成串行中的输出和输入。其中最大的难点在串行口的设置上,当然,如果不懂echo的技巧的话,也会被简单的输入所难倒。

此条目发表在CODING, LINUX分类目录,贴了, 标签。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。