linux串口编程..doc
文本预览下载声明
linux 串口编程
/u1/52454/showart_507112.html
在嵌入式Linux中,串口是一个字设备,访问具体的串行端口的编程与读/写文件的操作类似,只需打开相应的设备文件即可操作。串口编程特殊在于串口通信时相关参数与属性的设置。嵌入式Linux的串口编程时应注意,若在根文件中没有串口设备文件,应使用mknod命令创建,这这里假设串口设备是/dev/ttyS0,介绍一下串口的编程过程。#mknod /dev/ttyS0 c 4 641、打开串口??? ?? 打开串口设备文件的操作与普通文件的操作类似,都采用标准的I/O操作函数open()。?????? fd = open(/dev/ttyS0,O_RDWR|O_NDELAY|O_NOCTTY);??? open()函数有两个参数,第一个参数是要打开的文件名(此处为串口设备文件/dev/ttyS0);第二个参数设置打开的方式,O_RDWR表示打开的文件可读/写,O_NDELAY表示以非阻塞方式打开,O_NOCTTY表示若打开的文件为终端设备,则不会将终端作为进程控制终端。2、设置串口属性???? 串口通信时的属性设置是串口编程的关键问题,许多串口通信时的错误都与串口的设置相关,所以编程时应特别注意这些设置,最常见的设置包括波特率、奇偶校验和停止位以及流控制等。??? 在Linux中,串口被作为终端I/O,它的参数设置需要使用struct termios结构体,这个结构体在termio.h文件中定义,且应在程序中包含这个头文件。??? ?? ?? typedef unsigned char?? ?? ?? cc_t ;??? ?? ?? typedef unsigned int?? ?? ?? ?? speed_t ;??? ?? ?? typedef unsigned int?? ?? ?? ?? tcflag_t ;??? ?? ?? struct termios??? ?? ?? {??? ?? ?? ?? tcflag_t?? ?? c_iflag ;?? ?? ??? /*输入模式标志*/ ??? ?? ?? ?? tcflag_t?? ?? c_oflag ;?? ?? ?? /*输出模式标志*/??? ?? ?? ?? tcflag_t?? ?? c_cflag ;?? ?? ?? ?? /*控制模式标志*/??? ?? ?? ?? tcflag_t?? ?? c_lflag ;?? ?? ?? ?? /*本地模式标志*/??? ?? ?? ?? tcflag_t?? ?? c_line ;?? ?? ?? ?? /*行规程类型,一般应用程序不使用*/??? ?? ?? ?? cc_t?? ?? ?? c_cc[NCC];?? ?? /*控制字符*/??? ?? ?? ?? speed_t?? ?? c_ispeed ;?? ?? /*输入数据波特率*/??? ?? ?? ?? speed_t?? ?? c_ospeed ;?? ?? /*输出数据波特率*/??? ?? };??? ?? 串口的设置主要是设置这个结构体的各成员值,然后利用该结构体将参数传给硬件驱动程序。在Linux中,串口以串行终端的方式进行处理,因而,可以使用tcgetattr()/tcsetattr()函数获取/设置串口的参数。??? ?? int tcgetattr( int fd, struct termios *termios_p );??? ?? int tcsetattr( int fd, int optional_actions , struct termios *termios_p );??? ?? 这两个参数都有一个批向termios结构体的指针作为参数,用于返回当前终端的属性或设置该终端的属性。参数fd就是用open()函数打开的终端文件句柄,而串口就是用open()打开的串口设备文件句柄。tcsetattr()函数的optional_action参数用于指定新设定的参数起作用的时间,其设定值可以为:??? ?? TCSANOW?? ?? ?? 改变立即生效??? ?? TCSADRAIN?? ?? 在所有的输出都被传输后改变生效,适用于更改影响输出参数的情况。??? ?? TCSAFLUSH ?? 在所有输出都被传输后改变生效,丢弃所有末读入的输入(清空输入缓??? ??? ??? ??? ??? ??? ??? ??? 存)。(1)设置波特率??? ?? 使用cfsetospeed()/cfsetispeed()函数设置波特率,它们分别用于在termios结构体中设置输出和输入的波特率。设置波
显示全部