COM

MacOS/Linux下的串口通信

MacOS/Linux COM

Posted by Tony Chan on 2018-05-21

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


检测串口


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

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

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

设置串口设备


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

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

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

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

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

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

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

串口输入与输出


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

对于输出自然不用说了,只需要简单的cat即可。

1
sudo cat /dev/ttyUSB0

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

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

1
$ sudo echo 123 > /dev/ttyUSB0

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

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

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

1
echo -e “\x80\8F” | xxd

例子测试


手上有一个Android系统公司的产品, 通过Termux安装了一个ubuntu 32bit. 下面记录他的串口通信. 如何SSH进去不在讨论范围.

设置

1
stty -F /dev/ttyS1 raw speed 921600

显示

cat 默认是utf8 编码

1
cat /dev/ttyS1

显示

1
2
3
4
5
6
7
8
9
10
?
?I?
?I?
?I?
?I?
?I?
?I?
?I?
?I?
?I?

16进制显示

1
2
3
4
cat /dev/ttyS1|hexdump -C
cat /dev/ttyS1|hexdump
cat /dev/ttyS1|xxd
cat /dev/ttyS1|od -x
1
2
3
4
5
6
7
8
9
10
11
[[email protected] ~]# echo /etc/passwd | hexdump
0000000 652f 6374 702f 7361 7773 0a64
000000c
[[email protected] ~]# echo /etc/passwd | od -x
0000000 652f 6374 702f 7361 7773 0a64
0000014
[[email protected] ~]# echo /etc/passwd | xxd
0000000: 2f65 7463 2f70 6173 7377 640a /etc/passwd.
[[email protected] ~]# echo /etc/passwd | hexdump -C <== 规范的十六进制和ASCII码显示(Canonical hex+ASCII display )
00000000 2f 65 74 63 2f 70 61 73 73 77 64 0a |/etc/passwd.|
0000000c

输入输出

根据公司的串口通信协议 可以正常开灯

1
echo  -en "\xAA\x00\x0F\x04\x00\x10\x03\x00\x03\x04\x00\x04\x02\x3A\xCD" > /dev/ttyS1

Reference:

GitHub Repo:Tony Studio

Follow: CoderTonyCHan · GitHub