一、串口的概念
1.在GEC6818的开发板上有很多串口,包括基本串口(9针)和拓展串口(4针)
2.开发板上的串口线和电脑相连,作用:控制终端
3.在开发板的右上角,有几个拓展串口,作用:用于控制外部传感器
4.什么时候会用串口?
开发板引脚资源有限,当需要接入外部传感器的时候,就需要串口通信
二、串口的术语?
RS232 RS485 TTL UART 串口 COM口 (TX RX GUN VCC)
1. RS232 RS485 TTL ----》物理层的电气特性 ----》高低电平的电压范围
低电平 高电平
TTL: 0V 5V
RS232: +3V~+15V -15V~-3V
RS485: +2V~+6V -6V~-2V
2.UART ----->串口通信协议
RS232 RS485 TTL ----》无论你基于何种电气特性,都要遵循一个协议
一般而言,有两种协议
1.同步通信 1%
2.异步通信 99%
3.串口 COM口 ----》物理连接的样式标准
USB接口
9针串口
4针串口
4.TX RX GND VCC ----->串口名字
GND 串口低电平
VCC 串口高电平
TX 发送数据 transmission
RX 接收数据 recvive
实现串口A和串口B之间通信
A ----------------- B
VCC ----------- VCC
TX ----------- RX 串口A给串口B发送信息
RX ----------- TX 串口B给串口A发送信息
GND ----------- GND
三、串口通信协议
1.同步通信 -----》要求收发的双方使用同步时钟
2.异步通信 -----》虽然不要求时钟相同,但是要求频率要同步
1)所谓频率 ----》每个单位时间内能接受的数据大小
发:1秒10字 接收:1秒10字 ----》时间可以不一样
2)既然我们选择异步通信,接收方:发送方的数据何时能到达?
异步通信做法:
1.自动规定一个空闲电平,比如是高电平 ----》数据没有到达
2.1位起始位(数据和空闲电平刚好相反,代表数据即将到达)
3.5位到8位数据位代表字符
4.1位停止位(恢复空闲电平)
5.不需要奇偶校验
基本串口的设置:
协议:serial
端口:COMX
波特率:115200 ----》频率
数据位:8
奇偶校验:无
停止位:1
--------------》绝大部分的设备都是用异步通信
四、串口编程
在linux下,一切设备皆文件,串口也是文件。
crw-rw---- 1 root root 247, 0 Jan 1 1970 ttyGS0 ---》基本串口
crw-rw---- 1 root root 247, 1 Jan 1 1970 ttyGS1 ---》拓展串口1
crw-rw---- 1 root root 247, 2 Jan 1 1970 ttyGS2 ---》拓展串口2
crw-rw---- 1 root root 247, 3 Jan 1 1970 ttyGS3 ---》拓展串口3
open("/dev/ttyGS2");
例子:串口2给串口3发信息
1.打开串口文件
int send_fd=open("/dev/ttyGS2",O_RDWR | O_NOCTTY);
int recv_fd=open("/dev/ttyGS3",O_RDWR | O_NOCTTY);
O_NOCTTY //使得该串口脱离终端的控制,因为已经有基本串口去控制终端了
If pathname refers to a terminal device—see tty(4)— it will not
become the process's controlling terminal even if the process
does not have one.
2.初始化串口 ----------》详细配置参考:课件(串口编程.ppt)
int init_tty(int fd)
{
//1.保存原先串口配置
//2. 设置原始模式
//3.激活本地连接和接收使能选项
//4.设置波特率
//5.设置数据位
//6.设置奇偶校验
//7.设置一位停止位
//8.设置等待时间
//9.清空串口缓冲区
//10.激活配置
return 0;
}
3.读写串口
读写串口操作和读写普通文件一样,使用 read()和 write()函数即可,如下所示:
write(fd, buff, strlen(buff));
read(fd, buff, BUFFER_SIZE)
开发板,串口1给串口发送消息(TX和RX要反接)----》不需要连接vcc和GND
串口1对应的是con2
串口2对应的是con3
串口3对应的是con4
注意:如果发送方使用fgets写入,那么接收方必须用sizeof计算接收的大小才能打印。
编译命令:arm-linux-gcc example.c -o example -lpthread
五、蜂鸣器模块
gec6818_beep.c ----->蜂鸣器的驱动源码
gec6818_beep.ko ----->蜂鸣器的安装包
提示:
1.先看下gec6818_beep.c
cmd 设置蜂鸣器的状态 0 ---on 1----off
2.在6818平台安装蜂鸣器驱动
2.1 查看驱动 lsmod
rtl8723bu_wifi 1810467 0 - Live 0xbf021000 (O)
x6818_humidity 2475 0 - Live 0xbf01d000 (O)
stepmotor 4256 0 - Live 0xbf018000 (O)
relay 1244 0 - Live 0xbf014000 (O)
led 1593 0 - Live 0xbf010000 (O)
gec6818_beep 1551 0 - Live 0xbf00c000 (O) ----》蜂鸣器的驱动
gas_drv 2257 0 - Live 0xbf008000 (O)
dc_motor 1802 0 - Live 0xbf004000 (O)
buttons_drv 2882 0 - Live 0xbf000000 (O)
2.2 卸载驱动 rmmod 驱动名
2.3 安装驱动 insmod 驱动文件
首先将驱动文件下载到开发板
gec6818_beep 1551 0 - Live 0xbf227000 (O)
rtl8723bu_wifi 1810467 0 - Live 0xbf021000 (O)
x6818_humidity 2475 0 - Live 0xbf01d000 (O)
stepmotor 4256 0 - Live 0xbf018000 (O)
relay 1244 0 - Live 0xbf014000 (O)
led 1593 0 - Live 0xbf010000 (O)
gas_drv 2257 0 - Live 0xbf008000 (O)
dc_motor 1802 0 - Live 0xbf004000 (O)
buttons_drv 2882 0 - Live 0xbf000000 (O)
蜂鸣器的驱动路径:/dev/beep
#include <sys/ioctl.h>
int ioctl(int d, int request, ...);
================================================
六、串口实例应用 ----GEC-RFID
发送命令 响应命令 回应命令
1.RFID的工作状态: gec6818 -----》RFID--------》gec6818
-----》串口使用中tx和rx一定要RFID相连
2.串口应该发送什么内容给RFID
1.请求命令字 -----》检测卡是否在附近
2.如果检测卡在附近,再次发送防碰撞命令字给RFID
3.请求命令字和防碰撞是如何组成的
帧长
FrameLen
包号/命令类型
SEQ/CmdType
命令/状态
Cmd/Status
信息长度
Length
信息
Info
校验和
BCC
帧结束符
检测附近的卡
FrameLen CType Cmd Length Info BCC ETX
0x07 0x02 0x41 0x01 0x52 算法 0x03
状态 (Status): 0——成功,其它——失败