在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的技巧的话,也会被简单的输入所难倒。