搜档网
当前位置:搜档网 › Linux--串口操作及设置详解

Linux--串口操作及设置详解

Linux--串口操作及设置详解
Linux--串口操作及设置详解

串口操作需要的头文件

#include /*标准输入输出定义*/

#include /*标准函数库定义*/

#include /*Unix 标准函数定义*/

#include

#include

#include /*文件控制定义*/

#include /*PPSIX 终端控制定义*/

#include /*错误号定义*/

1.打开串口

在前面已经提到linux下的串口访问是以设备文件形式进行的,所以打开串口也即是打开文件的操作。函数原型可以如下所示:

int open(“DE_name”,int open_Status)

参数说明:

(1)DE_name:要打开的设备文件名

比如要打开串口1,即为/dev/ttyS0。

(2)open_Status:文件打开方式,可采用下面的文件打开模式:

O_RDONLY:以只读方式打开文件

O_WRONLY:以只写方式打开文件

O_RDWR:以读写方式打开文件

O_APPEND:写入数据时添加到文件末尾

O_CREATE:如果文件不存在则产生该文件,使用该标志需要设置访问权限位mode_t

O_EXCL:指定该标志,并且指定了O_CREATE标志,如果打开的文件存在则会产生一个错误

O_TRUNC:如果文件存在并且成功以写或者只写方式打开,则清除文件所有内容,使得文件长度变为0 O_NOCTTY:如果打开的是一个终端设备,这个程序不会成为对应这个端口的控制终端,如果没有该标志,任何一个输入,例如键盘中止信号等,都将影响进程。

O_NONBLOCK:该标志与早期使用的O_NDELAY标志作用差不多。程序不关心DCD信号线的状态,如果指定该标志,进程将一直在休眠状态,直到DCD信号线为0。

函数返回值:

成功返回文件描述符,如果失败返回-1

例如:

在 Linux 下串口文件是位于 /dev 下的。串口一为 /dev/ttyS0,串口二为 /dev/ttyS1。打开串口是通过使用标准的文件打开函数操作:

int fd;

/*以读写方式打开串口*/

fd = open( "/dev/ttyS0", O_RDWR);

if (fd==-1)

{

/* 不能打开串口一*/

perror(" 提示错误!");

}

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 */

};

设置这个结构体很复杂,我这里就只说说常见的一些设置:

2.1 波特率设置

波特率的设置定义在,其包含在头文件里。

常用的波特率常数如下:

B0-------à0 B1800-------à1800

B50-----à50 B2400------à2400

B75-----à75 B4800------à4800

B110----à110 B9600------à9600

B134----à134.5 B19200-----à19200

B200----à200 B38400------à38400

B300----à300 B57600------à57600

B600----à600 B76800------à76800

B1200---à1200 B115200-----à115200

假定程序中想要设置通讯的波特率,使用cfsetispeed( )和cfsetospeed( )函数来操作,获取波特率信息是通过cfgetispeed()和cfgetospeed()函数来完成的。

比如可以这样来指定串口通讯的波特率:

#include //头文件定义

........

.......

struct termios opt; /*定义指向termios 结构类型的指针opt*/

/***************以下设置通讯波特率****************/

cfsetispeed(&opt,B9600 ); /*指定输入波特率,9600bps*/

cfsetospeed(&opt,B9600);/*指定输出波特率,9600bps*/

/************************************************/

.........

..........

一般来说,输入、输出的波特率应该是一致的。

下面是另一个修改波特率的代码:

struct termios Opt;

tcgetattr(fd, &Opt);

cfsetispeed(&Opt,B19200); /*设置为19200Bps*/

cfsetospeed(&Opt,B19200);

tcsetattr(fd,TCANOW,&Opt);

设置波特率的例子函数:

/**

*@brief 设置串口通信速率

*@param fd 类型 int 打开串口的文件句柄

*@param speed 类型 int 串口速度

*@return void

*/

int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300,

B38400, B19200, B9600, B4800, B2400, B1200, B300, };

int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400,

19200, 9600, 4800, 2400, 1200, 300, };

void set_speed(int fd, int speed){

int i;

int status;

struct termios Opt;

tcgetattr(fd, &Opt);

for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) {

if (speed == name_arr[i]) {

tcflush(fd, TCIOFLUSH);

cfsetispeed(&Opt, speed_arr[i]);

cfsetospeed(&Opt, speed_arr[i]);

status = tcsetattr(fd1, TCSANOW, &Opt);

if (status != 0) {

perror("tcsetattr fd1");

return;

}

tcflush(fd,TCIOFLUSH);

}

}

}

//tcsetattr

tcsetattr函数用于设置终端参数。函数在成功的时候返回0,失败的时候返回-1,并设置errno的值。参数fd为打开的终端文件描述符,参数optional_actions用于控制修改起作用的时间,而结构体termios_p中保存了要修改的参数。optional_actions可以取如下的值。

TCSANOW:不等数据传输完毕就立即改变属性。

TCSADRAIN:等待所有数据传输结束才改变属性。

TCSAFLUSH:清空输入输出缓冲区才改变属性。

错误信息:

EBADF:非法的文件描述符。

EINTR:tcsetattr函数调用被信号中断。

EINVAL:参数optional_actions使用了非法值,或参数termios中使用了非法值。

ENCTTY:非终端的文件描述符。

2.2 设置效验的函数:

/**

*@brief 设置串口数据位,停止位和效验位

*@param fd 类型 int 打开的串口文件句柄

*@param databits 类型 int 数据位取值为 7 或者8

*@param stopbits 类型 int 停止位取值为 1 或者2

*@param parity 类型 int 效验类型取值为N,E,O,,S

*/

int set_Parity(int fd,int databits,int stopbits,int parity)

{

struct termios options;

if ( tcgetattr( fd,&options) != 0) {

perror("SetupSerial 1");

return(FALSE);

}

options.c_cflag &= ~CSIZE;

switch (databits) /*设置数据位数*/

{

case 7:

options.c_cflag |= CS7;

break;

case 8:

options.c_cflag |= CS8;

break;

default:

fprintf(stderr,"Unsupported data sizen"); return (FALSE);

}

switch (parity)

{

case 'n':

case 'N':

options.c_cflag &= ~PARENB; /* Clear parity enable */ options.c_iflag &= ~INPCK; /* Enable parity checking */ break;

case 'o':

case 'O':

options.c_cflag |= (PARODD | PARENB); /* 设置为奇效验*/ options.c_iflag |= INPCK; /* Disnable parity checking */ break;

case 'e':

case 'E':

options.c_cflag |= PARENB; /* Enable parity */

options.c_cflag &= ~PARODD; /* 转换为偶效验*/

options.c_iflag |= INPCK; /* Disnable parity checking */ break;

case 'S':

case 's': /*as no parity*/

options.c_cflag &= ~PARENB;

options.c_cflag &= ~CSTOPB;break;

default:

fprintf(stderr,"Unsupported parityn");

return (FALSE);

}

2.3 设置停止位

switch (stopbits)

{

case 1:

options.c_cflag &= ~CSTOPB;

break;

case 2:

options.c_cflag |= CSTOPB;

break;

default:

fprintf(stderr,"Unsupported stop bitsn");

return (FALSE);

}

/* Set input parity option */

if (parity != 'n')

options.c_iflag |= INPCK;

tcflush(fd,TCIFLUSH);

options.c_cc[VTIME] = 150; /* 设置超时15 seconds*/ options.c_cc[VMIN] = 0; /* Update the options and do it NOW */ if (tcsetattr(fd,TCSANOW,&options) != 0)

{

perror("SetupSerial 3");

return (FALSE);

}

return (TRUE);

}

在上述代码中,有两句话特别重要:

options.c_cc[VTIME] = 0; /* 设置超时0 seconds*/

options.c_cc[VMIN] = 13; /* define the minimum bytes data to be readed*/

这两句话决定了对串口读取的函数read()的一些功能。我将着重介绍一下他们对read()函数的影响。

对串口操作的结构体是

Struct{

tcflag_t c_iflag; /*输入模式标记*/

tcflag_t c_oflag; /*输出模式标记*/

tcflag_t c_cflag; /*控制模式标记*/

tcflag_t c_lflag; /*本地模式标记*/

cc_t c_line; /*线路规程*/

cc_t c_cc[NCCS]; /*控制符号*/

};

其中cc_t, c_line只有在一些特殊的系统程序(比如,设置通过tty设备来通信的网络协议)中才会用。在数组c_cc中有两个下标(VTIME和VMIN)对应的元素不是控制符,并且只是在原始模式下有效。只有在原始模式下,他们决定了read()函数在什么时候返回。在标准模式下,除非设置了O_NONBLOCK选项,否则只有当遇到文件结束符或各行的字符都已经编辑完毕后才返回。

控制符VTIME和VMIN之间有着复杂的关系。VTIME定义要求等待的零到几百毫秒的时间量(通常是一个8位的unsigned char变量,取值不能大于cc_t)。 VMIN定义了要求等待的最小字节数(不是要求读的字节数——read()的第三个参数才是指定要求读的最大字节数),这个字节数可能是0。

l) 如果VTIME取0,VMIN定义了要求等待读取的最小字节数。函数read()只有在读取了VMIN个字节的数据或者收到一个信号的时候才返回。

2) 如果VMIN取0,VTIME定义了即使没有数据可以读取,read()函数返回前也要等待几百毫秒的时间量。这时,read()函数不需要像其通常情况那样要遇到一个文件结束标志才返回0。

3) 如果VTIME和VMIN都不取0,VTIME定义的是当接收到第一个字节的数据后开始计算等待的时间量。如果当调用read函数时可以得到数据,计时器马上开始计时。如果当调用read函数时还没有任何数据可读,则等接收到第一个字节的数据后,计时器开始计时。函数read可能会在读取到VMIN个字节的数据后返回,也可能在计时完毕后返回,这主要取决于哪个条件首先实现。不过函数至少会读取到一个字节的数据,因为计时器是在读取到第一个数据时开始计时的。

4) 如果VTIME和VMIN都取0,即使读取不到任何数据,函数read也会立即返回。同时,返回值0表示read函数不需要等待文件结束标志就返回了。

这就是这两个变量对read函数的影响。

2.4 串口属性配置

在程序中,很容易配置串口的属性,这些属性定义在结构体struct termios中。为在程序中使用该结构体,需要包含文件,该头文件定义了结构体struct termios。该结构体定义如下:

#define NCCS 19

struct termios {

tcflag_t c_iflag; /* 输入参数 */

tcflag_t c_oflag; /* 输出参数 */

tcflag_t c_cflag; /* 控制参数*/

tcflag_t c_ispeed; /* 输入波特率 */

tcflag_t c_ospeed; /* 输出波特率 */

cc_t c_line; /* 线控制 */

cc_t c_cc[NCCS]; /* 控制字符*/

};

其中成员c_line在POSIX(Portable Operating System Interface for UNIX)系统中不使用。对于支持POSIX 终端接口的系统中,对于端口属性的设置和获取要用到两个重要的函数是:

(1).int tcsetattr(int fd,int opt_DE,*ptr)

该函数用来设置终端控制属性,其参数说明如下:

fd:待操作的文件描述符

opt_DE:选项值,有三个选项以供选择:

TCSANOW:不等数据传输完毕就立即改变属性

TCSADRAIN:等待所有数据传输结束才改变属性

TCSAFLUSH:清空输入输出缓冲区才改变属性

*ptr:指向termios结构的指针

函数返回值:成功返回0,失败返回-1。

(2).int tcgetattr(int fd,*ptr)

该函数用来获取终端控制属性,它把串口的默认设置赋给了termios数据数据结构,其参数说明如下:fd:待操作的文件描述符

*ptr:指向termios结构的指针

函数返回值:成功返回0,失败返回-1。

2.5 注意的问题:

如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode)方式来通讯,设置方式如下:

options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); /*Input*/

options.c_oflag &= ~OPOST; /*Output*/

3.读写串口

3.1 串口读操作(接收端)

用open函数打开设备文件,函数返回一个文件描述符(file descriptors,fd),通过文件描述符来访问文件。读串口操作是通过read函数来完成的。函数原型如下:

int read(int fd, *buffer,length);

参数说明:

(1).int fd:文件描述符

(2).*buffer:数据缓冲区

(3).length:要读取的字节数

函数返回值:

读操作成功读取返回读取的字节数,失败则返回-1。

3.2 串口写操作(发送端)

写串口操作是通过write函数来完成的。函数原型如下:

write(int fd, *buffer,length);

参数说明:

(1).fd:文件描述符

(2).*buffer:存储写入数据的数据缓冲区

(3).length:写入缓冲去的数据字节数

函数返回值:

成功返回写入数据的字节数,该值通常等于length,如果写入失败返回-1。

例如:向终端设备发送初始化命令

设置好串口之后,读写串口就很容易了,把串口当作文件读写就是。

·发送数据

char buffer[1024];

int Length;int nByte;

nByte = write(fd, buffer ,Length)

4.关闭串口

关闭串口就是关闭文件。

close(fd);

5.例子

下面是一个简单的读取串口数据的例子,使用了上面定义的一些函数和头文件

/**********************************************************************

代码说明:使用串口二测试的,发送的数据是字符,

但是没有发送字符串结束符号,所以接收到后,后面加上了结束符号。

我测试使用的是单片机发送数据到第二个串口,测试通过。

**********************************************************************/

#define FALSE -1

#define TRUE 0

/*********************************************************************/ int OpenDev(char *Dev)

{

int fd = open( Dev, O_RDWR );

//| O_NOCTTY | O_NDELAY

if (-1 == fd)

{

perror("Can't Open Serial Port");

return -1;

}

else

return fd;

}

int main(int argc, char **argv){

int fd;

int nread;

char buff[512];

char *dev = "/dev/ttyS1"; //串口二

fd = OpenDev(dev);

set_speed(fd,19200);

if (set_Parity(fd,8,1,'N') == FALSE) {

printf("Set Parity Errorn");

exit (0);

}

while (1) //循环读取数据

{

while((nread = read(fd, buff, 512))>0)

{

printf("nLen %dn",nread);

buff[nread+1] = '';

printf( "n%s", buff);

}

}

//close(fd); // exit (0); }

linux串口编程参数配置详解

linux串口编程参数配置详解 1.linux串口编程需要的头文件 #include //标准输入输出定义 #include //标准函数库定义 #include //Unix标准函数定义 #include #include #include //文件控制定义 #include //POSIX中断控制定义 #include //错误号定义 2.打开串口 串口位于/dev中,可作为标准文件的形式打开,其中: 串口1 /dev/ttyS0 串口2 /dev/ttyS1 代码如下: int fd; fd = open(“/dev/ttyS0”, O_RDWR); if(fd == -1) { Perror(“串口1打开失败!”); } //else //fcntl(fd, F_SETFL, FNDELAY); 除了使用O_RDWR标志之外,通常还会使用O_NOCTTY和O_NDELAY这两个标志。 O_NOCTTY:告诉Unix这个程序不想成为“控制终端”控制的程序,不说明这

个标志的话,任何输入都会影响你的程序。 O_NDELAY:告诉Unix这个程序不关心DCD信号线状态,即其他端口是否运行,不说明这个标志的话,该程序就会在DCD信号线为低电平时停止。 3.设置波特率 最基本的串口设置包括波特率、校验位和停止位设置,且串口设置主要使用termios.h头文件中定义的termios结构,如下: struct termios { tcflag_t c_iflag; //输入模式标志 tcflag_t c_oflag; //输出模式标志 tcflag_t c_cflag; //控制模式标志 tcflag_t c_lflag; //本地模式标志 cc_t c_line; //line discipline cc_t c_cc[NCC]; //control characters } 代码如下: int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B384 00, B19200, B9600, B4800, B2400, B1200, B300, }; int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9 600, 4800, 2400, 1200, 300, }; void SetSpeed(int fd, int speed) { int i; struct termios Opt; //定义termios结构 if(tcgetattr(fd, &Opt) != 0) { perror(“tcgetattr fd”); return; }

Linux 下串口编程入门

Linux 下串口编程入门 级别: 初级 左锦 (zuo170@https://www.sodocs.net/doc/4211832427.html, ), 副总裁, 南沙资讯科技园 2003 年 7 月 03 日 Linux 操作系统从一开始就对串行口提供了很好的支持,本文就 Linux 下的串行口通讯编 程进行简单的介绍。 串口简介 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是 RS 称 EIA RS-232-C )它是在 1970 年由美国电子工业协会(EIA )联合贝尔系统、 调制解调器厂家及厂家共同制定的用于串行通讯的标准。它的全名是"数据终端设备(DTE )和数据通讯设备(DCE )之据交换接口技术标准"该标准规定采用一个 25 个脚的 DB25 连接器,对连接器的每个引脚的信号对各种信号的电平加以规定。传输距离在码元畸变小于 4% 的情况下,传输电缆长度应为 50 英尺Linux 操作系统从一开始就对串行口提供了很好的支持,本文就 Linux 下的串行口通讯编程进行要非常深入了解,建议看看本文所参考的 《Serial Programming Guide for POSIX Operating S 计算机串口的引脚说明 串口操作 串口操作需要的头文件文档选

打开串口 在 Linux 下串口文件是位于 /dev 下的 串口一为 /dev/ttyS0 串口二为 /dev/ttyS1 打开串口是通过使用标准的文件打开函数操作: int fd; /*以读写方式打开串口*/ fd = open( "/dev/ttyS0", O_RDWR); if (-1 == fd){ /* 不能打开串口一*/ perror(" 提示错误!"); } 设置串口 最基本的设置串口包括波特率设置,效验位和停止位设置。

Linux下串口通信编程

Linux下串口通信编程 一、什么是串口通信? 串口通信是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0。 二、串口通信的分类 串口通信可以分为同步通信和异步通信两类。同步通信是按照软件识别同步字符来实现数据的发送和接收,异步通信是一种利用字符的再同步技术的通信方式。 2.1 同步通信 同步通信是一种连续串行传送数据的通信方式,一次通信只传送一帧信息。这里的信息帧与异步通信中的字符帧不同,通常含有若干个数据字符。 它们均由同步字符、数据字符和校验字符(CRC)组成。其中同步字符位于帧开头,用于确认数据字符的开始。数据字符在同步字符之后,个数没有限制,由所需传输的数据块长度来决定;校验字符有1到2个,用于接收端对接收到的字符序列进行正确性的校验。 同步通信的缺点是要求发送时钟和接收时钟保持严格的同步。 2.2 异步通信 异步通信中,数据通常以字符或者字节为单位组成字符帧传送。字符帧由发送端逐帧发送,通过传输线被接收设备逐帧接收。发送端和接收端可以由各自的时钟来控制数据的发送和接收,这两个时钟源彼此独立,互不同步。 接收端检测到传输线上发送过来的低电平逻辑"0"(即字符帧起始位)时,确定发送端已开始发送数据,每当接收端收到字符帧中的停止位时,就知道一帧字符已经发送完毕。 在异步通行中有两个比较重要的指标:字符帧格式和波特率。 (1)字符帧,由起始位、数据位、奇偶校验位和停止位组成。 1.起始位:位于字符帧开头,占1位,始终为逻辑0电平,用于向接收设备表示发送端开始发送一帧信息。 2.数据位:紧跟在起始位之后,可以设置为5位、6位、7位、8位,低位在前高位在后。 3.奇偶校验位:位于数据位之后,仅占一位,用于表示串行通信中采用奇校验还是偶校验。 (2)波特率,波特率是每秒钟传送二进制数码的位数,单位是b/s。 异步通信的优点是不需要传送同步脉冲,字符帧长度也不受到限制。缺点是字符帧中因为包含了起始位和停止位,因此降低了有效数据的传输速率。 三、什么是RS-232? RS-232-C 接口(又称EIA RS-232-C)它是在1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定采用一个25 个脚的DB25 连接器,对连接器的每个引脚的信号内容加

linux下串口编程简单实例

linux下串口编程简单实例 1、Linux中的串口设备文件存放于/dev目录下,其中串口一,串口二对应设备名依次为“/dev/ttyS0”、“/dev/ttyS1”。在linux下操作串口与操作文件相同。 2、在使用串口之前必须设置相关配置,包括:波特率、数据位、校验位、停止位等。串口设置由下面结构体实现: struct termios{ tcflag_t c_iflag; /*input flags*/ tcflag_t c_oflag; /*output flags*/ tcflag_t c_cflag; /*control flags*/ tcflag_t c_lflag; /*local flags*/ cc_t c_cc[NCCS]; /*control characters*/ }; 该结构中c_cflag最为重要,可设置波特率、数据位、校验位、停止位。在设置波特率时需在数字前加上‘B’,如B9600、B19200。使用其需通过“与”“或”操作方式。 常用的串口控制函数: Tcgetattr 取属性(termios结构) Tcsetattr 设置属性(termios结构) cfgetispeed 得到输入速度 Cfgetospeed 得到输出速度 Cfsetispeed 设置输入速度 Cfsetospeed 设置输出速度 tcflush 刷清未决输入和/或输出 3、串口的配置 (1) 保存原先串口配置使用tcgetattr(fd,&oldtio)函数: struct termios newtio,oldtio; tcgetattr(fd,&oldtio); (2) 激活选项有CLOCAL和CREAD,用于本地连接和接收使能。 newtio.c_cflag | = CLOCAL | CREAD; (3) 设置波特率,使用函数cfsetispeed、cfsetospeed cfsetispeed(&newtio, B115200); cfsetospeed(&newtio, B115200); (4) 设置数据位,需使用掩码设置。 newtio.c_cflag &= ~CSIZE; newtio.c_cflag |= CS8; (5) 设置奇偶校验位,使用c_cflag和c_iflag。 设置奇校验: newtio.c_cflag |= PARENB; newtio.c_cflag |= PARODD; newtio.c_iflag |= (INPCK | ISTRIP); 设置偶校验: newtio.c_iflag |= (INPCK | ISTRIP); newtio.c_cflag |= PARENB; newtio.c_cflag &= ~PARODD;

Linux串口(serial、uart)驱动程序设计

Linux串口(serial、uart)驱动程序设计 https://www.sodocs.net/doc/4211832427.html,/space.php?uid=23089249&do=blog&id=34481 一、核心数据结构 串口驱动有3个核心数据结构,它们都定义在<#include linux/serial_core.h> 1、uart_driver uart_driver包含了串口设备名、串口驱动名、主次设备号、串口控制台(可选)等信息,还封装了tty_driver(底层串口驱动无需关心tty_driver)。 struct uart_driver { struct module *owner;/* 拥有该uart_driver的模块,一般为THIS_MODULE */ const char*driver_name;/* 串口驱动名,串口设备文件名以驱动名为基础 */ const char*dev_name;/* 串口设备名*/ int major;/* 主设备号*/ int minor;/* 次设备号*/ int nr;/* 该uart_driver支持的串口个数(最大) */ struct console *cons;/* 其对应的console.若该uart_driver支持serial console, 否则为NULL */ /* * these are private; the low level driver should not * touch these; they should be initialised to NULL */ struct uart_state *state; struct tty_driver *tty_driver; }; 2、uart_port uart_port用于描述串口端口的I/O端口或I/O内存地址、FIFO大小、端口类型、串口时钟等信息。实际上,一个uart_port实例对应一个串口设备

linux UART串口驱动开发文档

linux UART串口驱动开发文档 w83697/w83977 super I/O串口驱动开发 内容简介: 介绍了Linux下的串口驱动的设计层次及接口, 并指出串口与TTY终端之间的关联层次(串口可作TTY终端使用), 以及Linux下的中断处理机制/中断共享机制, 还有串口缓冲机制当中涉及的软中断机制; 其中有关w83697/w83977 IC方面的知识, 具体参考相关手册, 对串口的配置寄存器有详细介绍, 本文不再进行说明. 目录索引: 一. Linux的串口接口及层次. 二. Linux的中断机制及中断共享机制. 三. Linux的软中断机制. 四. TTY与串口的具体关联. 一. Linux的串口接口及层次. 串口是使用已经非常广的设备了, 因此在linux下面的支持已经很完善了, 具有统一的编程接口, 驱动开发者所要完整的工作就是针对不同的串口IC来做完成相应的配置宏, 这此配置宏包括读与写, 中断打开与关闭(如传送与接收中断), 接收状态处理, 有FIFO时还要处理FIFO的状态. 如下我们就首先切入这一部分, 具体了解一下与硬件串口IC相关的部分在驱动中的处理, 这一部分可以说是串口驱动中的最基础部分, 直接与硬件打交道, 完成最底层具体的串口数据传输. 1. 串口硬件资源的处理. W83697及W83977在ep93xx板子上的映射的硬件物理空间如下: W83697: 0x20000000起1K空间. W83977: 0x30000000起1K空间. 因为串口设备的特殊性, 可以当作终端使用, 但是终端的使用在内核还未完全初始化之前(关于串口与终端的关联及层次在第四节中详细), 此时还没有通过mem_init()建立内核的虚存管理机制, 所以不能通过ioreamp来进行物理内存到虚存的映射(物理内存必须由内核映射成系统管理的虚拟内存后才能进行读写访问), 这与先前所讲的framebuffer的物理内存映射是不同的, 具体原因如下: √终端在注册并使用的调用路径如下: start_kernel→console_init→uart_console_init→ep93xxuart_console_init→register_conso

Linux下的串口编程

Linux下的串口编程(二) 分类:Linux S3C24402012-03-21 15:52 5557人阅读评论(1) 收藏举报linux编程终端terminalstruct测试 Linxu下的串口编程(二) /************声明:本人只是见到这篇文章对我帮助很大才转载的,但是这个完整的程序里面本来有语法错误的,现在让我改过来了************/ --------------------------------------------------------- Author :tiger-john WebSite :https://www.sodocs.net/doc/4211832427.html,/tigerjb Email :jibo.tiger@https://www.sodocs.net/doc/4211832427.html, Update-Time : 2011年2月14日星期一 Tiger声明:本人鄙视直接复制本人文章而不加出处的个人或团体,但不排斥别人转载tiger-john的文章,只是请您注明出处并和本人联系或留言给我。3Q --------------------------------------------------------- 前面已经提到过Linux下皆为文件,这当然也包括我们今天的主角àUART0串口。因此对他的一切操作都和文件的操作一样(涉及到了open,read,write,close等文件的基本操作)。 一.Linux下的串口编程又那几部分组成

1. 打开串口 2. 串口初始化 3. 读串口或写串口 4. 关闭串口 二.串口的打开 既然串口在linux中被看作了文件,那么在对文件进行操作前先要对其进行打开操作。 1.在Linxu中,串口设备是通过串口终端设备文件来访问的,即通过访问/dev/ttyS0,/dev/ttyS1,/dev/ttyS2这些设备文件实现对串口的访问。

linux串口测试程序

linux串口测试程序 由于已经完成了第一个HELLO程序,标志着整个编译环境已经没有问题了,下来准备做一下串口测试程序。由于串口驱动开发板已经作好了,所以就作一个Linux串口测试工具简单的数据收发看看。 Linux串口测试工具网上常见的版本都看起来比较烦琐,下面是一个简单一点的,这个程序功能是收到10个字节后会发前7个字节,如果所发的数据的第一个字节是9则退出。 #include #include #include #include #include #include #include #include #define BAUDRATE B9600 #define MODEMDEVICE "/dev/ttyUSB1" int main() { int fd,c=0,res;struct termios oldtio,newtio;//intch;static char s1[10],buf[10];printf("start ……\n");/*打开PC的COM1口*/ fd = open(MODEMDEVICE,O_RDWR|O_NOCTTY);if (fd < 0) { perror(MODEMDEVICE);exit(1);} printf("open……\n");/*将旧的通讯参数存入oldtio结构*/ tcgetattr(fd,&oldtio);/*初始化新的newtio */ bzero(&newtio,sizeof(newtio));/*8N1*/ newtio.c_cflag = BAUDRATE|CS8|CLOCAL|CREAD;newtio.c_iflag = IGNPAR;newtio.c_oflag = 0;/*正常模式*/ /*newtio.c_lflag = ICANON;*/ /*非正常模式*/ newtio.c_lflag = 0;newtio.c_cc[VTIME] = 0;newtio.c_cc[VMIN] = 10; tcflush(fd,TCIFLUSH);/*新的temios作为通讯端口参数*/ tcsetattr(fd,TCSANOW,&newtio);printf("writing……\n"); while(1) { //printf("read……\n");res = read(fd,buf,10);//res = read(fd,s1,10);//strcat(buf,s1);// res = write(fd,buf,7);printf("buf = %s\n",buf);if(buf[0]==9) break;} printf("close……\n");close(fd);/*还原旧参数*/ tcsetattr(fd,TCSANOW,&oldtio);return 0;} 还有一点要注意,就是Linux串口测试工具串口有两种工作模式,即正规模式和非正规模式,如果习惯在串口调试器中用16进制发送,此时串口应该为非正规模式才行。 下面是这两种模式的说明Linux串口测试工具正规模式(CANONICAL或者COOKED) 此模式下,终端设备会处理特殊字符,并且数据传输是一次一行的方式,既按回车后才开始发送和接收数据。例如LINUX的SHELL. Linux串口测试工具非正规模式(NON-CANONICAL

linux 串口输出

1.修改/etc/inittab文件 tty:2345:respawn:/sbin/agetty -L ttyS0 9600 vt100 “tty”为该行ID;“2345”指该行的运行级别是2、3、4、5级;“respawn”使命令退出后再执行一次,以便其它用户能够登录;“/sbin/getty ttyS0 9600 vt100”表示具体 的命令,该命令通过/sbin/getty程序打开串口/dev/ttyS0(COM1),波特率设置为9600bps,终端模式为vt100。 2.修改/etc/securetty文件 该文件是一个被允许以root身份登录的tty设备列表,这些设备由/bin/login程序读取。为了使用户能以root身份通过串口登录,需要在该文件中添加“ttyS0”,告诉系统COM1 是安全的。 3.修改/etc/lilo.conf文件 本文假设系统使用LILO启动。为了使LILO和内核的启动信息能够输出到串口,必须修改/etc/lilo.conf文件,在“linear”一行后添加“serial=0,9600n8”,将 “append="root=LABEL=/"”改为“append="root=LABEL=/ console=ttyS0,9600"”。 serial选项使LILO的启动信息输出到串口,以便选择不同的系统或内核进行启动。其中,“0”表示串口使用COM1;“9600”表示波特率为9600bps;“n”表示无校验位;“8”表 示有8位数据位。 “append="root=LABEL=/ console=ttyS0,9600"”的作用是向内核传递参数,使系统启动信息输出到串口COM1,波特率设为9600bps。修改完成后,重新运行一下LILO命令使配置生 效。 修改grub.conf 完整conf default=0 timeout=10 password --md5 $1$wwmIq64O$2vofKBDL9vZKeJyaKwIeT. serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1 terminal --timeout=10 serial console title Red Hat Linux (2.4.9-21) root (hd0,0) kernel /vmlinuz-2.4.9-21 ro root=/dev/hda6 console=tty0 console=ttyS0,9600n8 initrd /initrd-2.4.9-21.img title Red Hat Linux (2.4.9-21) single user mode lock root (hd0,0) kernel /vmlinuz-2.4.9-21 ro root=/dev/hda6console=tty0 console=ttyS0,9600n8

基于linux的嵌入式串口通信

天津电子信息职业技术学院 嵌入式软件编程》课程报告 课程名称:基于linux 的嵌入式串口通信 课程代码:115229 姓名:甘琦 学号:48 专业:物联网应用技术 班级:物联S14-1 完成时间:2016 年10 月28 日

目录 摘要 (1) 前言 (2) 一、嵌入式串口通信概述 (2) 1.1嵌入式串口通信的原理 (2) 1.2嵌入式串口通信的开发工具 (2) 1.2.1 ............................................................. CC2530 功耗 2 1.2.2........................................................... ARM 简介 3 1.2.3................................................................ L inux 系统简介 3 1.3嵌入式串口通信的基本任务 (4) 1.4嵌入式串口通信协议及实现 (4) 二、RS-232C 标准 (5) 2.1引脚定义 (5) 2.2字符(帧)格式 (6) 2.3握手协议 (8) 2.4双机互连方式 (9) 2.4.1无硬件握手情况 (9) 2.4.2 .................................................................. DTR 和DSR握手情况9 三、嵌入式串口驱动程序设计 (10) 3.1嵌入式串口操作需要的头文件 (10) 3.2打开串口 (10) 3.3串口设置 (11) 3.4串口读写 (13) 3.5关闭串口 (14) 四、源程流程图 (15) 五、源程序代码 (15) 总结 (19)

Linux串口打印设置

一、基于VM虚拟机linux系统串口配置 配置分为虚拟机下配置及linux系统下minicom配置两部分。 虚拟机模块配置如下: 打开虚拟机配置界面。 选择Edit virtual machine settings。进入配置界面。

选择Add…按钮,添加相关的设备文件。

选中串口选项后继续选择下一步。

此处选择”使用主机上的物理串口设备”选项,继续下一步。此处我们选择文件。 对于物理串口选项,此处可以采用自动检测选项。如果下来菜单中有对应于串口的端口号,则可以选择。注意,对于设备状态,要确保选中“connect at power on“,即,上电连接状态。至此,虚拟机端串口配置完毕。 注意:此处我们串口添加成功后默认未COM2.

Linux下串口配置及使用。 Linux下一般使用minicom来作为串口数据输入输出的终端。类似于Windows下的超级终端。虚拟机下配置完毕后,进入Linux系统中,在Shell 终端下输入minicom -s即可配置串口终端。配置完成后执行minicom启动串口终端。 在终端界面下完成相关的参数配置并保存后,启动终端设备,即可在minicom中观察到数据输出。 <四>Minicom的使用 (1)minicom界面介绍 第一次运行minicom,启动minicom要以root权限登录系统,需要进行minicom的设置,输入下了命令#minicom –s,显示的屏幕如下所示,按

上下光标键进行上下移动选择,我们要对串行端口进行设置,因此选中 Serial port setup,然后回车: __[configuration]─-─—┐//配置 │ Filenames and paths │//文件名和路径 │ File transfer protocols│//文件传输协议 │ Serial port setup │//串行端口设置 │ Modem and dialing │//调制解调器和拨号 │ Screen and keyboard │//屏幕和键盘 │ Save setup as dfl │//设置保存到 │ Save setup as.. │//储存设定为 │ Exit │//退出 │ Exit from Minicom │//退出minicom └──────────┘ (2)minicom的参数设置 选中设置串行端口,点击回车后,弹出设置的界面如下: 点击”A”设置串行设置为/dev/ttyS1,这表示使用串口2(com2),如果是 /dev/ttyS1则表示使用串口2(com 2).按”E”键进入设置”bps/par/Bits”(波 特率)界面,如下图所示。再按”I”以设置波特率为115200,点”F”键硬 件流控制设置为NO,回车 最终的设置结果如下,然后回车返回到串口设置主菜单中 │A-Serial Device(串口设备): /dev/ttyS1 │B-Lockfile Location(锁文件位置): /var/lock │C-Callin Program(调入程序): │D-Callout Program(调出程序): │E-Bps/Par/Bits(): 115200 8N1 │F-Hardware Flow Control(硬件数据流控制): No │G-Software Flow Control(软件数据流控制): No 二、Linux 标准输入输出重定向到串口指南 设置linux 系统的标准输入输出到com2(console 口),以便维护人员 在无网络、无显示器的情况下对系统维护。在各文件(/etc/grub.conf、 /etc/inittab、/etc/securetty)中添加红色部分!文件修改完成后 reboot 系统即可在com2 口看到标准输入输出信息。

Linux--串口操作及设置详解

串口操作需要的头文件 #include /*标准输入输出定义*/ #include /*标准函数库定义*/ #include /*Unix 标准函数定义*/ #include #include #include /*文件控制定义*/ #include /*PPSIX 终端控制定义*/ #include /*错误号定义*/ 1.打开串口 在前面已经提到linux下的串口访问是以设备文件形式进行的,所以打开串口也即是打开文件的操作。函数原型可以如下所示: int open(“DE_name”,int open_Status) 参数说明: (1)DE_name:要打开的设备文件名 比如要打开串口1,即为/dev/ttyS0。 (2)open_Status:文件打开方式,可采用下面的文件打开模式: O_RDONLY:以只读方式打开文件 O_WRONLY:以只写方式打开文件 O_RDWR:以读写方式打开文件 O_APPEND:写入数据时添加到文件末尾 O_CREATE:如果文件不存在则产生该文件,使用该标志需要设置访问权限位mode_t O_EXCL:指定该标志,并且指定了O_CREATE标志,如果打开的文件存在则会产生一个错误 O_TRUNC:如果文件存在并且成功以写或者只写方式打开,则清除文件所有内容,使得文件长度变为0 O_NOCTTY:如果打开的是一个终端设备,这个程序不会成为对应这个端口的控制终端,如果没有该标志,任何一个输入,例如键盘中止信号等,都将影响进程。 O_NONBLOCK:该标志与早期使用的O_NDELAY标志作用差不多。程序不关心DCD信号线的状态,如果指定该标志,进程将一直在休眠状态,直到DCD信号线为0。 函数返回值: 成功返回文件描述符,如果失败返回-1 例如:

Linux下 QT串口与51单片机通信实例

QT串口与51单片机通信

通过这个小例子主要想说明QT怎样进行线程编程的思想,实例如图,好吧,下面是过程 上一个例子我们采用的是手工编写代码的方法,这个例子我们来玩一下designer,其实Qt4己经把界面与功能分开了,用designer来进行界面 设计,再手工编写一些功能,如信号与槽,这样开发效率会大大提高,呵呵,开一个终端,输入/usr/local/Trolltech/Qt-4.5.1/bin/designer ,如果第一次打开出现字体不对,可以打开qtconfig进行一些相关配置,打开后我们新建一个Main Window,在右边的属性框中设置一下界面大小, 1.我ARM板的LCD大小为320x240,所以我也设为320x240; 2.左边是一些我们常用的窗口部件,这里我们用到一个lable标签来做显示,再放几个pushButton按钮,在属性objectName重新更改它的名字,改为我们记得的,这样在写功能时记得哪个按钮叫什么名字,对于一个初学QT的人来说,很想知道每一个部件到底有什么信号和槽,别急,我们可以这样来看,选中一个lable,按F4,再点击lable拖动出现接地符号时松开,弹出编辑信号与槽,这时左边列出的是信号,右边为槽,这里我们不用配置连接,等下我们再手工写, 3最后我们用到一个lable标签和三个pushButton按钮,并命名为dis_label、writeButton、readButton、closeButton,然后保存为mainwindow.ui,这样designer就完工了,呵呵..

4.下面我们编写一个线程,用于管理串口收发工作,它不涉及到任何界面,只做好它的本份工作就得了,编写一个thread.h文件gedit thread.h, #ifndef THREAD_H #define THREAD_H #include class Thread:public QThread { Q_OBJECT public: Thread(); char buf[128]; volatile bool stopped; volatile bool write_rs; volatile bool read_rs; protected: virtual void run(); }; #endif 我们定义一个Thread类,它继承于QThread,看到只设有一些变量和一个run函数,virtual表示为虚函数,你也可以去掉,加上去会增加一些内存开销, 但提高了效率,对于这个小程序是看不出什么效果的,volatile这个大家都懂了吧,就是防止偷懒,呵呵, 5.再看看thread.cpp #include"thread.h" #include #include #include #include //串口用到的 #include #include #include #include #define BAUDRATE B9600 //#define RS_DEVICE "/dev/ttyS0" //串口1 #define RS_DEVICE "/dev/ttySAC1" //串口1 Thread::Thread() {} //析构 void Thread::run() //这就是线程的具体工作了

linux下的tty串口通信

异步通信:以单字符为发送单位,字符间发送能存在间隔 起始位:发送”0”,表示字符传送开始 数据位:可允许4 5 6 7的数据位 停止位:一个字符结束的标志位, 奇偶校验位:根据传送数据内“1”的个数是偶数还是奇数来校验数据是否准确 空闲位:在没有数据发送时,设置“1” Structure termios{ tcflag_t c_iflag; 输入方式 tcflag_t c_oflag; 输出方式 tcflag_t c_cflag; 控制模式标志 tcflag_t c_Iflag; 本地 tcflag_t c_cc[NCCS]; 控制字符,用于保存终端的特殊字符} c_iflag 标志常量:Input mode ( 输入模式) input mode可以在输入值传给程序之前控制其处理的方式。 其中输入值可能是由序列埠或键盘的终端驱动程序所接收到的字元。我们可以利用termios结构的c_iflag的标志来加以控制,其定义的方式皆以OR 来加以组合。 IGNBRK :忽略输入中的 BREAK 状态。(忽略命令行中的中断) BRKINT :(命令行出现中断时,可产生一插断)如果设置了 IGNBRK,将忽略 BREAK。如果没有设置,但是设置了 BRKINT,那么 BREAK 将使得输入和输出队列被刷新,如果终端是一个前台进程组的控制终端,这个进程组中所有进程将收到 SIGINT 信号。如果既未设置 IGNBRK 也未设置 BRKINT,BREAK 将视为与NUL 字符同义,除非设置了 PARMRK,这种情况下它被视为序列 377 � �。 IGNPAR :忽略桢错误和奇偶校验错。 PARMRK :如果没有设置 IGNPAR,在有奇偶校验错或桢错误的字符前插入377 �。如果既没有设置 IGNPAR 也没有设置 PARMRK,将有奇偶校验错或桢错误的字符视为 �。 INPCK :启用输入奇偶检测。 ISTRIP :去掉第八位。 INLCR :将输入中的 NL 翻译为 CR。(将收到的换行符号转换为Return)IGNCR :忽略输入中的回车。 ICRNL :将输入中的回车翻译为新行 (除非设置了 IGNCR)(否则当输入信号有 CR 时不会终止输入)。 IUCLC :(不属于 POSIX) 将输入中的大写字母映射为小写字母。 IXON :启用输出的 XON/XOFF 流控制。 IXANY :(不属于 POSIX.1;XSI) 允许任何字符来重新开始输出。(?) IXOFF :启用输入的 XON/XOFF 流控制。 IMAXBEL:(不属于 POSIX) 当输入队列满时响零。Linux 没有实现这一位,总是将它视为已设置。

Linux_C_C++串口读写串口读写

Linux C/C++串口读写 串口简介 串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。常用的串口是RS-232-C 接口(又称EIA RS-232-C)它是在1970 年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是"数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准"该标准规定采用一个25 个脚的DB25 连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于4% 的情况下,传输电缆长度应为50 英尺。 Linux 操作系统从一开始就对串行口提供了很好的支持 串口操作

打开串口 在Linux 下串口文件是位于/dev 下的 串口一为/dev/ttyS0 串口二为/dev/ttyS1 设置串口 最基本的设置串口包括波特率设置,效验位和停止位设置。

设置这个结构体很复杂,我这里就只说说常见的一些设置: 波特率设置 设置波特率的例子函数: /** *@brief 设置串口通信速率 *@param fd 类型 int 打开串口的文件句柄 *@param speed 类型 int 串口速度 *@return void */ int speed_arr[] = { B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, }; int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, }; void set_speed(int fd, int speed){ int i; int status; struct termios Opt; tcgetattr(fd, &Opt);

linux设备驱动,tty串口编程

linux设备驱动,tty串口编程2011-12-04 08:56:33 分类:LINUX XC2440开发板上已经含有S3C2440的3个串口驱动,我们只要知道各个串口的设备名称就可以了, 204 s3c2410_serial ,204是串口的主设备号。s3c2410_serial是设备名称,在 dev目录下 ls 一下就可以发现 ptyd0 s3c2410_serial0 ttysa ptyd1 s3c2410_serial1 ttysb ptyd2 s3c2410_serial2 ttysc s3c2410_serial0,s3c2410_serial1,s3c2410_serial2 分别是串口1、2、3的设备名称 下面是测试源码,打开串口1、2,程序执行后,串口1的波特率变为9600,这时候你的串口 终端就没有反应了(串口1波特率默认115200),把终端软件串口1 波特率改为9600后, 连接终端,回车一下,然后输入几个‘1’后,画面如上图。 这时用telnet工具登陆开发板,执行ps 查看现有运行的程序,找到tty [root@XC2440 /root]# ps PID USER TIME COMMAND 1 root 0:04 init 2 root 0:00 [kthreadd] 3 root 0:00 [ksoftirqd/0] 5 root 0:00 [kworker/u:0] 6 root 0:00 [khelper] 7 root 0:00 [kworker/u:1] 10 root 0:00 [netns] 236 root 0:00 [sync_supers] 238 root 0:00 [bdi-default] 240 root 0:00 [kblockd] 249 root 0:00 [khubd] 252 root 0:00 [kseriod]

Linux下扩展串口配置方法

编号: 版本号:V1.0 受控状态: 分发号: Linux下扩展串口配置方法 应用注记 编制:日期: 审核:日期: 标审:日期: 质量:日期: 批准:日期: 北京盛博协同科技有限责任公司

版本控制 (C:创建;A:补充;M:修改;D:删除)

目录 1概述 (1) 1.1文档目的 (1) 1.2基本说明 (1) 1.3定义 (1) 1.4参考资料 (1) 1.5注意事项 (1) 2方法 (1) 2.1环境 (1) 2.2方法 (1) 3附录 (2) 3.1串口资源 (2)

1 概述 1.1 文档目的 本文旨在说明在Linux操作系统下扩展串口的方法,供测试人员、技术支持人员和用户参考。 1.2 基本说明 Linux操作系统自带串口驱动(i8250芯片兼容),公司研发的串口扩展卡(A3CSD、MSP4I)不需要重新开发驱动,只需要一定配置即可使用。本文给出配置的方法供参考。 1.3 定义 Linux:一种开源、现代操作系统。 Fedora:一种Linux系统的发行版本。 A3CSD:北京盛博协同公司开发的扩展串口卡。 MSP4I:北京盛博协同公司开发的扩展串口卡。 PM4060:北京盛博协同公司开发的处理器板卡。 1.4 参考资料 《如何在LINUX下驱动多串口扩展卡》。 1.5 注意事项 Linux操作系统不同内核,不同发行版本存在一定差异,本文方法只保证在所试环境成功。 BIOS中必须释放扩展串口卡需要使用到的资源。 方法中使用的资源必须与扩展串口卡使用的资源一致。 如果所用Linux操作系统中没有方法中的命令,请安装或从类型系统拷贝。 2 方法 2.1 环境 1.LX3160(BC30CV31); 2.A3CSD(串口资源见附录); 3.CF 4G(Fedora 7); 4.鼠标、键盘、显示器、电源、线缆等。 2.2 方法 1.启动linux操作系统,以root身份进入命令控制台。 2.运行mknod /dev/ttyS9 c 4 64命令创建串口设备文件。 3.运行setserial /dev/ttyS9 port 0x100 irq 10 uart 16550A命令,链接设备文件到芯片。 4.重复步骤3,根据资源添加其他串口。 5.若想Linux启动后串口随即生效,把上述命令添加到启动脚本rc.local中。 图1

相关主题