当前位置:文档之家› linux串口编程参数配置详解

linux串口编程参数配置详解

linux串口编程参数配置详解
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;

}

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]);

if(tcsetattr(fd, TCSANOW, &Opt) != 0)

{

perror(“tcsetattr fd”);

return;

}

tcflush(fd, TCIOFLUSH);

}

}

}

注意tcsetattr函数中使用的标志:

TCSANOW:立即执行而不等待数据发送或者接受完成。TCSADRAIN:等待所有数据传递完成后执行。

TCSAFLUSH:Flush input and output buffers and make the change 4.设置数据位、停止位和校验位

以下是几个数据位、停止位和校验位的设置方法:(以下均为1位停止位)8位数据位、无校验位:

Opt.c_cflag &= ~PARENB;

Opt.c_cflag &= ~CSTOPB;

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS8;

7位数据位、奇校验:

Opt.c_cflag |= PARENB;

Opt.c_cflag |= PARODD;

Opt.c_cflag &= ~CSTOPB;

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS7;

7位数据位、偶校验:

Opt.c_cflag |= PARENB;

Opt.c_cflag &= ~PARODD;

Opt.c_cflag &= ~CSTOPB;

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS7;

7位数据位、Space校验:

Opt.c_cflag &= ~PARENB;

Opt.c_cflag &= ~CSTOPB;

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS7;

代码如下:

int SetParity(int fd, int databits, int stopbits, int parity) {

struct termios Opt;

if(tcgetattr(fd, &Opt) != 0)

{

perror("tcgetattr fd");

return FALSE;

}

Opt.c_cflag |= (CLOCAL | CREAD); //一般必设置的标志

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

{

case 7:

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS7;

break;

case 8:

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS8;

berak;

default:

fprintf(stderr, "Unsupported data size.\n");

return FALSE;

}

switch(parity) //设置校验位

{

case 'n':

case 'N':

Opt.c_cflag &= ~PARENB; //清除校验位

Opt.c_iflag &= ~INPCK; //enable parity checking

break;

case 'o':

case 'O':

Opt.c_cflag |= PARENB; //enable parity

Opt.c_cflag |= PARODD; //奇校验

Opt.c_iflag |= INPCK //disable parity checking

break;

case 'e': case 'E': Opt.c_cflag |= PARENB; //enable parity Opt.c_cflag &= ~PARODD; //偶校验 Opt.c_iflag |= INPC K; //disable pairty checking break; case 's': case 'S': Op t.c_cflag &= ~PARENB; //清除校验位 Opt.c_cflag &= ~CSTOPB; / /?????????????? Opt.c_iflag |= INPCK; //disable pairty checking break; default: fprintf(stderr, "Unsupported parity.\n"); retu rn FALSE; } switch(stopbits) //设置停止位 { case 1: Opt. c_cflag &= ~CSTOPB; break; case 2: Opt.c_cflag |= CSTOPB; break; default: fprintf(stderr, "Unsupported stopbits.\n"); re turn FALSE; } opt.c_cflag |= (CLOCAL | CREAD); opt.c_lflag &= ~(ICAN ON | ECHO | ECHOE | ISIG); opt.c_oflag &= ~OPOST; opt.c_oflag &= ~ (ONLCR | OCRNL); //添加的 opt.c_iflag &= ~(ICRNL | INLCR); opt.c_ifla g &= ~(IXON | IXOFF | IXANY); //添加的 tcflush(fd, TCIFLUSH); Opt.c_cc [VTIME] = 0; //设置超时为15sec Opt.c_cc[VMIN] = 0; //Update the O pt and do it now if(tcsetattr(fd, TCSANOW, &Opt) != 0) { perror("tcse tattr fd"); return FALSE; } return TRUE; }

5.某些设置项

在第四步中我们看到一些比较特殊的设置,下面简述一下他们的作用。

c_cc数组的VSTART和VSTOP元素被设定成DC1和DC3,代表ASCII标准的XON和XOFF字符,如果在传输这两个字符的时候就传不过去,需要把软件流控制屏蔽,即:

Opt.c_iflag &= ~ (IXON | IXOFF | IXANY);

有时候,在用write发送数据时没有键入回车,信息就发送不出去,这主要是因为我们在输入输出时是按照规范模式接收到回车或换行才发送,而更多情况下我们是不必键入回车或换行的。此时应转换到行方式输入,不经处理直接发送,设置如下:

Opt.c_lflag &= ~ (ICANON | ECHO | ECHOE | ISIG);

还存在这样的情况:发送字符0X0d的时候,往往接收端得到的字符是0X0a,原因是因为在串口设置中c_iflag和c_oflag中存在从NL-CR和CR-NL的映射,即串口能把回车和换行当成同一个字符,可以进行如下设置屏蔽之:Opt.c_iflag &= ~ (INLCR | ICRNL | IGNCR);

Opt.c_oflag &= ~(ONLCR | OCRNL);

注意:控制符VTIME和VMIN之间有复杂的关系。VTIME定义要求等待的时间(百毫米,通常是unsigned char变量),而VMIN定义了要求等待的最小字节数(相比之下,read函数的第三个参数指定了要求读的最大字节数)。

如果VTIME=0,VMIN=要求等待读取的最小字节数,read必须在读取了VMIN 个字节的数据或者收到一个信号才会返回。

如果VTIME=时间量,VMIN=0,不管能否读取到数据,read也要等待VTIME 的时间量。

如果VTIME=时间量,VMIN=要求等待读取的最小字节数,那么将从read读取第一个字节的数据时开始计时,并会在读取到VMIN个字节或者VTIME时间后返回。

如果VTIME=0,VMIN=0,不管能否读取到数据,read都会立即返回

https://www.doczj.com/doc/1611145247.html,/shanzhizi

6.读写串口

发送数据方式如下,write函数将返回写的位数或者当错误时为-1。

char buffer[1024];

int length;

int nByte;

nByte = write(fd, buffer, length);

读取数据方式如下,原始数据模式下每个read函数将返回实际串口收到的字符数,如果串口中没有字符可用,回叫将会阻塞直到以下几种情况:有字符进入;一个间隔计时器失效;错误发送。

在打开串口成功后,使用fcntl(fd, F_SETFL, FNDELAY)语句,可以使read 函数立即返回而不阻塞。FNDELAY选项使read函数在串口无字符时立即返回且为0。

char buffer[1024];

int length;

int readByte;

readByte = read(fd, buffer, len);

注意:设置为原始模式传输数据的话,read函数返回的字符数是实际串口收到的字符数。Linux下直接用read读串口可能会造成堵塞,或者数据读出错误,此时可使用tcntl或者select等函数实现异步读取。用select先查询com口,再用read去读就可以避免上述错误。

7.关闭串口

串口作为文件来处理,所以一般的关闭文件函数即可:

close(fd);

8.例子

这个例子中,需要打开串口1,设置9600波特率、8位数据位、1位停止位以及空校验,之后利用while语句循环判断串口中是否可以读出数据,将串口中数据连续读出后重新写回到串口中。

该程序可与minicom联合测试。

#include

#include

#include

#include

#include

#include

#include

#include

main()

{

int fd;

int i;

int len;

int n = 0;

char read_buf[256];

char write_buf[256];

struct termios opt;

fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY); //默认为阻塞读方式if(fd == -1)

{

perror("open serial 0\n");

exit(0);

}

tcgetattr(fd, &opt);

cfsetispeed(&opt, B9600);

cfsetospeed(&opt, B9600);

if(tcsetattr(fd, TCSANOW, &opt) != 0 )

{

perror("tcsetattr error");

return -1;

}

opt.c_cflag &= ~CSIZE; opt.c_cflag |= CS8; opt.c_cflag &= ~CSTOP B; opt.c_cflag &= ~PARENB; opt.c_cflag &= ~INPCK; opt.c_cflag |= (C LOCAL | CREAD); opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); op t.c_oflag &= ~OPOST; opt.c_oflag &= ~(ONLCR | OCRNL); //添加的 opt. c_iflag &= ~(ICRNL | INLCR); opt.c_iflag &= ~(IXON | IXOFF | IXANY); //添加的 opt.c_cc[VTIME] = 0; opt.c_cc[VMIN] = 0; tcflush(fd, TCIOF LUSH); printf("configure complete\n"); if(tcsetattr(fd, TCSANOW, &op t) != 0) { perror("serial error"); return -1; } printf("start sen d and receive data\n"); while(1) { n = 0; len = 0; bz ero(read_buf, sizeof(read_buf)); //类似于memset bzero(write_buf, sizeof (write_buf)); while( (n = read(fd, read_buf, sizeof(read_buf))) > 0 ) { for(i = len; i < (len + n); i++) { write_buf [i] = read_buf[i - len]; } len += n; } write_buf[le n] = '\0'; printf("Len %d \n", len); printf("%s \n", write_bu f); n = write(fd, write_buf, len); printf("write %d chars\n",n);

sleep(2); } }

9.附录

c_cflag用于设置控制参数,除了波特率外还包含以下内容:

EXTA External rate clock

EXTB External rate clock

CSIZE Bit mask for data bits

CS5 5个数据位

CS6 6个数据位

CS7 7个数据位

CS8 8个数据位

CSTOPB 2个停止位(清除该标志表示1个停止位

PARENB 允许校验位

PARODD 使用奇校验(清除该标志表示使用偶校验)

CREAD Enable receiver

HUPCL Hangup (drop DTR) on last close

CLOCAL Local line –do not change “owner” of port

LOBLK Block job control outpu

c_cflag标志可以定义CLOCAL和CREAD,这将确保该程序不被其他端口控制和信号干扰,同时串口驱动将读取进入的数据。CLOCAL和CREAD通常总是被是能的。

c_lflag用于设置本地模式,决定串口驱动如何处理输入字符,设置内容如下:ISIG Enable SIGINTR, SIGSUSP, SIGDSUSP, and SIGQUIT signals

ICANON Enable canonical input (else raw)

XCASE Map uppercase \lowercase (obsolete)

ECHO Enable echoing of input characters

ECHOE Echo erase character as BS-SP-BS

ECHOK Echo NL after kill character

ECHONL Echo NL

NOFLSH Disable flushing of input buffers after interrupt or quit characters

IEXTEN Enable extended functions

ECHOCTL Echo control characters as ^char and delete as ~? ECHOPRT Echo erased character as character erased ECHOKE BS-SP-BS entire line on line kill

FLUSHO Output being flushed

PENDIN Retype pending input at next read or input char TOSTOP Send SIGTTOU for background output

c_iflag用于设置如何处理串口上接收到的数据,包含如下内容:

INPCK Enable parity check

IGNPAR Ignore parity errors

PARMRK Mark parity errors

ISTRIP Strip parity bits

IXON Enable software flow control (outgoing)

IXOFF Enable software flow control (incoming)

IXANY Allow any character to start flow again

IGNBRK Ignore break condition

BRKINT Send a SIGINT when a break condition is detected INLCR Map NL to CR

IGNCR Ignore CR

ICRNL Map CR to NL

IUCLC Map uppercase to lowercase

IMAXBEL Echo BEL on input line too long

c_oflag用于设置如何处理输出数据,包含如下内容:

OPOST Postprocess output (not set = raw output)

OLCUC Map lowercase to uppercase

ONLCR Map NL to CR-NL

OCRNL Map CR to NL

NOCR No CR output at column 0

ONLRET NL performs CR function

OFILL Use fill characters for delay

OFDEL Fill character is DEL

NLDLY Mask for delay time needed between lines

NL0 No delay for NLs

NL1 Delay further output after newline for 100 milliseconds CRDLY Mask for delay time needed to return carriage to left column

CR0 No delay for CRs

CR1 Delay after CRs depending on current column position CR2 Delay 100 milliseconds after sending CRs

CR3 Delay 150 milliseconds after sending CRs

TABDLY Mask for delay time needed after TABs

TAB0 No delay for TABs

TAB1 Delay after TABs depending on current column position TAB2 Delay 100 milliseconds after sending TABs

TAB3 Expand TAB characters to spaces

BSDLY Mask for delay time needed after BSs

BS0 No delay for BSs

BS1 Delay 50 milliseconds after sending BSs

VTDLY Mask for delay time needed after VTs

VT0 No delay for VTs

VT1 Delay 2 seconds after sending VTs

FFDLY Mask for delay time needed after FFs FF0 No delay for FFs

FF1 Delay 2 seconds after sending FFs

c_cc定义了控制字符,包含以下内容:

VINTR Interrupt CTRL-C

VQUIT Quit CTRL-Z

VERASE Erase Backspace (BS)

VKILL Kill-line CTRL-U

VEOF End-of-file CTRL-D

VEOL End-of-line Carriage return (CR)

VEOL2 Second end-of-line Line feed (LF) VMIN Minimum number of characters to read VSTART Start flow CTRL-Q (XON)

VSTOP Stop flow CTRL-S (XOFF)

VTIME Time to wait for data (tenths of seconds) 分类: C/C++

嵌入式linux 串口编程

(2011-04-22 11:21:12)

转载▼

分类:2010.3~

标签:

杂谈

1.串口操作需要的头文件

#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, B38400, B19200, B9600, B 4800, B2400, B1200, B300, };

int name_arr[] = {38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 120 0, 300, };

void SetSpeed(int fd, int speed)

{

int i;

struct termios Opt; //定义termios结构

if(tcgetattr(fd, &Opt) != 0)

{

perror(“tcgetattr fd”);

return;

}

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]);

if(tcsetattr(fd, TCSANOW, &Opt) != 0)

{

perror(“tcsetattr fd”);

return;

}

tcflush(fd, TCIOFLUSH);

}

}

}

注意tcsetattr函数中使用的标志:

TCSANOW:立即执行而不等待数据发送或者接受完成。

TCSADRAIN:等待所有数据传递完成后执行。

TCSAFLUSH:Flush input and output buffers and make the change

4.设置数据位、停止位和校验位

以下是几个数据位、停止位和校验位的设置方法:(以下均为1位停止位)8位数据位、无校验位:

Opt.c_cflag &= ~PARENB;

Opt.c_cflag &= ~CSTOPB;

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS8;

7位数据位、奇校验:

Opt.c_cflag |= PARENB;

Opt.c_cflag |= PARODD;

Opt.c_cflag &= ~CSTOPB;

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS7;

7位数据位、偶校验:

Opt.c_cflag |= PARENB;

Opt.c_cflag &= ~PARODD;

Opt.c_cflag &= ~CSTOPB;

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS7;

7位数据位、Space校验:

Opt.c_cflag &= ~PARENB;

Opt.c_cflag &= ~CSTOPB;

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS7;

代码如下:

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

{

struct termios Opt;

if(tcgetattr(fd, &Opt) != 0)

{

perror("tcgetattr fd");

return FALSE;

}

Opt.c_cflag |= (CLOCAL | CREAD); //一般必设置的标志

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

case 7:

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS7;

break;

case 8:

Opt.c_cflag &= ~CSIZE;

Opt.c_cflag |= CS8;

berak;

default:

fprintf(stderr, "Unsupported data size.\n");

return FALSE;

}

switch(parity) //设置校验位

{

case 'n':

case 'N':

Opt.c_cflag &= ~PARENB; //清除校验位

Opt.c_iflag &= ~INPCK; //enable parity checking break;

case 'o':

case 'O':

Opt.c_cflag |= PARENB; //enable parity

Opt.c_cflag |= PARODD; //奇校验

Opt.c_iflag |= INPCK //disable parity checking break;

case 'e':

case 'E':

Opt.c_cflag |= PARENB; //enable parity

Opt.c_cflag &= ~PARODD; //偶校验

Opt.c_iflag |= INPCK; //disable pairty checking break;

case 's':

case 'S':

Opt.c_cflag &= ~PARENB; //清除校验位

Opt.c_cflag &= ~CSTOPB; //??????????????

Opt.c_iflag |= INPCK; //disable pairty checking

break;

default:

fprintf(stderr, "Unsupported parity.\n");

return FALSE;

}

switch(stopbits) //设置停止位

{

case 1:

Opt.c_cflag &= ~CSTOPB;

break;

case 2:

Opt.c_cflag |= CSTOPB;

break;

default:

fprintf(stderr, "Unsupported stopbits.\n");

return FALSE;

}

opt.c_cflag |= (CLOCAL | CREAD);

opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

opt.c_oflag &= ~OPOST;

opt.c_oflag &= ~(ONLCR | OCRNL); //添加的

opt.c_iflag &= ~(ICRNL | INLCR);

opt.c_iflag &= ~(IXON | IXOFF | IXANY); //添加的

tcflush(fd, TCIFLUSH);

Opt.c_cc[VTIME] = 0; //设置超时为15sec

Opt.c_cc[VMIN] = 0; //Update the Opt and do it now if(tcsetattr(fd, TCSANOW, &Opt) != 0)

{

perror("tcsetattr fd");

return FALSE;

}

return TRUE;

}

5.某些设置项

在第四步中我们看到一些比较特殊的设置,下面简述一下他们的作用。

c_cc数组的VSTART和VSTOP元素被设定成DC1和DC3,代表ASCII标准的XON和XOFF 字符,如果在传输这两个字符的时候就传不过去,需要把软件流控制屏蔽,即:

Opt.c_iflag &= ~ (IXON | IXOFF | IXANY);

有时候,在用write发送数据时没有键入回车,信息就发送不出去,这主要是因为我们在输入输出时是按照规范模式接收到回车或换行才发送,而更多情况下我们是不必键入回车或换行的。此时应转换到行方式输入,不经处理直接发送,设置如下:

Opt.c_lflag &= ~ (ICANON | ECHO | ECHOE | ISIG);

还存在这样的情况:发送字符0X0d的时候,往往接收端得到的字符是0X0a,原因是因为在串口设置中c_iflag和c_oflag中存在从NL-CR和CR-NL的映射,即串口能把回车和换行当成同一个字符,可以进行如下设置屏蔽之:

Opt.c_iflag &= ~ (INLCR | ICRNL | IGNCR);

Opt.c_oflag &= ~(ONLCR | OCRNL);

6.读写串口

发送数据方式如下,write函数将返回写的位数或者当错误时为-1。

char buffer[1024];

int length;

int nByte;

nByte = write(fd, buffer, length);

读取数据方式如下,原始数据模式下每个read函数将返回实际串口收到的字符数,如果串口中没有字符可用,回叫将会阻塞直到以下几种情况:有字符进入;一个间隔计时器失效;错误发送。

在打开串口成功后,使用fcntl(fd, F_SETFL, FNDELAY)语句,可以使read函数立即返回而不阻塞。FNDELAY选项使read函数在串口无字符时立即返回且为0。

char buffer[1024];

int length;

int readByte;

readByte = read(fd, buffer, len);

注意:设置为原始模式传输数据的话,read函数返回的字符数是实际串口收到的字符数。Linux下直接用read读串口可能会造成堵塞,或者数据读出错误,此时可使用tcntl或者select 等函数实现异步读取。用select先查询com口,再用read去读就可以避免上述错误。

7.关闭串口

串口作为文件来处理,所以一般的关闭文件函数即可:

close(fd);

8.例子

这个例子中,需要打开串口1,设置9600波特率、8位数据位、1位停止位以及空校验,之后利用while语句循环判断串口中是否可以读出数据,将串口中数据连续读出后重新写回到串口中。

该程序可与minicom联合测试。

#include

#include

#include

#include

#include

#include

#include

#include

main()

{

int fd;

int i;

int len;

int n = 0;

char read_buf[256];

char write_buf[256];

struct termios opt;

fd = open("/dev/ttyS0", O_RDWR | O_NOCTTY); //默认为阻塞读方式

if(fd == -1)

{

perror("open serial 0\n");

exit(0);

}

tcgetattr(fd, &opt);

cfsetispeed(&opt, B9600);

cfsetospeed(&opt, B9600);

if(tcsetattr(fd, TCSANOW, &opt) != 0 )

{

perror("tcsetattr error");

return -1;

}

opt.c_cflag &= ~CSIZE;

opt.c_cflag |= CS8;

opt.c_cflag &= ~CSTOPB;

opt.c_cflag &= ~PARENB;

opt.c_cflag &= ~INPCK;

opt.c_cflag |= (CLOCAL | CREAD);

opt.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);

opt.c_oflag &= ~OPOST;

opt.c_oflag &= ~(ONLCR | OCRNL); //添加的

opt.c_iflag &= ~(ICRNL | INLCR);

opt.c_iflag &= ~(IXON | IXOFF | IXANY); //添加的

opt.c_cc[VTIME] = 0;

opt.c_cc[VMIN] = 0;

tcflush(fd, TCIOFLUSH);

printf("configure complete\n");

if(tcsetattr(fd, TCSANOW, &opt) != 0)

{

perror("serial error");

return -1;

}

printf("start send and receive data\n");

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下串口通信编程 一、什么是串口通信? 串口通信是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为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 串口输出

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串口打印设置

一、基于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下的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下扩展串口配置方法

编号: 版本号: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

linux下串口通信代码

1.Stty.h #ifndef __STTY_H__ #define __STTY_H__ //包含头文件 #include #include #include #include #include #include #include #include #include // 串口设备信息结构 typedef struct tty_info_t { int fd; // 串口设备ID pthread_mutex_t mt; // 线程同步互斥对象 char name[24]; // 串口设备名称,例:"/dev/ttyS0" struct termios ntm; // 新的串口设备选项 struct termios otm; // 旧的串口设备选项 } TTY_INFO; // 串口操作函数 TTY_INFO *readyTTY(int id); int setTTYSpeed(TTY_INFO *ptty, int speed); int setTTYParity(TTY_INFO *ptty,int databits,int parity,int stopbits); int cleanTTY(TTY_INFO *ptty); int sendnTTY(TTY_INFO *ptty,char *pbuf,int size); int recvnTTY(TTY_INFO *ptty,char *pbuf,int size); int lockTTY(TTY_INFO *ptty); int unlockTTY(TTY_INFO *ptty); #endif 2.Stty.c #include #include #include "stty.h" /////////////////////////////////////////////////////////////////////////////// // 初始化串口设备并进行原有设置的保存 TTY_INFO *readyTTY(int id) { TTY_INFO *ptty; ptty = (TTY_INFO *)malloc(sizeof(TTY_INFO)); if(ptty == NULL)

linux配置串口

(一)Linux下设置串口说明 在某些情况下,出于调试的目的需要给linux配置串口控制台,或者linux根本没有显卡,也需要配置串口终端。一个串口控制台将发送所有的终端显示到串口,而串口终端则可以实现通过串口登录到系统。你可以同时设置两个或者其中一个。为了控制内核输出所有控制台消息到串口,你需要在时向内核传递参数console=ttyS0,这可以通过GRUB来实现,下面的例子会将控制台消息发送到tty0(显示器控制台)和ttyS0(串口1),发送到串口控制台的速度为115200,但是需要注意的是一种类型设备只能定义一个控制台,例如不能把消息同时发送到串口1和串口2,编辑/boot/grub/grub.conf,添加如下内容: console=ttyS0,115200 console=tty0 串口终端 为了设置一个串口终端,需要为串口衍生(spawn)一个agetty,在/etc/inittab添加如下内容:co:2345:respawn:/sbin/agetty ttyS0 115200 vt100 init q 例如:# Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 co:2345:respawn:/sbin/agetty ttyS0 115200 vt100 init q 也可以在/etc/securetty文件中添加串口设置,这样才可以以root身份从串口登录,在该文件最后添加一行,内容为ttyS0 (二)配置服务器端的minicom程序 修改grub, 在kernel 一行追加”console=ttyS0,38400 console=tty0”重启服务器。含义是将kernel信息通过第一个串口, 以38400的波特率导出; 同时在第一个控制台通过屏幕打印.。 (三)配置接收端的minicom程序 1)先检查系统是否安装了minicom,如没有安装请先安装,安装方法略。 #rpm -qa |grep minicom minicom-2.00.0-17.1 2)对minicom进行参数设置 以root用户登录linux系统,后执行: #minicom -s 回出现一个配置界面: ┌─────[configuration]──────┐ │ Filenames and paths │ File transfer protocols │ Serial port setup │ Modem and dialing │ Screen and keyboard

基于linux的嵌入式串口通信(DOC)

天津电子信息职业技术学院《嵌入式软件编程》课程报告 课程名称:基于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 Linux系统简介 (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)

摘要 随着Internet的发展和后PC时代的到来,嵌入式系统以其可靠性强、体积小、专用性、成本低等特性得到日益广泛的应用。目前嵌入式系统技术已经成为了最热门的技术之一。与此同时,一个独立的嵌入式系统的功能缺陷也逐渐暴露出来。新一代嵌入计算系统的功能集成和应用模式使之迅速向网络化嵌入计算的方向发展,标准和统一的TCP/IP通信协议是独立于任何厂家的硬件的,因此嵌入环境下的实时网络通信成为嵌入计算技术研究的重点和热点。本文通过基于2410F 的嵌入式串口通信的实现,按照嵌入式系统的软、硬件结构组成,较为详细地介绍了串口通信的硬件电路和软件实现方法。 关键词:嵌入式串口通信 2410F

Linux C 串口编程

Linux C 串口编程 arch/arm/include/asm/termbits.h struct termios { tcflag_t c_iflag; /* input mode flags */ tcflag_t c_oflag; /* output mode flags */ tcflag_t c_cflag; /* control mode flags */ tcflag_t c_lflag; /* local mode flags */ cc_t c_line; /* line discipline */ cc_t c_cc[NCCS]; /* control characters */ }; 串口的设置主要是设置struct termios结构体的各成员 /** *测试的时候应用程序在后台运行./serial_test & */ #include #include #include #include #include #include //文件控制定义 #include //终端控制定义 #include #define DEVICE "/dev/s3c2410_serial0" int serial_fd = 0;

//打开串口并初始化设置 init_serial(void) { serial_fd = open(DEVICE, O_RDWR | O_NOCTTY | O_NDELAY); if (serial_fd < 0) { perror("open"); return -1; } //串口主要设置结构体termios struct termios options; /**1. tcgetattr函数用于获取与终端相关的参数。 *参数fd为终端的文件描述符,返回的结果保存在termios结构体中 */ tcgetattr(serial_fd, &options); /**2. 修改所获得的参数*/ options.c_cflag |= (CLOCAL | CREAD);//设置控制模式状态,本地连接,接收使能 options.c_cflag &= ~CSIZE;//字符长度,设置数据位之前一定要屏掉这个位 options.c_cflag &= ~CRTSCTS;//无硬件流控 options.c_cflag |= CS8;//8位数据长度 options.c_cflag &= ~CSTOPB;//1位停止位 options.c_iflag |= IGNPAR;//无奇偶检验位 options.c_oflag = 0; //输出模式 options.c_lflag = 0; //不激活终端模式 cfsetospeed(&options, B115200);//设置波特率 /**3. 设置新属性,TCSANOW:所有改变立即生效*/ tcflush(serial_fd, TCIFLUSH);//溢出数据可以接收,但不读 tcsetattr(serial_fd, TCSANOW, &options); return 0; }

Linux下串口编程所要知道的那些事

Linux下串口编程所要知道的那些事 [日期:2011- 来源:csdn 作者:tiger-john 1. 波特率 1> 表示每秒传输的比特数。 2> 说明:若波特率为115200,它表示什么呢? ? 对于发送断,即每秒钟发送115200bit。 ? 对于接收端,115200波特率意味着串口通信在数据线上的采样率为115200HZ. 注:波特率和距离之间成反比,距离相隔很近的设备之间可以实现高波特率通信。 2. 数据位 1> 表示通信中实际数据位的参数。在计算机发送的数据包中,实际的数据往往不会是8位。 2> 说明:在串口通信中,可以选择5,6,7,8位。设定数据位时,主要考虑所要传输的数据内容。 3> 事例:如果要传输的是标准的ASCII码。那么又该如何设定数据位呢? ? 由于ASCII码的范围是0~127,因此设定数据位为7就OK了。 ? 若为扩展ASCII码,其范围是0~255,必须使用8位。 注:7位或8位数据中不仅仅是数据,还包括开始/停止位,数据位以及奇偶校验位等。 3. 奇偶校验位 1> 作用:该位用于串口通信中的简单检验错。 2> 类型:主要有偶校验,奇校验,标记,空格的方式 在ARM7(LPC2200)中,只有偶校验,奇校验两种方式。 3> 方法:如何进行校验? ? 奇偶校验是通过统计数据中高位或低位的个数来实现校验的。 ? 标记,空格并不是真正校验错误的,只是通过简单的置位来实现对

数据的检测。https://www.doczj.com/doc/1611145247.html,通过置位方式,可以判断出是否存在噪声干扰数据通信或数据传输,以及是否存在不同步的现象 4. 停止位 1> 作用:停止位用于标志该数据包数据结束,可以取1位,1.5位或2位。 在ARM7(lpc2200中)停止位可以取1位,2位或不取 2> 说明: ? 停止位不仅仅用于数据包的传输结束标志,还提供了计算机之间校正同步时钟的机会。 ? 用于停止位的位数越多,不同时钟同步的容忍程序越大。 ? 但是由于停止位占用了数据空间,过多的停止位将导致数据传输速度的下降。 5. 数据流控制 1> 通过串口传输数据时,由于计算机之间处理速度或其他因素的影响,会造成丢失数据的现象。 2> 作用:数据流控制用于解决上面的问题,通过控制发送数据的速度,确保数据不会出现丢失。 3> 类型:数据流控制可以分为软件流控制(Xon/Xoff)和硬件流控制,当然你可以选择不使用数据流控制。 ? 软件流控制使用特殊的字符作为启动或停止的标志 ? 硬件流控制通过使用硬件信号(CTR/RTS)来实现。 注:使用硬件流控制时,在接收端准备好接收数据后,设为CTS为1,否则CTS为0。同样,如果发送端准备好要发送数据时,则设定RTS为1;如果还未准备好,设置CTS为0. 二. Linux串口下编程所要考虑的问题 1. Linux下编写串口程序的思想 看图:

linux下串口应用程序编程

这几天,由于多功能温度测量仪项目的需要,涉及到了GSM信息的串口读取,所以在Linux下串口信息的读取有了一点心得体会。 1. 打开串口 与其他的关于设备编程的方法一样,在Linux下,操作、控制串口也是通过操作起设备文件进行的。在Linux下,串口的设备文件是/dev/ttyS0或/dev/ttyS1等。因此要读写串口,我们首先要打开串口: char *dev = "/dev/ttyS0"; //串口1 int fd = open( dev, O_RDWR ); //打开串口的核心语句 //| O_NOCTTY | O_NDELAY if (-1 == fd) { perror("Can't Open Serial Port"); return -1; } else return fd; 2. 设置串口速度 打开串口成功后,我们就可以对其进行读写了。首先要设置串口的波特率: 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(fd, TCSANOW, &Opt); if (status != 0) { perror("tcsetattr fd"); return; } tcflush(fd,TCIOFLUSH); } } }

Linux下串口C语言编程

串口操作代码 #include #include #include #include #include #include #include #include #include #define BUFFER_SIZE 1024 #define HOST_PORT 1 int set_port(int fd, int baud_rate, int data_bits, char parity, int stop_bits) { struct termios newtio,oldtio; if( tcgetattr(fd,&oldtio) != 0) { perror("Setup Serial 1"); return -1; } bzero(&newtio,sizeof(newtio)); newtio.c_cflag |= CLOCAL | CREAD; newtio.c_cflag &= ~CSIZE; /* set baud_speed*/ switch(baud_rate) { case 2400: cfsetispeed(&newtio,B2400); cfsetospeed(&newtio,B2400); break; case 4800: cfsetispeed(&newtio,B4800); cfsetospeed(&newtio,B4800); break; case 9600: cfsetispeed(&newtio,B9600); cfsetospeed(&newtio,B9600);

嵌入式linux的串口设置参数

linux基础复习(7)串口应用开发 据通信的基本方式可分为并行通信与串行通信两种。 ·并行通信是指利用多条数据传输线将一个资料的各位同时传送。它的特点是传输速度快,适用于短距离通信,但要求传输速度较高的应用场合。 ·串行通信是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用 简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。 串口设置详解 本节主要讲解设置串口的主要方法。 如前所述,设置串口中最基本的包括波特率设置,校验位和停止位设置。串口的设置主 要是设置struct termios结构体的各成员值,如下所示: #include struct termio { unsigned short c_iflag; /* 输入模式标志*/ unsigned short c_oflag; /* 输出模式标志*/ unsigned short c_cflag; /* 控制模式标志*/ unsigned short c_lflag; /*本地模式标志*/ unsigned char c_line; /* line discipline */ unsigned char c_cc[NCC]; /* control characters */ }; 在这个结构中最为重要的是c_cflag,通过对它的赋值,用户可以设置波特率、字符大小、数据位、停止位、奇偶校验位和硬件流控等。另外c_iflag 和c_cc 也是比较常用的标志。在 此主要对这3 个成员进行详细说明。 c_cflag支持的常量名称 CBAUD 波特率的位掩码 B0 0波特率(放弃DTR) B1800 1800波特率 B2400 2400波特率 B4800 4800波特率

(完整word版)linux下的串口通信程序详解

linux下的串口通信程序详解 2009-07-19 12:37 为了说明问题,下面给出测试程序来理解linux下的串口操作流程,例程receive.c 用来接收从串口发来的数据,而例程send.c用来发送数据到串口。二者成功建立串口连接后,串口接收端会收到串口发送端发来的字符串数据“Hello,this is a Serial Port test!”。

分别将上面的俩个程序编译之后就可以运行了,如果是在两个不同的平台上运行,比如,在开发板上运行数据发送程序write(write.c编译后得到),在宿主机上运行结收数据程序read(read.c编译得到),采用串口线将二者正确连接之后,就可以运行来看实际的效果了: 首先在宿主机端运行数据接收程序receive: [zhang@localhost]# ./receive [zhang@localhost]#open /dev/ttyS0: Success ready for receiving data... The data received is: Hello,this is a Serial_Port test! [zhang@localhost]# 在接收端运行完程序之后再到发送端运行数据发送程序send:

#./send ready for sending data... the number of char sent is 35 # 运行完发送程序之后就可以在接收端看到接收的数据了。 也可以在一台PC机上来运行这两个程序,这时需要将串口线的2、3脚短路连接即可(自发自收),实际运行的步骤与上面相同。

相关主题
文本预览
相关文档 最新文档