linux串口编程超详尽版
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
19/30
设置串口
3、激活配置: int tcsetattr (int fd, int options ,struct termios *t) 用来将termios结构指针t内的设置值赋给当前用文件描述符 fd表示的设备终端
参数options决定什么时候改变才生效 TCSANOW———修改立即生效 TCSADRAIN——所有已经发送的输出写入fd后生效 TCSAFLUSH——输出队列为空时生效
15/30
设置串口
所有对串口的操作都是通过结构体 struct termios和几个函 数实现的,其中两个最常用的函数是tcgetattr()和 tcsetattr() 几乎在所有情况下,程序都是通过tcgetattr()函数获取设 备当前的设置,然后修改这些设置,最后用tcsetattr()使 这些设置生效。 许多程序会保存终端初始的设置并在终止运行前恢复这些设 置。
8
串行端口程序设计
c_oflag 输出模式标志,控制终端输出方式,具体参数如表6.4所示。
键 值 说 明 OPOST OLCUC ONLCR OCRNL ONOCR ONLRET OFILL OFDEL NLDLY CRDLY TABDLY 处理后输出 将输入的小写字符转换成大写字符(非POSIX) 将输入的NL(换行)转换成CR(回车)及NL(换行) 将输入的CR(回车)转换成NL(换行) 第一行不输出回车符 不输出回车符 发送填充字符以延迟终端输出 以ASCII码的DEL作为填充字符,如果未设置该参数,填充字符将是NUL(‘\0’) (非POSIX) 换行输出延时,可以取NL0(不延迟)或NL1(延迟0.1s) 回车延迟,取值范围为:CR0、CR1、CR2和 CR3 水平制表符输出延迟,取值范围为:TAB0、TAB1、TAB2和TAB3
20/30
设置串口
4、处理要写入的数据对象:
tcflush()函数 tcflush函数刷清(抛弃)输入缓存(终端驱动程序已收到,但用户程序 尚未读)或输出缓存(用户程序已经写,但尚未发送)。 原型为:int tcflush(int fd ,int queue_selector) queue_selector数应当是下列三个数之一: TCIFLUSH——丢弃驱动上已经接收到但还没读入的所有数据 TCOFLUSH——丢弃所有已经写入驱动但还没发送的数据 TCIOFLUSH——丢弃所有输入输出队列上还没有读取或发送的数据
Linux下串口程序设计
1/30
嵌入式系统设计实验二
实验时间 1班 10月27日 19:00 – 21:25 2班 10月28日 08:00 – 10:25 实验内容 串行端口程序设计(2.3必做,并提交实验报告) 第二章 其他实验(选做) 实验报告提交 时间:下周实验之前 提交方式: 发送到邮箱: chhli@ustc.edu.cn(1班), chenbo2008@ustc.edu.cn(2班), 文件命名:学号+姓名+实验二.doc 邮件主题:嵌入式系统设计实验二
16/30
保存串口当前状态
2、保存原先串口配置使用tcgetattr(fd,&oldtio)
int tcgetattr (int fd ,struct termios *t) 用于获得文件描述符fd所表示设备的当前设置值,并写入指 针 t内 .
struct termios oldtio, oldstdtio; tcgetattr(0,&oldstdtio); tcgetattr(fd,&oldtio); /* save current modem settings */
2
串行端口程序设计
实验步骤 1.阅读理解源码 源码位置:exp\basic\03_tty 阅读源码方法 Linux下使用vi编辑器(Linux、VI常用命令参考实 验指导书第七章附录7.1、7.2) windows下使用SourceInsight软件 2.编译应用程序
3
串口详细配置
在使用串口之前必须设置相关配置,包括:波特率、数据位、 校验码、停止位等。串口设置由下面结构体实现: struct termios { tcflag_t c_iflag; /* 输入模式 */ tcflag_t c_oflag; /* 输出模式 */ tcflag_t c_cflag; /* 控制模式 */ tcflag_t c_lflag; /* 本地模式 */ cc_t c_cc[NCCS]; /* 控制字符 */ } 在<arm2410s/kernel-2410s/include/asm-i386/termbits.h> 中.
tcflush(fd,TCIFLUSH);
21/30
读写串口
5、设置好串口之后,读写串口就很容易了,可以把串口当 作文件读写 发送数据: char buffer[1024]; int Length=1024; int nByte; nByte = write(fd, buffer ,Length)
VQUIT
Quit字符
VTIME
非规范模式读取时的超时时间
VERASE
Erase字符
VSTOP
Stop字符
VKILL
Kill字符
VSTART
Start字符
VEOF
End-of-file字符
VSUSP
Suspend字符
VMIN
非规范模式读取时的最小字符数
12
串口控制函数
tcgetattr tcsetattr cfgetispeed cfgetospeed cfsetispeed cfsetospeed tcdrain tcflow tcflush tcsendbreak tcgetpgrp tcsetpgrp 取属性( t e r m i o s结构) 设置属性( t e r m i o s结构) 得到输入速度 得到输出速度 设置输入速度 设置输出速度 等待所有输出都被传输 挂起传输或接收 刷清未决输入和/或输出 送B R E A K字符 得到前台进程组I D 设置前台进程组I D
4
实验目的
������ 了解在 linux 环境下串行程序设计的基本方法。 ������ 掌握终端的主要属性及设置方法,熟悉终端 I /O 函数 的使用。 ������ 学习使用多线程来完成串口的收发处理。
5/30
实验原理与程序分析
Linux 对所有各类设备文件的输入输出操作,看上去就像对 普通文件的输入输出一样,所以Linux 对串口的操作,也是 通过设备文件访问的。为了访问串口,只需要打开相应的设 备文件即可。 默认地,在Linux 下,串行口COM1 和COM2对应的设备分 别为/dev/ttyS0 和/dev/ttyS1。
ECHO ECHOE ECHOK ECHONL ECHOPRT TOSTOP
11
串行端口程序设计
c_cc[NCCS] 控制字符,用于保存终端驱动程序中的特殊字符,如输入结束符等。 c_cc中定义了如表6.7所示的控制字符。
宏 VINTR 说 明 宏 VEOL 说 明 Interrupt字符 附加的End-of-file字符
10
串行端口程序设计
c_lflag 本地模式标志,控制终端编辑功能,具体参数如下表所示。
键 ISIG ICANON XCASE 值 说 明 当输入INTR、QUIT、SUSP或DSUSP时,产生相应的信号 使用标准输入模式 在ICANON和XCASE同时设置的情况下,终端只使用大写。如果只设置 了XCASE,则输入字符将被转换为小写字符,除非字符使用了转义字符 (非POSIX,且Linux不支持该参数) 显示输入字符 如果ICANON同时设置,ERASE将删除输入的字符,WERASE将删除输 入的单词 如果ICANON同时设置,KILL将删除当前行 如果ICANON同时设置,即使ECHO没有设置依然显示换行符 如果ECHO和ICANON同时设置,将删除打印出的字符(非POSIX) 向后台输出发送SIGTTOU信号
串行端口程序设计
c_iflag 输入模式标志,控制终端输入方式,具体参数如下表所示。
键 值 说 明 IGNBRK BRKINT IGNPAR PARMRK INPCK ISTRIP INLCR IGNCR ICRNL IUCLC IXON IXANY IXOFF IMAXBEL 忽略BREAK键输入 如果设置了IGNBRK,BREAK键的输入将被忽略,如果设置了BRKINT ,将 产生SIGINT中断 忽略奇偶校验错误 标识奇偶校验错误 允许输入奇偶校验 去除字符的第8个比特 将输入的NL(换行)转换成CR(回车) 忽略输入的回车 将输入的回车转化成换行(如果IGNCR未设置的情况下) 将输入的大写字符转换成小写字符(非POSIX) 允许输入时对XON/XOFF流进行控制 输入任何字符将重启停止的输出 允许输入时对XON/XOFF流进行控制 当输入队列满的时候开始响铃,Linux在使用该参数而是认为该参数总是已经 设置
17/30
设置串口
最基本的设置串口包括波特率设置,效验位和停止位设置。 串口的设置主要是设置 struct termios结构体的各成员值。
18/30
设置串口
例子: struct termios newtio,newstdtio; newtio.c_cflag = CLOCAL | CREAD; /*ctrol flag*/ newtio.c_cc[VMIN]=1; newtio.c_cc[VTIME]=0;
串行端口程序设计
实验步骤 3.下载调试
切换到minicom 终端窗口,使用NFS mount 开发主机的/arm2410s 到 /host 目录:mount –t nfs –o nolock 192.168.1.234:/arm2410s /host 开发板中串口设备位于/dev/tts/下,没有ttyS0这个设备,所以需要建立一 个连接,方法如下: cd /dev ln –sf /dev/tts/o ttys0 进入exp\basic\03_tty 目录,运行term,观察运行结果的正确性。
BSDLY
VTDLY FFDLY
空格输出延迟,可以取BS0或BS1
垂直制表符输出延迟,可以取VT0或VT1 换页延迟,可以取FF0或FF1
9
串行端口程序设计
c_cflag 控制模式标志,指定终端硬件控制信息,具体参数如下表所示。
键 值 说 明 CBAUD CBAUDEX CSIZE CSTOPB CREAD PARENB PARODD HUPCL CLOCAL CRTSCTS 波特率(4+1位)(非POSIX) 附加波特率(1位)(非POSIX) 字符长度,取值范围为CS5、CS6、CS7或CS8 设置两个停止位 使用接收器 使用奇偶校验 对输入使用奇偶校验,对输出使用偶校验 关闭设备时挂起 忽略调制解调器线路状态 使用RTS/CTS流控制
Fra Baidu bibliotek
打开串口
1、打开串口是通过使用标准的文件打开函数操作: int fd; /*以读写方式打开串口*/ fd = open( "/dev/ttyS0", O_RDWR); if (-1 == fd){ /* 不能打开串口一*/ perror(" 提示错误!"); }
14/30
打开串口
#include <fcntl.h> int open(const char *pathname, int oflag) 返回值:成功则返回文件描述符,否则返回 -1 对于 open 函数来说,第三个参数(...)仅当创建新文件时 才使用,用于指定文件的访问权限位(access permission bits)。 pathname 是待打开/创建文件的路径名(如 C:/cpp/a.cpp ); oflag 用于指定文件的打开/创建模式,这个参数可由以下常 量(定义于 fcntl.h)通过逻辑或构成。 O_RDONLY 只读模式 O_WRONLY 只写模式 O_RDWR 读写模式