搜档网
当前位置:搜档网 › Linux下串口通信编程

Linux下串口通信编程

Linux下串口通信编程
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 连接器,对连接器的每个引脚的信号内容加

以规定,还对各种信号的电平加以规定。传输距离在码元畸变小于4% 的情况下,传输电缆长度应为50 英尺。

四、计算机串口引脚说明

引出号说明

1 接地

2 TXD输出

3 RXD输入

4 RTS请求发送

5 CTS请求接收

6 DSR数据序列就绪

7 GND逻辑地

8 DCD数据负载检测

9 保留

10 保留

11 未定义

12 后备DCD

13 后备CTS

14 后备TXD

15 传输时钟

16 后备RXD

17 接收时钟

18 未定义

19 后备RTS

20 DTR数据终端就绪

21 信号质量检测

22 闹钟检测

23 数据速率选择

24 传输时钟

25 未定义

五、全双工与半双工

1.全双工,表示机器可以同时发送数据也可以接收数据,有两个独立的数据通道(一个用于发送,一个用于接收)

2.半双工,表示机器不能在发送数据的同时也接收数据。

六、流量控制

1.使用软件方法

使用特殊的字符来标记数据流的开始和结束,比如XON,DC1,八进制021来标志开始,用X0FF,DC3,八进制023来标志结束。

2.使用硬件方法

使用RS232的CTS和RTS信号来代替特殊字符控制。当接收方准备接收更多数据时,设置CTS为0,反之设置成1。对应的发送端准备发送数据时,设置RTS为0。

七、串口的访问

串口设备在LINUX下与所有设备一样都是通过设备文件来进行访问。

7.1打开串口

LINUX系统下串口设备是通过open函数来打开的,不过需要注意的是,一般用户是没有权限访问设备文件的,需要将打开的串口设备的访问权限设置成一般用户可以访问的权限。

open函数

头文件

#include

#include

#include

函数原型

int open(const char *pathname, int oflag, .../*, mode_t mode*/);

参数

const char *pathname - 要打开文件的文件名称,例如/dev/ttyS0

int oflag - 文件打开方式,可用标志如下:

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。

O_SYNC 对I/O进行写等待

返回值

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

例如:以可读写方式打开/dev/ttyS0设备

int fd; /* 文件描述符*/

fd = open("/dev/ttyS0", O_RDWR | 0_NOCTTY | O_NONBLOCK);

7.2关闭串口

Linux系统下通过close函数来关闭串口设备

close函数

头文件

#include

函数原型

int close(int filedes);

参数

int filedes - 文件描述符

返回值

成功返回0,否则返回-1

例如:关闭打开的串口设备fd

int ret; /* 返回标志,用于判断是否正常关闭设备*/

ret = close(fd);

7.3写串口

写串口是通过write函数来完成的

write函数

头文件

#include

函数原型

ssize_t write(int filedes, const void *buff, size_t nbytes);

参数

int filedes - 文件描述符

const void *buff - 存储写入数据的数据缓冲区

size_t nbytes - 写入数据字节数

返回值

ssize_t - 返回写入数据的字节数,该值通常等于nbytes,如果写入失败返回-1 例如:向终端设备发送初始化命令

int n = 0; /* 写入字节数*/

n = write(fd, "ATZ\r", 4);

if(n == -1)

{

fprintf(stderr, "Wirte ATZ command error.\n");

}

7.4读串口

读串口是通过read函数来完成的

read函数

头文件

#include

函数原型

ssize_t read(int filedes, void *buff, size_t nbytes);

参数

int filedes - 文件描述符

void *buff - 存储读取数据的数据缓冲区

size_t nbytes - 需要读取的字节数

返回值

ssize_t - 成功读取返回读取的字节数,否则返回-1

注意,在对串口进行读取操作的时候,如果是使用的RAW模式,每个read系统调用将返回当前串行输入缓冲区中存在的字节数。如果没有数据,将会一致阻塞到有字符达到或者间隔时钟到期,或者发生错误。如果想使read函数在没有数据的时候立即返回则可以使用fcntl函数来设置文件访问属性。例如:

fcntl(fd, F_SETFL, FNDELAY);

这样设置后,当没有可读取的数据时,read函数立即返回0。

通过fcntl(fd, F_SETFL, 0)可以设置回一般状态。

例如:从终端读取5个字节的应答数据

int nRead; /* 从终端读取的字节数*/

char buffer[256]; /* 接收缓冲区*/

nRead = read(fd, buffer, 5);

if(nRead == -1)

{

fprintf(stderr, "Read answer message error.\n");

}

八、终端配置

8.1 POSIX终端接口

大多数系统都支持POSIX终端接口,POSIX终端通过一个termios结构来进行控制,该结构定义在termios.h文件中。

termios结构

struct termios

{

tcflag_t c_iflag; /* 输入选项标志*/

tcflag_t c_oflag; /* 输出选项标志*/

tcflag_t c_cflag; /* 控制选项标志*/

tcflag_t c_lflag; /* 本地选项标志*/

cc_t c_cc[NCCS]; /* 控制特性*/

};

c_iflag成员

Flag Description

GNBRK 忽略输入中的BREAK状态

BRKINT 如果设置了IGNBRK,将忽略BREAK。如果没有设置,但是设置了BRKINT,那么BREAK将使得输入和输出队列被刷新,如果终端是一个前台进程组的控制终端,这个进程组中所有进程将收到SIGINT信号。如果既未设置IGNBRK也未设置BRKINT,BREAK 将视为NUL同义字符,除非设置了PARMRK,这种情况下被视为序列\377\0\0

IGNPAR 忽略桢错误和奇偶校验错误

PARMRK 如果没有设置IGNPAR,在有奇偶校验错误或者桢错误的字符前插入\377\0。如果既没有设置IGNPAR也没有设置PARMRK,将所有奇偶校验错误或者桢错误的字符视为\0。

INPCK 启用输入奇偶校验检测。

ISTRIP 去掉第八位。

INLCR 将输入的NL翻译为CR。

IGNCR 忽略输入中的回车。

ICRNL 将输入中的回车翻译为新行字符(除非设置了IGNCR)。

IUCLC (不属于POSIX)将输入中的大写字母映射为小写字母。

IXON 启用输出的XON/XOFF流控制

IXANY (不属于POSIX。1;XSI)允许任何字符来重新开始输出。

IXOFF 启用输入的XON/XOFF流控制

IMAXBEL (不属于POSIX)当输入队列满时响铃。LINUX没有实现该位,总是将其视为已设置。

c_oflag成员

Flag Description

OPOST 启用具体实现自行定义的输出。

OLCUC (不属于POSIX)将输出中的小写字母映射为大写字母。

ONLCR (XSI)将输出中的新行符映射为回车-换行

OCRNL 将输出中的回车映射为新行符。

ONOCR 不在第0列输出回车。

ONLRET 不输出回车。

OFILL 发送填充字符作为延时。

OFDEL (不属于POSIX)填充字符是ASCII DEL(0177)。如果不设置填充字符则是ASCII NUL。

NLDLY 新行延时掩码。取值为NL0和NL1。

CRDLY 回车延时掩码。取值为CR0,CR1,CR2或CR3。

TABDLY 水平跳格延时掩码。取值为TAB0,TAB1,TAB2,TAB3(或XTABS)。取值为TAB3,即XTABS,将扩展跳格为空格(每个跳格符填充8个空格)。

BSDLY 回车延时掩码。取值为BS0或BS1.(从来没有被实现)

VTDLY 竖直跳格掩码。取值为VT0或VT1。

FFDLY 进表延时掩码。取值为FF0或者FF1。

c_cflag成员

Flag Description

CBAUD (不属于POSIX)波特率掩码(4+1位)。

CBAUDEX (不属于POSIX)扩展的波特率掩码(1位),包含在CBAUD中。

CSIZE 字符长度掩码。取值为CS5,CS6,CS7或CS8。

CSTOPB 设置两个停止位。

CREAD 打开接受者。

PARENB 允许输出产生奇偶信息以及输入的奇偶校验。

PARODD 输入和输出是奇校验

HUPCL 在最后一个进程关闭设备后,降低MODEM控制线(挂断)。

CLOCAL 忽略MODEM控制线。

LOBLK (不属于POSIX)从非当前SHELL层阻塞输出(用于sh1)。

CIBAUD (不属于POSIX)输入速度的掩码。CIBAUD各位的值与CBAUD各位相同,左移了IBSHIFT位。

CRTSCTS (不属于POSIX)启用RTS/CTS(硬件)控制流。

c_lflag成员

Flag Description

ISIG 当接收到字符INTR,QUIT,SUSP或DSUSP时,产生相应的信号。

XCASE (不属于POSIX;LINUX下不支持)如果同时设置了ICANON,终端只有大写。输入被转换为小写,除了以\前缀的字符。输出时,大写字符被前缀\,小写字符被转换成大写。

ECHO 回显输入字符。

ECHOE 如果同时设置了ICANON,字符ERASE擦除前一个输入字符,WERASE擦除前一个词。

ECHOK 如果同时设置了ICANON,字符KILL删除当前行。

ECHONL 如果同时设置了ICANON,回显字符NL,即使没有设置ECHO。

ECHOCTL (不属于POSIX)如果同时设置了ECHO,除了TAB,NL,START和STOP之外的ASCII控制信号被回显为^x,这里X是比控制信号大0x40的ASCII码。例如字符0x08(BS)被回显为^H。

ECHOPRT (不属于POSIX)如果同时设置了ICANON和IECHO,字符在删除的同时被打印。

ECHOKE (不属于POSIX)如果同时设置了ICANON,回显KILL时将删除一行中的每个字符,如同指定了ECHOE和ECHORPT一样。

DEFECHO (不属于POSIX)只在一个进程读的时候回显。

FLUSHO (不属于POSIX;LINUX不支持)输出被刷新。这个标志可以通过键入字符DISCARD来打开和关闭。

NOFLSH 禁止产生SIGINT,SIGQUIT和SIGSUSP信号时刷新输入和输出队列。

TOSTOP 向试图写控制终端的后台进程组发送SIGTTOU信号。

PENDIN (不属于POSIX;LINUX不支持)在读入一个字符时,输入队列中的所有字符被重新输出。(bash用他来处理typeahead)。

IEXTEN 启用实现自定义的输入处理。这个标志必须与ICANON同时使用,才能解释特殊字符EOL2,LNEXT,REPRINT和WERASE,IUCLC标志才有效。

c_cc数组成员

Flag Description

VINTR (003,ETX,Ctrl-C,or also 0177, DEL, rubout)中断字符。发送SIGINT信号。当设置ISIG时可被识别,不再作为输入传递。

VQUIT (034,FS,Ctrl-\)退出字符。发出SIGQUIT信号。当设置ISIG时可被识别,不再作为输入传递。

VERASE (0177, DEL, rubout, or 010, BS, Ctrl-H, or also #) 删除字符。删除上一个还没有删掉的字符,但不删除上一个EOF 或行首。当设置ICANON 时可被识别,不再作为输入传递。

VKILL (025, NAK, Ctrl-U, or Ctrl-X, or also @) 终止字符。删除自上一个EOF 或行首以来的输入。当设置ICANON 时可被识别,不再作为输入传递。

VEOF (004, EOT, Ctrl-D) 文件尾字符。更精确地说,这个字符使得tty 缓冲中的内容被送到等待输入的用户程序中,而不必等到EOL。如果它是一行的第一个字符,那么用户

程序的read() 将返回0,指示读到了EOF。当设置ICANON 时可被识别,不再作为输入传递。

VMIN 非canonical 模式读的最小字符数。VEOL (0, NUL) 附加的行尾字符。当设置ICANON 时可被识别。VTIME 非canonical 模式读时的延时,以十分之一秒为单位。VEOL2 (not in POSIX; 0, NUL) 另一个行尾字符。当设置ICANON 时可被识别。

VEOL (0, NUL) 附加的行尾字符。当设置ICANON 时可被识别。

VTIME 非canonical 模式读时的延时,以十分之一秒为单位。

VEOL2 (not in POSIX; 0, NUL) 另一个行尾字符。当设置ICANON 时可被识别。

VSWTCH (not in POSIX; not supported under Linux; 0, NUL) 开关字符。(只为shl 所用。)

VSTART (021, DC1, Ctrl-Q) 开始字符。重新开始被Stop 字符中止的输出。当设置IXON 时可被识别,不再作为输入传递。

VSTOP (023, DC3, Ctrl-S) 停止字符。停止输出,直到键入Start 字符。当设置IXON 时可被识别,不再作为输入传递。

VSUSP (032, SUB, Ctrl-Z) 挂起字符。发送SIGTSTP 信号。当设置ISIG 时可被识别,不再作为输入传递。

VDSUSP (not in POSIX; not supported under Linux; 031, EM, Ctrl-Y) 延时挂起信号。当用户程序读到这个字符时,发送SIGTSTP 信号。当设置IEXTEN 和ISIG,并且系统支持作业管理时可被识别,不再作为输入传递。

VLNEXT (not in POSIX; 026, SYN, Ctrl-V) 字面上的下一个。引用下一个输入字符,取消它的任何特殊含义。当设置IEXTEN 时可被识别,不再作为输入传递。

VWERASE (not in POSIX; 027, ETB, Ctrl-W) 删除词。当设置ICANON 和IEXTEN 时可被识别,不再作为输入传递。

VREPRINT (not in POSIX; 022, DC2, Ctrl-R) 重新输出未读的字符。当设置ICANON 和IEXTEN 时可被识别,不再作为输入传递。

VDISCARD (not in POSIX; not supported under Linux; 017, SI, Ctrl-O) 开关:开始/结束丢弃未完成的输出。当设置IEXTEN 时可被识别,不再作为输入传递。

VSTATUS (not in POSIX; not supported under Linux; status request: 024, DC4, Ctrl-T).

8.2设置波特率

对于波特率的设置通常使用cfsetospeed和cfsetispeed函数来完成。获取波特率信息是通过cfgetispeed和cfgetospeed函数来完成的。

cfsetospeed函数

头文件:

#include

函数原型:

int cfsetospeed(struct termios *termptr, speed_t speed);

参数:

struct termios *termptr - 指向termios结构的指针speed_t speed - 需要设置的输出波特率

返回值:

如果成功返回0,否则返回-1

cfsetispeed函数

头文件:

#include

函数原型:

int cfsetispeed(struct termios *termptr, speed_t speed); 参数:

struct termios *termptr - 指向termios结构的指针speed_t speed - 需要设置的输入波特率

返回值:

如果成功返回0,否则返回-1

cfgetospeed函数

头文件:

#include

函数原型:

speed_t cfgetospeed(const struct termios *termptr);

参数:

const struct termios - 指向termios结构的指针

返回值:

返回输出波特率

cfgetispeed函数

头文件:

#include

函数原型:

speed_t cfgetispeed(const struct termios *termptr);

参数:

const struct termios *termptr - 指向termios结构的指针返回值:

返回输入波特率

波特率常量:

CBAUD 掩码

B0 0波特

B50 50波特

B75 75波特

B110 100波特

B134 134波特

B150 150波特

B200 200波特

B300 300波特

B600 600波特

B1200 1200波特

B1800 1800波特

B2400 2400波特

B9600 9600波特

B19200 19200波特

B38400 38400波特

B57600 57600波特

B115200 115200波特

8.3设置字符大小

设置字符的大小通过设置c_cflag标志位来实现的。

例如:

option.c_cflag &= ~CSIZE;

option.c_cflag |= CS7;

8.4设置奇偶校验

对于奇偶校验是需要手工设置的,常用的设置方式如下:No parity (8N1):

options.c_cflag &= ~PARENB

options.c_cflag &= ~CSTOPB

options.c_cflag &= ~CSIZE;

options.c_cflag |= CS8;

Even parity (7E1):

options.c_cflag |= PARENB

options.c_cflag &= ~PARODD

options.c_cflag &= ~CSTOPB

options.c_cflag &= ~CSIZE;

options.c_cflag |= CS7;

Odd parity (7O1):

options.c_cflag |= PARENB

options.c_cflag |= PARODD

options.c_cflag &= ~CSTOPB

options.c_cflag &= ~CSIZE;

options.c_cflag |= CS7;

Space parity is setup the same as no parity (7S1):

options.c_cflag &= ~PARENB

options.c_cflag &= ~CSTOPB

options.c_cflag &= ~CSIZE;

options.c_cflag |= CS8;

8.5获取和设置终端属性

设置和获取终端控制属性是通过tcgetattr和tcsetattr两个函数来完成的tcgetattr函数

头文件:

#include

函数原型:

int tcgetattr(int filedes, struct termios *termptr);

参数:

int filedes - 文件描述符

struct termiso *termptr - 指向termios结构的指针,

返回值:

如果成功返回0,否则返回-1

tcsetattr函数

头文件:

#include

函数原型:

int tcsetattr(int filedes, int opt, const struct termios *termptr);

参数:

int filedes - 文件描述符

int opt - 选项值,可以为下面三个值之一

TCSANOW - 不等数据传输完毕就改变属性

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

TCSAFLUSH - 清空输入输出缓冲区并且是设置属性

const struct termios *termptr - 指向termios结构的指针,

返回值:

成功返回0,否则返回-1

九、常用设置

9.1设置规范模式

规范模式是面向行的输入方式,输入字符被放入用于和用户交互可以编辑的缓冲区内,直接到读入回车或者换行符号时才结束。

可以通过如下方式来设置

option.c_lflag |= (ICANON | ECHO | ECHOE);

9.2设置原始输入模式

原始输入模式是没有处理过的,当接收数据时,输入的字符在它们被接收后立即被传送,使用原始输入模式时候,一般可以选择取消ICANON,ECHO,ECHOE和ISIG选项。

例如:

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

9.3设置输入奇偶选项

当激活c_cflag中的奇偶校验后,应该激活输入的奇偶校验。与之相关的标志有INPCK,IGNPAR,PARMRK和ISTRIP。一般是通过选择INPCK和ISTRIP激活检验和移除奇偶位。

例如:

option.c_iflag |= (INPCK | ISTRIP);

9.4设置软件控制流

软件控制流通过IXON,IXOFF和IXANY标志来设置

例如:

option.c_iflag |=(IXON | IXOFF | IXANY);

9.5选择预处理输出

通过OPOST标志来设置预处理的输出

例如:

option.c_oflag |= OPOST;

9.6选择原始数据输出

原始数据的输出通过设置c_oflag的OPOST标志

例如:

option.c_oflag &= ~OPOST;

9.7设置软件流控制字符

软件流控制字符是通过c_cc数组中的VSTART和VSTOP来设置的,一般来说,它们应该被设置城DC1(021八进制)和DC3(023八进制),分别表示ASCII码的XON 和XOFF字符。

9.8设置读超时

c_cc数组中的VMIN指定了最少读取的字符数,如果设置为0,那么VTIME就指定了读取每个字符的等待时间。VTIME是以1/10秒为单位指定接收字符的超时时间的,如果VTIME设置为0,而端口没有用open或者fcntl设置为NONBLOCK,那么read操作将会阻塞不确定的时间

Linux 下串口编程入门

Linux 下串口编程入门 级别: 初级 左锦 (zuo170@https://www.sodocs.net/doc/1a2748647.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下的串口编程(二) 分类:Linux S3C24402012-03-21 15:52 5557人阅读评论(1) 收藏举报linux编程终端terminalstruct测试 Linxu下的串口编程(二) /************声明:本人只是见到这篇文章对我帮助很大才转载的,但是这个完整的程序里面本来有语法错误的,现在让我改过来了************/ --------------------------------------------------------- Author :tiger-john WebSite :https://www.sodocs.net/doc/1a2748647.html,/tigerjb Email :jibo.tiger@https://www.sodocs.net/doc/1a2748647.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 的嵌入式串口通信 课程代码: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的嵌入式串口通信

天津电子信息职业技术学院《嵌入式软件编程》课程报告 课程名称:基于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下串口通信代码

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下串口编程所要知道的那些事 [日期: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.sodocs.net/doc/1a2748647.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波特率

linux系统下,串口接收发送数据,并利用udp转发

//************该程序实现的UDP数据和串口数据的转化**********************/ //时间:2013/7/30 //作者:田子 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define PORT 61557 //远端主机端口号 #define BROADCASTPORT 8003 //本地端口号 #define BUF_SIZE 100 //定义UDP数据发送的长度 #define FALSE -1 #define TRUE 0 /** *@bref 设置串口通信速率 *@param fd 类型 int 打开串口文件的句柄 *@param speed 类型 int 串口速度 *@return void */ int speed_arr[] = {B115200, B38400, B19200, B9600, B4800, B2400, B1200, B300, B38400, B19200, B9600, B4800, B2400, B1200, B300, }; int name_arr[] = {115200,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) {

(完整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脚短路连接即可(自发自收),实际运行的步骤与上面相同。

LINUX 串口通讯源码

主要函数 int openport(char *Dev) //打开串口 int setport(int fd, int baud,int databits,int stopbits,int parity)//设置串口,波特率,数据位,停止位,校验 int readport(int fd,char *buf,int len,int maxwaittime)//读数据,参数为串口,BUF,长度,超时时间 int writeport(int fd,char *buf,int len) //发送数据 void clearport(int fd) //如果出现数据与规约不符合,可以调用这个函数来刷新串口读写数据 如果有BUG,请大家及时回复给我,EMAIL:。 #include #include #include #include #include #include #include int openport(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 setport(int fd, int baud,int databits,int stopbits,int parity)

{ int baudrate; struct termios newtio; switch(baud) { case 300: baudrate=B300; break; case 600: baudrate=B600; break; case 1200: baudrate=B1200; break; case 2400: baudrate=B2400; break; case 4800: baudrate=B4800; break; case 9600: baudrate=B9600; break; case 19200: baudrate=B19200; break; case 38400: baudrate=B38400; break; default : baudrate=B9600; break; } tcgetattr(fd,&newtio); bzero(&newtio,sizeof(newtio));

相关主题