版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、实验十二 串口通讯实验【实验目的】1、了解串口设备文件系统的使用方法;2、掌握Qt编程方法与技巧3、掌握Qtopia应用程序的配置过程【实验原理】在Linux操作系统中对底层终端的处理是一个非常复杂的过程,需要处理许多不同类型的设备(包括调制解调器、终端仿真、伪终端等)。Linux系统处理终端的方法是通过串行接口连接的控制台与系统通信并运行程序。由于越来越多的厂商都参与终端的生产,而且每个厂商都是为自己的终端设计自己的命令集,所以需要有一种方法对终端的访问进行一般化处理。Linux系统使用一个能力数据库terminfo来描述每个终端的能力以及调用这些功能的方法。1、终端控制函数介绍在对底层终端
2、操作中有一个用于查询和操作终端的标准接口结构体 termios,该结构体对终端的输入、输出、硬件特性、控制协议等方面进行了定义,具体定义形式如下:struct termios tcflag_t c_iflag; tcflag_t c_oflag; tcflag_t c_cflag; tcflag_t c_lflag; cc_t;cc_t c_ccNCCS;其中参数c_iflag用来控制输入处理选项;c_oflag控制输出数据的处理;c_cflag设置决定终端硬件特性的控制标志;c_lflag存放本地模式标志,用来操纵终端特性;c_line表示控制协议;c_cc包含特殊字符序列的值以及它们所代表
3、的操作。终端有两种工作模式,分别为规范模式(或称为cooked模式)和非规范模式(或称为原始模式)。在规范模式下,终端设备驱动程序处理特殊字符并以一次一行的方式将输入发送给程序使用,而在非规范模式下,大多数键盘输入得不到处理,也不缓存。(1)、终端属性控制函数对终端的操作主要通过属性设置函数tcsetattr()和属性获取函数tcgetattr()来实现。其中tcsetattr()函数用来初始化一个termios数据结构,并设置用来表示该终端特性和设置的属性值,tcgetattr()获取和查询终端属性的数据结构,当改变操作完成后,通过使用tcsetattr()函数将用到的新值更新终端。tcse
4、tattr()和tcgetattr()的调用形式如下:int tcsetattr(int fd, int action , struct termios *tp)函数tcsetattr()使用由tp引用的termios数据结构来设置与文件描述符fd相关联的终端参数,参数action控制设置参数什么时候发生改变,如果取TASANOW表示立即改变所设参数属性;如果取TCSADRAIN表示fd上的输出已经发送到终端后才改变所设置的参数属性;如果取TCSAFLUSH表示fd上的输出完全被发送到终端后,任何挂起的输入将被丢弃。int tcgetattr(int fd , struct termios *
5、tp)查询和文件描述符相关联的终端参数,并将参数存储到由tp所引用的termios数据结构体中,调用成功返回0,发生错误返回-1。(2)、终端速度控制函数终端速度控制函数用来设置终端设备的输入、输出速度,速度以波特率来定义。这些函数都是成对出现,其中的两个用来获取和设置输入的速度,另两个用来获取和设置输出线路的速度,它们定义形式如下:int cfgetispeed (struct termios *tp) int cfsetispeed (struct termios *tp , speed_t speed)int cfgetospeed (struct termios *tp) int cf
6、setospeed (struct termios *tp , speed_t speed)其中函数cfgetispeed()返回由tp指针指向的termios数据结构中所存储的输入线路速度值。函数cfsetispeed()将由tp指针指向的termios数据结构中存储的输入线路速度设置为speed。函数cfgetospeed()返回由tp指针指向的termios数据结构中所存储的输出线路速度值。函数cfsetospeed()将由tp指针指向的termios数据结构中存储的输出线路速度设置为speed。以上四个函数调用成功则返回0,发生错误则返回-1(3)、行控制函数行控制函数是用来查询和设置
7、各种与数据操作方式、时间等相关的特征。它们的定义如下:int tcdrain(int fd)int tcflush(int fd , int queue)int tcflow (int fd , int action)其中函数tcdrain()将使所有挂起的输出操作完成,并将一直保持等待,直到所有输出都已经写到文件描述字fd指向的文件为止。而函数tcflush()将刷新最新排在文件描述字fd队列中的输入和输出。参数queue用来指定要刷新的数据,如果queue取值为TCIFUSH,刷新接收到但尚未读取的输入数据;如果取值为TCOFLUSH,刷新被改写但尚未传送的输出数据;如查取值为TCILFL
8、USH,则两者都刷新。函数tcflow()是流量控制函数,用来启动或停止对文件描述字fd的数据传送和接收,参数action如果为TCOON,表示启动输出,为TCOOFF时表示停止输出;为TCION时启动输入;为TCIOFF时停止输入。2、串口通信类的封装在Qt开发软件中,没有专门用于对终端设备进行操作的类或控件,为了对终端设备进行操作,一种方法就是利用Linux底层终端函数直接在应用程序中对终端设备进行编程操作,但这样编程比较麻烦,而且无法实现代码重用。另一种方法就是将终端设备的操作函数封装成类的形式,这样不仅编程方便而且可以实现代码重用。下面具体介绍串口类的封装。在对串口进行编程操作时,可能
9、涉及到打开串口,设置串口参数、读取串口数据、向串口写数据及关闭串口等操作函数,因此在封装串口类时,必须具有以上几个操作函数。另外,希望在应用程序退出后不改变串口原参数,应对原参数进行保存,待关闭串口时恢复串口原参数。串口类的具体实现函数(1)、打开串口函数,返回操作标志int Serial:OpenSerialPort(const char *port)int fd=:open( port, O_RDWR | O_NOCTTY ,O_NONBLOCK); if ( fd0)return -1;/打开失败fcntl(fd, F_SETFL,FNDELAY);tcgetattr(fd , &ter
10、mios_old);/将原来串口参数保存到termios_old结构体中return fd;/返回成功操作标志(2)、关闭串口子程序,返回操作标志void Serial:CloseSerialPort(int serialfd)tcsetattr (serialfd, TCSADRAIN, &termios_old);/恢复串口参数int fd =:close (serialfd);/关闭串口return fd; /返回操作标志(3)、向串口写数据,返回写入串口的总长度int Serial:WriteSerialPort (int serialfd , const char *data, in
11、t datalength)int len, total_len;/定义写入长度和总长度变量for (total_len = 0 ; total_len 0) total_len += len;elsetcflush (serialfd, TCOFLUSH); break;return (total_len);/返回总长度(4)、设置串口参数,主要设置数据位、停止位、奇偶校验位、速度、超时设置等参数,返回操作标志。int Serial:SetSerialPara(int serialfd ,int databits , int stopbits ,char parity, int speed ,
12、 int vtime) bzero( &termios_new, sizeof(termios_new);/对新结构体termios_new清空 cfmakeraw(&termios_new); termios_new.c_cflag= speed;/设置串口波特率 termios_new.c_cflag |= CLOCAL | CREAD; termios_new.c_cflag &= CSIZE;switch (databits) /设置数据位 case 8:termios_new.c_cflag |= CS8; break; case 7:termios_new.c_cflag |= C
13、S7; break; case 6:termios_new.c_cflag |= CS6; break; case 5:termios_new.c_cflag |= CS5; break; default:termios_new.c_cflag |= CS8; break;switch (parity) /设置奇偶校验 case N: termios_new.c_cflag &= PARENB; break; case E:termios_new.c_cflag |= PARENB; termios_new.c_cflag &= PARODD; break; case O:termios_ne
14、w.c_cflag |= PARENB; termios_new.c_cflag |= PARODD; break; default:termios_new.c_cflag &= PARENB; break; switch (stopbits)/ 设置停止位 case 1:termios_new.c_cflag &= CSTOPB; break; case 2:termios_new.c_cflag |= CSTOPB; break; default:termios_new.c_cflag &= CSTOPB; break; termios_new.c_ccVTIME = vtime; /设置
15、超时时间 termios_new.c_ccVMIN = 0; tcflush (serialfd, TCIFLUSH);return tcsetattr(serialfd,TCSANOW,&termios_new); /立即更新设置参数 (5)、读取串口数据因为Linux操作系统采用一种特殊的设备文件系统devfs,使设备作为一种文件存在,因此读取设备数据同读取一般文件的方法相同,为了灵活使用已封装好的串口类,因此在封装串口类时,将读取串口数据的函数放在串口类外面,便于用户控制。读取串口数据的函数采用Linux底层函数read()进行操作,调用方法如下:int read (int fd, ch
16、ar *, int length )其中fd为设备号;char *为数据缓冲区;length每次读取数据的长度;返回值为实际读取数据的长度。3、串口通信源代码的编译(1)PC平台的串口通信程序编译l 将光盘提供的serialpc的源代码复制到硬盘中(假设将源码复制在/root/work目录下)l 对源码进行编译rootwork$cd serialpcrootserialpc$makel 在PC机上运行serial程序,运行界面如图12-1所示rootserialpc$./serial(2)、ARM平台的串口通信程序的编译l 将光盘提供的serialarm的源代码复制到硬盘中(假设将源码复制在/
17、root/work目录下)l 设置交叉编译工具参数(arm-linux-g+)l 修改Makefile文件修改LIBS = -L/usr/local/opencvlib_arm -lcxcore -lcv -lhighgui -lcvaux -ltsl 对源代码进行编译rootwork$cd serialarmrootworkexport QTDIR=/work/qt-2.3.7rootworkexport QPEDIR=/work/qtopia-1.7.0rootworkexport LD_LIBRARY_PATH=/work/qt-2.3.7/lib:$LD_LIBRARY_PATHroo
18、tworkexport TMAKEDIR=/work/tmake-1.11rootworkexport TMAKEPATH=/work/tmake-1.11/lib/qws/linux-arm-g+rootworkexport PATH=/work/tmake-1.11/bin:$PATHrootserialarm$makel 将编译好的程序serial下载到开发板的/usr/qpe/bin目录下l 在目标板上利用chmod命令修改serial的属性rootbin$ chmod 755 seriall 在开发板的/usr/qpe/application目录下新建serial.desktop文件(内容如下),或将serialarm目录下的serialarm.desktop文
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 屋面防水课件教学课件
- 2024年度大数据中心建设与运维合同
- 2024年度供应链管理与融资合同
- 2024年度CRM系统升级合同:增强销售合同管理功能
- 2024年度5G基站建设施工合同
- 2024年建筑工程环保分包合同
- 2024上海市室内装修合同协议书范本
- 2024年度企业合规性检查与咨询服务合同
- 2024年夫妻财产清算协议
- 2024天然气管网运营管理合同
- GB/T 19630.2-2005有机产品第2部分:加工
- GB/T 14074-2017木材工业用胶粘剂及其树脂检验方法
- 钢栈桥工程安全检查和验收
- FDS软件介绍及实例应用
- 无配重悬挑装置吊篮施工方案
- 强基计划解读系列课件
- 2022-2023学年山东省济南市高一上学期期中考试英语试题 Word版含答案
- 《24点大挑战》教学-完整版课件
- 胸痛的鉴别诊断与危险分层课件
- 税收法律制度增值税概述课件
- 洗胃法操作(课堂)课件
评论
0/150
提交评论