嵌入式实验2_嵌入式实验二

2020-02-28 其他范文 下载本文

嵌入式实验2由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“嵌入式实验二”。

南昌航空大学实验报告

二0一一 年 10月 16日

课程名称: 嵌入式系统 实验名称: 串行端口程序设计 班 级: 080611 学生姓名: 曹启斌 学号: 08061107 指导教师评定: 签名:

一、实验目的了解在linux环境下串行程序设计的基本方法。掌握终端的主要属性及设置方法,熟悉终端IO函数的使用。3 学习使用多线程来完成串口的收发处理。

二、实验内容

读懂程序源代码,学习终端IO函数tcgetattr(), tcsetattr(),tcflush()的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。

三、预备知识

1、有C语言基础。

2、掌握在LINUX下常用编辑器的使用。

3、掌握Makefile 的编写和使用。

4、掌握Linux下的程序编译与交叉编译过程

四、实验设备及工具

硬件:UP-NETARM2410-S嵌入式实验仪,PC机pentumn500以上, 硬盘40G以上,内存大于128M。

软件:PC机操作系统REDHAT LINUX 9.0 +MINICOM + AMRLINUX开发环境

五、实验原理

Linux 操作系统从一开始就对串行口提供了很好的支持,为进行串行通讯提供了大量的函数,我们的实验主要是为掌握在LINUX中进行串行通讯编程的基本方法。

1.程序流程图

程序流程图如图2-3所示:

图2-3 程序流程图

2串口操作需要的头文件

#include /*标准输入输出定义*/ #include /*标准函数库定义*/ #include /*linux标准函数定义*/ #include #include #include /*文件控制定义*/ #include /*PPSIX 终端控制定义*/ #include /*错误号定义*/ #include

/*线程库定义*/ 3打开串口

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

int fd;/*以读写方式打开串口*/ fd = open(“/dev/ttyS0”, O_RDWR);if(-1 == fd){ perror(“ 提示错误!”);}

4设置串口

最基本的设置串口包括波特率设置,效验位和停止位设置。串口的设置主要是设置 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 */ };设置这个结构体很复杂,可以参考man手册或者由赵克佳、沈志宇编写的《UNIX程序编写教程》,我这里就只考虑常见的一些设置:

波特率设置:

下面是修改波特率的代码: struct termios Opt;tcgetattr(fd, &Opt);cfsetispeed(&Opt,B19200);/*设置为19200Bps*/ cfsetospeed(&Opt,B19200);tcsetattr(fd,TCANOW,&Opt);校验位和停止位的设置: 无效验 8位

Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS8;奇效验(Odd)7位

Option.c_cflag |= ~PARENB;Option.c_cflag &= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;偶效验(Even)7位

Option.c_cflag &= ~PARENB;Option.c_cflag |= ~PARODD;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= ~CSIZE;Option.c_cflag |= ~CS7;Space效验 7位

Option.c_cflag &= ~PARENB;Option.c_cflag &= ~CSTOPB;Option.c_cflag &= &~CSIZE;Option.c_cflag |= CS8;设置停止位:

1位:

options.c_cflag &= ~CSTOPB;2位: options.c_cflag |= CSTOPB;需要注意的是,如果不是开发终端之类的,只是串口传输数据,而不需要串口来处理,那么使用原始模式(Raw Mode)方式来通讯,设置方式如下:

options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);/*Input*/ options.c_oflag &= ~OPOST;/*Output*/ 5读写串口

设置好串口之后,读写串口就很容易了,把串口当作文件读写就可以了。发送数据:

char buffer[1024];int Length=1024;int nByte;nByte = write(fd, buffer ,Length)读取串口数据:

使用文件操作read函数读取,如果设置为原始模式(Raw Mode)传输数据,那么read函数返回的字符数是实际串口收到的字符数。

可以使用操作文件的函数来实现异步读取,如fcntl,或者select等来操作。char buff[1024];int Len=1024;int readByte = read(fd, buff, Len);6关闭串口

关闭串口就是关闭文件。close(fd);7空MODEM通讯连接电缆

一般进行串口调试使用空MODEM连接电缆,其接线方式如下图2-4所示:

图2-4 实用RS-232C通讯连线

六、实验步骤

1.2.3.4.进入expbasic3_tty目录,使用vi编辑器或其他编辑器阅读理解源代码。运行make产生term可执行文件

切换到minicom终端窗口,使用NFS mount开发主机的/arm2410到/host目录。

进入expbasic3_tty目录,运行term,观察运行结果的正确性。由于内核已经将串口1 作为终端控制台,所以可以看到term发出的数据,却无法看到开发主机发来的数据,可以使用另外一台主机连接串口2进行收发测试。5.修改一些参数,再次运行调试,加深对串口编程的理解。6.参考源代码:

#include #include #include #include #include #include

#define BAUDRATE B115200 #define COM1 “/dev/ttyS0” #define COM2 “/dev/ttyS1” #define ENDMINITERM 27 /* ESC to quit miniterm */ #define FALSE 0 #define TRUE 1

volatile int STOP=FALSE;volatile int fd;void child_handler(int s){ printf(“stop!!n”);STOP=TRUE;}

/*-------------------------*/ void* keyboard(void * data){ int c;for(;;){

c=getchar();if(c== ENDMINITERM){ STOP=TRUE;break;} }

return NULL;} /*-------------------------*/ /* modem input handler */ void* receive(void * data){ int c;printf(“read modemn”);while(STOP==FALSE){ read(fd,&c,1);/* com port */ write(1,&c,1);/* stdout */ } printf(“exit from reading modemn”);return NULL;} /*-------------------------*/ void* send(void * data){ int c='0';printf(“send datan”);while(STOP==FALSE)/* modem input handler */ { c++;c %= 255;write(fd,&c,1);/* stdout */ usleep(100000);} return NULL;/* wait for child to die or it will become a zombie */ } /*-------------------------*/ int main(int argc,char** argv){

struct termios oldtio,newtio,oldstdtio,newstdtio;struct sigaction sa;int ok;pthread_t th_a, th_b, th_c;void * retval;

if(argc > 1)fd = open(COM2, O_RDWR);else

fd = open(COM1, O_RDWR);//| O_NOCTTY |O_NONBLOCK);

if(fd

sa.sa_handler = child_handler;sa.sa_flags = 0;sigaction(SIGCHLD,&sa,NULL);/* handle dying child */ pthread_create(&th_a, NULL, keyboard, 0);pthread_create(&th_b, NULL, receive, 0);pthread_create(&th_c, NULL, send, 0);pthread_join(th_a, &retval);pthread_join(th_b, &retval);pthread_join(th_c, &retval);

tcsetattr(fd,TCSANOW,&oldtio);/* restore old modem setings */ tcsetattr(0,TCSANOW,&oldstdtio);/* restore old tty setings */ close(fd);exit(0);}

七、心得体会

通过本次实验,我了解在linux环境下串行程序设计的基本方法,对它的操作有了更深入的认识。我了解到了实践的重要性。概念固然重要,但是只有用软件真正地实践过,才能发现问题,分析问题,最终解决问题。

《嵌入式实验2.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
嵌入式实验2
点击下载文档
相关专题 嵌入式实验二 嵌入式 嵌入式实验二 嵌入式
[其他范文]相关推荐
    [其他范文]热门文章
      下载全文