概念性知识
- 1.什么是串口?
串口是计算机一种常用的接口,常用串口是RS232接口,RS232事实上有三种(A,B,C),不同类别分别采用不同的电压表示on和off,使用最广泛的是RS-232-C,对应的有RS-232-C标准,也是串行通信的一个物理标准。
Windows操作系统下,串口名为COM1、COM2……
Linux操作系统下,串口设备文件名为/dev/ttyS0、/dev/ttyS1….注:USB/RS-232转换器名为/dev/ttyUSB0 - 2.什么是串行通信?
串行通信是指数据用一根传输线被逐位顺序传送,串行通信分为同步通信和异步通信,常用的是异步通信。同步通信的传输速率比异步通信更快,但大部分RS-232硬件却不支持同步通信,因为同步通信还需要其他的硬件和软件,而且传输过程中,发送设备和接收设备必须保持完全同步。
异步通信是指一帧字符用起始位和停止位来完成收发同步
异步传输数据格式:
一帧字符以起始位开始,然后是数据位、奇偶校验位、停止位。(这些数据在串口编程时,需要自己设置,即收发双方约定一致的协议)
数据位为5~8位,从最低位开始传送;
奇偶校验位:奇校验,偶校验,无校验三种方式;
停止位:可以是1位,1.5位,2位,其中,1.5位一般用不到。
- 3.串口通信协议
协议包括:收发双方的同步方式、传输控制步骤、差错检验方式、传输速率、报文格式等。
RS-232-C标准:RS-232-C标准对两个方面作了规定,即信号电平标准和控制信号线的定义。RS-232-C采用负逻辑规定逻辑电平,信号电平与通常的TTL电平也不兼容,RS-232-C将-5V~-15V规定为“1”,+5V~+15V规定为“0”。图1是TTL标准和RS-232-C标准之间的电平转换。
波特率:每秒传输数据的位数,标准波特率系列为110、300、600、1200、4800、9600和19200。可以同过编程来设置 接口的接受波特率和发送波特率,收发双方的波特率设置应该一致。
数据位:5~8位,一般设置为8位
奇偶校验位:奇校验、偶校验、无校验
停止位:1位,2位,1.5位;
Linux下串口编程
记住:Linux下皆为文件
串口编程流程:
包含头文件:
#include<iostream>
#include<stdlib.h> //标准函数库定义
#include<unistd.h> //Unix标准函数定义
#include<sys/types.h> //基本系统数据类型
#include<sys/stat.h> //文件状态定义
#include<fcntl.h> //文件控制定义
#include<errno.h> //错误号定义
其余头文件根据编程所需,自行添加。
- 1.打开串口
串口设备通过串口终端设备文件访问,文件为:/dev/ttyS0,/dev/ttyS1…;
Tips:查看当前Linux系统连接的所有串口,可以使用命令行:ls -a /dev/tty*(或ls -a /dev/ttyUSB*)
以打开文件的方式打开串口设备,调用open()函数:fd=open(port,O_RDWR|O_NOCTTY|O_NDELAY);
参数O_NOCTTY:表示打开一个终端设备,程序不会成为该终端的控制终端;
参数O_NDELAY:表示不关心端口另一端是否激活;
- 2.设置串口
最基本的设置串口包括:波特率、数据位、奇偶校验位、停止位
主要是设置struct termios结构体的各成员值
struct termio
{ unsigned short c_iflag; /* 输入模式标志 */
unsigned short c_oflag; /* 输出模式标志 */
unsigned short c_cflag; /* 控制模式标志*/
unsigned short c_lflag; /* local mode flags */
unsigned char c_line; /* line discipline */
unsigned char c_cc[NCC]; /* control characters */
};