Linux下串口通信_第1页
Linux下串口通信_第2页
Linux下串口通信_第3页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Linux下串口编程Linux 系统下,诸如串口、触摸屏、 GPIO、ADC 等等各种设备的 操作,都是通过访问其对应的设备节点进行控制。相应地,串口通过访问/dev/ttySO、/dev/ttyS1、/dev/ttyS2对其进行配置与控制。串口配置的参数包括: 波特率, 数据位,校验位,停止位与流控。 串口的配置主要是通过配置 struct termios 结构体,其原型如下: #include <termios.h> struct ermios unsigned short c_iflag; /*输入模式标志 */ unsigned short c_oflag; /*输出模式标

2、志 */ unsigned short c_cflag; /*控制模式标志 */ unsigned short c_lfag; /*本地模式标志 */ unsigned short c_line; /*line discipline*/ unsigned short c_ccNCC; /*control characters*/ ;其中,通过对 c_cflag 与 c_iflag 的赋值,可以设置波特率、数据位、 奇偶校验位、停止位、流控。1、波特率配置串口通过函数 cfsetispeed 和 cfsetospeed 设置端口的输入 / 输出波特 率:int cfsetispeed(struc

3、t termios *termios_p, speed_t speed);int cfsetospeed(struct termios *termios_p, speed_t speed);其中termios_p为串口结构体termios指针变量;speed为需要设置 的串口传输速率,取值与波特率对应关系见表一:表宏定义波特率(单位:bit/s)宏定义波特率(单位:bit/s )B00B18001800B5050B24002400B7575B48004800B110110B96009600B134134B1920019200B150150B3840038400B200200B576005760

4、0B300300B115200115200B600600B230400230400B120012002、数据位配置串口数据位的配置通过修改termios结构体成员c_cflag实现,CS5CS6 CS7和 CS8分别表示数据位为5、6、7和&在设置数据位前, 先使用CSIZE做位屏蔽:termios_p.c_cflag&二 CSIZE;termios_p.c_cflag |= CS5; /*配置为 5 数据位 */3、校验位配置 校验位包括:无校验、奇校验、偶校验、空格等: 无校验:termios_p.c_cflag&= PARENB; termios_p.c_ifla

5、g&= INPCK;奇校验:termios_p.c_cflag|= (PARODD | PARENB); termios_p.c_iflag|= INPCK;偶校验: termios_p.c_cflag |= PARENB; termios_p.c_cflag&= PARODD; termios_p.c_iflag|= INPCK;空格:termios_p.c_cflag&= PARENB; termios_p.c_cflag&= CSTOPB;4、停止位配置串口停止位通过激活c_cflag的CSTOPB空制,具体方法如下:1 个停止位:termios_p.c_

6、cflag&= CSTOPB;2 个停止位:termios_p.c_cflag |= CSTOPB;5、流控配置流控用于标识数据的开始与结束, 流控的种类包括硬件流、 软件流与 不使用流控。不使用流控:termios_p.c_cflag&= CRTSCTS;硬件流:termios_p.c_cflag |= CRTSCTS;软件流:termios_p.c_cfalg |= IXON | IXOFF | IXANY;6. 串口编程中常用的函数原型 :1) tcgetattr ()函数用于获取与终端相关的参数。int tcgetattr(intfd, structtermios *t

7、ermios_p);参数 fd 为终端的文件描述符,返回的结果保存在 termios 结构体 中。2) tcsetattr ()函数用于设置终端参数。int tcsetattr(intfd, intoptional_actions, conststructtermios *termios_p);函数在成功的时候返回 0,失败的时候返回 -1,并设置 errno 的 值。参数 fd 为打开的终端文件描述符,参数 optional_actions 用于控 制修改起作用的时间,而结构体 termios_p 中保存了要修改的参数。optional_actions 可以取如下的值。TCSANO W不等数

8、据传输完毕就立即改变属性。TCSADRAI:N 等待所有数据传输结束才改变属性。TCSAFLUSH清空输入输出缓冲区才改变属性。 错误信息:EBADF非法的文件描述符。EINTR:tcsetattr 函数调用被信号中断。EINVAL参数optional_actions使用了非法值,或参数termios中使用 了非法值。ENCTT Y非终端的文件描述符。3)tcflush ()函数用于刷清(扔掉)输入缓存(终端驱动法度已接 管到,但用户法度尚未读)或输出缓存(用户法度已经写,但尚未发 送) .int tcflush( intfd , intquene)参数 fd 为打开的终端文件描述符 ;que

9、ne 数该当是下列三个常数之一 :*TCIFLUSH 刷清输入队列 *TCOFLUSH 刷清输出队列*TCIOFLUSH 同时刷清收到的数据但是不读, 并且刷清写入的数 据但是不传送。通俗地说就是将输出缓冲器清空,把输入缓冲区清空。缓冲区里的数据都废弃。4)波特率配置串口通过函数 cfsetispeed 和 cfsetospeed 设置端口的输入 / 输出波特 率:int cfsetispeed(structtermios *termios_p, speed_t speed);int cfsetospeed(structtermios *termios_p, speed_t speed);其中

10、 termios_p 为串口结构体 termios 指针变量; speed 为需要设置 的串口传输速率,取值与波特率对应关系见表一。7. 例子程序:程序实现了配置串口 0 参数与向串口 0 输出数据 #include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h>#include <termios.h>#include <errno.h&

11、gt;#include <asm/ioctl.h>voidSet_uart(intfd, intdatabits, intstopbit, char parity, char datastream)int ret;structtermiostermios_opt; if(tcgetattr(fd, &termios_opt) perror("tcgetattr errorn"); return;/*flush memory*/ tcflush(fd,TCIOFLUSH);/*Set i/o speed*/ cfsetispeed(&termios

12、_opt, B115200); cfsetospeed(&termios_opt, B115200); /*set databits,default is 8 databits*/ termios_opt.c_cflag&= CSIZE; switch (databits)case 5:termios_opt.c_cflag |= CS5; break;case 6: termios_opt.c_cflag |= CS6; break;case 7: termios_opt.c_cflag |= CS7; break;case 8: termios_opt.c_cflag |=

13、 CS8; break;default: termios_opt.c_cflag |= CS8; break;/*Set Parity, default is no vertify*/switch (parity)case 'N': /*no vertify*/ termios_opt.c_cflag&= PARENB; termios_opt.c_iflag&= INPCK;break;case 'O': /*odd vertify*/termios_opt.c_cflag |= (PARODD | PARENB);termios_opt.c_

14、iflag |= INPCK; break;case 'E': /*even vertify*/ termios_opt.c_cflag |= PARENB; termios_opt.c_cflag&= PARODD; termios_opt.c_iflag |= INPCK; break;case 'S': /*space vertify*/ termios_opt.c_cflag&= PARENB; termios_opt.c_cflag&= CSTOPB; termios_opt.c_iflag |= INPCK; break;de

15、fault: termios_opt.c_cflag&= PARENB; termios_opt.c_iflag&= INPCK; break;/*Set stop bits, default is 1 stopbit*/ switch (stopbit)case 1:termios_opt.c_cflag&= CSTOPB;break; case 2: termios_opt.c_cflag |= CSTOPB; break;default: termios_opt.c_cflag&= CSTOPB;break;/*set data stream,defaul

16、t is no data stream control*/ switch (datastream)case 'N': /*no data stream control*/ termios_opt.c_cflag&= CRTSCTS; break;case 'H': /*hardware data stream control*/ termios_opt.c_cflag |= CRTSCTS;break;case 'S': /*software data stream control*/ termios_opt.c_cflag |= IXO

17、N | IXOFF | IXANY; break;default: termios_opt.c_cflag&= CRTSCTS;break;/*oputmodle,initial data output*/ termios_opt.c_oflag&= OPOST;/*set waiting time and recv min character*/ termios_opt.c_ccVTIME = 0; termios_opt.c_ccVMIN = 0;/*flush memory*/ tcflush(fd,TCIFLUSH);/*start using new options*

18、/ if(tcsetattr(fd,TCSANOW,&termios_opt) != 0) perror("serial setup errorn");return;printf("set serial done!n");return ;int main(void)intserial_fd;unsigned char data14 = 0;memset(data,'a',sizeof(data); printf("open UART.n");serial_fd = open("/dev/ttyS0",O_RDWR | O_NOCTTY | O_NONBLOCK); if (se

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论