嵌入式串行端口程序设计实验
《嵌入式系统开发(Linux)》实验8 串口设备应用编程

《嵌入式系统原理及应用》实验报告班级:学号:姓名:日期:实验8 串口设备应用编程一、实验目的(1)编写一串口程序UART_test.c,向0号串口输出字符串。
二、实验设备硬件:PC机一台、mini2440开发板软件:Windows XP系统Vbox虚拟机,Ubuntu系统。
三、实验程序应用程序UART_test.c如下。
#include <fcntl.h>#include <stdio.h>#include <termio.h> //获得和修改终端参数#define DEVICE_NAME "/dev/ttySAC0" //串口1static int baud_rate= B115200; //B115200=115200 ;B1200=1200 ...int uart_init(void){int fd;struct termios my_uart; //建立驱动程序与用户之间的接口fd = open(DEVICE_NAME, O_RDWR|O_NONBLOCK); //打开串口1if (fd<0){return -1; //没有打开返回}tcgetattr(fd,&my_uart); //初始化,获取与终端相关的参数,返回的结果保存在termios结构体中tcflush(fd,TCIFLUSH); //刷新收到的数据但不读cfsetispeed(&my_uart,baud_rate); //设置终端的相关参数,设置波特率cfsetospeed(&my_uart,baud_rate); //一般,用户需要将输入输出函数的波特率设置成一样的my_uart.c_cflag |= CS8; //设置数据位my_uart.c_cflag &= ~PARENB; //无奇偶教验my_uart.c_cflag &= ~CSTOPB; //1位停止位my_uart.c_cflag |= CREAD; //允许接收my_uart.c_cflag |= CLOCAL; //保证程序不会成为端口的占有者if (tcsetattr(fd,TCSANOW,&my_uart) != 0){ //装载初始化参数.TCSANOW:改变的配置立即生效perror("Setup Serial!\n");close(fd);return -1;}return(fd);}int main(){int fd, i,j;char buf[1];if((fd = uart_init()) < 0){ //打开串口1,波特率为115200,8n1;printf(DEVICE_NAME" open err. \n");return -1;}for(i=0x20;i<='~';i++){。
嵌入式实验四 串行通信实验实验

嵌入式技术及应用实验四
实验四串行通信实验
一、实验目的
掌握单片机系统中串行端口的编程控制方法,学会实时程序的调试技巧。
二、实验原理
89C51单片机的串行端口结构上有两个物理上独立的接收、发送缓冲器SBUF,它们占用同一地址99H;接收器是双缓冲结构;发送缓冲器,因为发送时CPU是主动的,不会产生重叠错误。
单片机的串口可以由特殊功能寄存器SCON设置其工作方式,是否允许接受等,由PCON设置其波特率是否倍增。
发送和接收工作可以由中断完成,也可以不用中断,其中断矢量编号为4。
串口的处理主要涉及以下几个方面的内容:
串口初始化
发送程序设计(字节,字符串)
接收程序设计
是否用中断
三、实验内容
利用TX-1C实验板上及串口助手实现PC机与单片机的互相通信。
编写程序实现:当PC机给单片机发送一个字符后,单片机回传PC机发送给它的字符的十六进制数。
四、实验步骤
1、按实验内容要求在µ Vision中创建项目,编辑、调试、编译程序。
2、将编译生成的目标码文件(后缀为.Hex)下载到实验板上。
3、观察实验运行结果并记录。
1。
基于uClinux嵌入式操作系统的串行接口电路设计

基于uClinux嵌入式操作系统的串行接口电路设计摘要:近年,嵌入式系统的设计被应用到越来越多的领域,但由于嵌入式操作系统的应用是与硬件设计紧密相关的,因此,根据不同的应用环境,需对uClinux内核源码进行适当的修改。
文中根据实际工程设计案例,对串行接口电路的硬件设计与uClinux内核的裁剪进行了详细的描述,为uClinux操作系统在嵌入式领域的应用起到了一定的借鉴作用。
关键词:串口电路;uClinux;嵌入式系统;裁剪TheDisignofSericalCircuitBasedonuClinuxEmbeddedSystemHUQing-wu,YUYing(ShenyangAircraftDesignandResearchInstitute,Shenyang110035,China)Abstract:Recently,embeddedsystemisusedinmoreandmoredomain,butbecauseitisbasedonthehardwarecircuit,souClinuxkernelmustbeeditaccordingtodifferentenviroment.Thispape rbasedontheengineeringcase,elaboratehowtodesignhardwareandhowtoedittheuClinuxkernel.Thissol utionisusefulfortheuClinuxembeddedsystem’sengineerapplication.Keywords:Serialcircuit;uClinux;Embeddedsystem;Edit根据实验任务的需要,实现上位机与下位机之间的快速数据传输,构建了以S3C4510B芯片为核心,配以存储容量为2M的Flash存储器,存储容量为16M的SDRAM寄存器,成功的将以串行接口电路为信息交换窗口的嵌入式系统应用到实际工程中。
3嵌入式系统设计实验三(串行端口程序设计)

实验三串行端口程序设计3.1、实验目的了解在linux环境下串行程序设计的基本方法。
掌握终端的主要属性及设置方法,熟悉终端I /O函数的使用。
学习使用多线程来完成串口的收发处理。
3.2、实验内容读懂程序源代码,学习终端I /O函数的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。
3.3、预备知识有C语言基础。
掌握在Linux下常用编辑器的使用。
掌握Makefile 的编写和使用。
掌握Linux下的程序编译与交叉编译过程3.4、实验设备及工具硬件:UP-TECH S2410/P270 DVP嵌入式实验平台、PC机Pentium 500以上, 硬盘10G以上。
软件:PC机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX开发环境3.5、实验原理异步串行I /O方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。
数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。
接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。
为了恢复发送的信息,双方必须协调工作。
在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。
但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。
图3.1串行通信字符格式图3.1给出异步串行通信中一个字符的传送格式。
开始前,线路处于空闲状态,送出连续“1”。
传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。
每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。
后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。
也可以约定不要奇偶校验,这样就取消奇偶校验位。
最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。
大学嵌入式-串口实验报告框架

20XX年复习资料大学复习资料专业:班级:科目老师:日期:串口编程实验报告1)实验目的串行口是计算机一种常用的接口,具有连接线少,通讯简单,得到广泛的使用。
常用的串口是RS-232接口。
通过本次实验,主要对串口通讯的工作原理进行进一步了解,同时,进一步熟悉串口读写操作。
此外,在了解串口通信的同时,掌握一系列串口通讯调试时基本的检测方法。
2)串口工作原理串口是计算机上一种非常通用设备通信的协议(不要与通用串行总线Universa l Serial Bus或者USB混淆)。
大多数计算机包含两个基于RS232的串口。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。
同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。
尽管比按字节(b yte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。
它很简单并且能够实现远距离通信。
比如IEEE488定义并行通行状态时,规定设备线总常不得超过20XX米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达20XXXX00米。
典型地,串口用于ASCII码字符的传输。
通信使用3根线完成:(1)地线,(2)发送,(3)接收。
由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。
其他线用于握手,但是不是必须的。
串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。
对于两个进行通行的端口,这些参数必须匹配:a,波特率:这是一个衡量通信速度的参数。
它表示每秒钟传送的bit的个数。
例如300波特表示每秒钟发送300个bit。
当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。
这意味着串口通信在数据线上的采样率为4800Hz。
通常电话线的波特率为20XXXX400,28800和36600。
波特率可以远远大于这些值,但是波特率和距离成反比。
三、串行端口程序设计

三、串行端口程序设计1、实验目的了解在Linux 环境下串行程序设计的基本方法;掌握终端的主要属性及设置方法;熟悉终端IO 函数的使用;完成串口的收发处理。
2、实验内容读懂程序源代码,学习终端IO 函数tcgetattr(), tcsetattr(),tcflush()的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。
3、预备知识有 C 语言基础;掌握 Makefile 的编写和使用;掌握 Linux 下的程序编译与交叉编译过程4、实验设备及工具硬件:UP-TECHPXA270-S 嵌入式开发板、PC 机Pentumn500 以上, 硬盘10G 以上。
软件:PC 机操作系统REDHAT LINUX 9.0 +MINICOM + ARM-LINUX 开发环境5、实验步骤(1)、将E盘下的03_tty复制到D:\PXA270\Share下;将虚拟机的共享打开;(2)、主机A的虚拟机添加串口,主机A的COM1与实验箱ttyS1相连,实验箱ttyS0与另一台PC机B相连;(3)、将每台虚拟机linux的/up-techpxa270/exp/basic/03_tty删除,将两台主机的D:\PXA270\Share\03_tty复制到虚拟机linux下的/up-techpxa270/exp/basic下;(4)、进入/up-techpxa270/exp/basic/03_tty 目录,使用vi 编辑器或其他编辑器阅读理解serial_rcv和serial_send的源代码。
(5)、分别编译serial_rcv和serial_send下的源文件生成可执行文件。
(6)、自主选择作为发送端或接收端,并修改相应的代码。
(7)、挂载PC机B的/up-techpxa270/exp到开发板的/mnt/nfs。
(8)、在开发板和PC机Alinux下运行可执行程序,一个发送数据,一个接收数据。
(9)、修改程序,使发送端发送一个特定字符给接收端,且发送端回显一个字符或一句话。
嵌入式串行端口程序设计

串行端口程序设计实验日志实验题目:串行端口程序设计实验目的:了解在linux环境下串行程序设计的基本方法。
掌握终端的主要属性及设置方法,熟悉终端I /O函数的使用。
学习使用多线程来完成串口的收发处理。
实验步骤及结果:1、阅读理解源码进入/root/share/exp/basic/03_tty目录,使用vi编辑器或其他编辑器阅读理解源代码。
2、编译应用程序运行make产生term可执行文件[root@BC root]# cd /root/share /exp/basic/03_tty/[root@BC 03_tty]# makearmv4l-unknown-linux-gcc -c -o term.o term.carmv4l-unknown-linux-gcc -o ../bin/term term.o -lpthreadarmv4l-unknown-linux-gcc -o term term.o -lpthread[root@BC 03_tty]# lsMakefile Makefile.bak term term.c term.o tty.c注意:如果以前同学已经编译过,可以先用make clean 命令先来清楚以前编译过的文件,然后再make。
3、下载调试先像实验一一样,把串口、网线、电源线接好,在虚拟linux终端切换到minicom终端窗口,配置好实验箱的IP地址,然后使用NFS mount宿主机(虚拟linux)的/root/share 到目标板(实验箱)/host目录。
进入/host 的exp\basic\03_tty目录,运行term,观察运行结果的正确性。
依次命令如下[root@BC root]# minicom[/mnt/yaffs]ifconfig eth0 172.16.38.134[/mnt/yaffs] mount -t nfs 172.16.38.133:/root/share /host[/mnt/yaffs]cd /host/exp/basic/03_tty/[/host/exp/basic/03_tty]./termread modemsend data123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWX注意:如果在执行./term时出现下面的错误,可以通过我们前文提到的方法建立一个连接来解决。
串行接口实验报告

一、实验目的1. 理解串行接口的基本原理和功能。
2. 掌握串行接口的硬件连接和软件编程方法。
3. 学习使用串行接口进行数据传输。
4. 了解串行接口在实际应用中的重要性。
二、实验原理串行接口是一种数据传输方式,将数据按位顺序一位一位地传输。
与并行接口相比,串行接口具有传输距离远、传输速度快、抗干扰能力强等优点。
在串行接口中,数据以一定的速率、格式和协议进行传输。
串行接口的基本原理是:发送端将数据按位发送,接收端按照同样的速率和格式接收数据,并通过软件或硬件解码恢复原始数据。
串行接口的硬件连接主要包括发送端和接收端,其中发送端包括发送数据缓冲器、串行移位寄存器、时钟发生器等;接收端包括接收数据缓冲器、串行移位寄存器、时钟恢复电路等。
三、实验内容1. 硬件连接(1)根据实验要求,连接实验板上的串行接口电路。
(2)将实验板与计算机连接,确保通信线路畅通。
2. 软件编程(1)使用C语言编写串行接口发送和接收数据的程序。
(2)设置串行接口的波特率、数据位、停止位和校验位等参数。
(3)实现数据的发送和接收,并对接收到的数据进行处理。
3. 实验步骤(1)启动实验环境,编译并运行串行接口发送和接收数据的程序。
(2)在计算机上打开串行通信调试软件,如串口调试助手。
(3)设置调试软件的波特率、数据位、停止位和校验位等参数,确保与实验程序设置一致。
(4)在调试软件中发送数据,观察实验板接收到的数据是否正确。
(5)修改实验程序,调整发送和接收的数据,验证串行接口通信功能。
四、实验结果与分析1. 实验结果通过实验,成功实现了串行接口的发送和接收功能。
在计算机上发送数据,实验板接收到的数据与发送数据一致,说明串行接口通信功能正常。
2. 实验分析(1)在实验过程中,需要注意串行接口的波特率、数据位、停止位和校验位等参数设置,确保与接收端一致。
(2)在实际应用中,串行接口通信需要考虑抗干扰能力,可以通过采用差分传输、增加滤波电路等措施来提高通信质量。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2.3 串行端口程序设计一、实验目的¾了解在l inux 环境下串行程序设计的基本方法。
¾掌握终端的主要属性及设置方法,熟悉终端I /O 函数的使用。
¾学习使用多线程来完成串口的收发处理。
二、实验内容读懂程序源代码,学习终端I/O 函数的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。
三、预备知识¾有C语言基础。
¾掌握在L inux 下常用编辑器的使用。
¾掌握M akefile 的编写和使用。
¾掌握L inux 下的程序编译与交叉编译过程四、实验设备及工具硬件:UP-TECH S2410/P270 DVP 嵌入式实验平台、PC 机P entium 500 以上, 硬盘10G 以上。
软件:PC 机操作系统R EDHAT LINUX 9.0+MINICOM+ARM-LINUX 开发环境五、实验原理异步串行I/O 方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。
数据的各不同位可以分时使用同一传输通道,因此串行I/O 可以减少信号连线,最少用一对线即可进行。
接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。
为了恢复发送的信息,双方必须协调工作。
在微型计算机中大量使用异步串行I/O 方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。
但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。
图2.3.1 串行通信字符格式图2.3.1 给出异步串行通信中一个字符的传送格式。
开始前,线路处于空闲状态,送出连续“1”。
传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。
每个字符的数据位长可以约定为5位、6 位、7 位或8位,一般采用A SCII 编码。
后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。
也可以约定不要奇偶校验,这样就取消奇偶校验位。
最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5 位或2位的时间宽度。
至此一个字符传送完毕,线路又进入空闲,持续为“1”。
经过一段随机的时间后,下一个字符开始传送才又发出起始位。
每一个数据位的宽度等于传送波特率的倒数。
微机异步串行通信中,常用的波特率为50,95,110,150,300,600,1200,2400,4800,9600 等。
接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误:z奇偶错:在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。
z帧格式错:一个字符从起始位到停止位的总位数不对。
z溢出错:若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错。
每一种错误都会给出相应的出错信息,提示用户处理。
一般串口调试都使用空的MODEM 连接电缆,其连接方式如下:图2.3.2 实用R S-232C 通讯连线六、程序分析Linux 操作系统从一开始就对串行口提供了很好的支持,为进行串行通讯提供了大量的函数,我们的实验主要是为掌握在L inux 中进行串行通讯编程的基本方法。
本实验的程序流程图如下:图2.3.3 串口通讯实验流程图本实验的代码如下:#include <termios.h>#include <stdio.h>#include <unistd.h>#include <fcntl.h>#include <sys/signal.h>#include <pthread.h>#define BAUDRA TE B115200#define COM1 "/dev/ttyS0"#define COM2 "/dev/ttyS1"#define ENDMINITERM 27 /* ESC to quit miniterm */#define FALSE 0#define TRUE 1volatile 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 modem\n");while (STOP==FALSE){read(fd,&c,1); /* com port */write(1,&c,1); /* stdout */}printf("exit from reading modem\n");return NULL;}/*--------------------------------------------------------*/ void* send(void * data){int c='0';printf("send data\n");while (STOP==FALSE) /* modem input handler */{c++;c %= 255;write(fd,&c,1); /* stdout */usleep(100000);}return NULL; }/*--------------------------------------------------------*/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 );elsefd = open(COM1, O_RDWR ); //| O_NOCTTY |O_NONBLOCK);if (fd <0) {error(COM1);exit(-1);}tcgetattr(0,&oldstdtio);tcgetattr(fd,&oldtio); /* save current modem settings */tcgetattr(fd,&newstdtio); /* get working stdtio */newtio.c_cflag = BAUDRA TE | CRTSCTS | CS8 | CLOCAL | CREAD; /*ctrol flag*/ newtio.c_iflag = IGNPAR; /*input flag*/newtio.c_oflag = 0; /*output flag*/newtio.c_lflag = 0;newtio.c_cc[VMIN]=1;newtio.c_cc[VTIME]=0;/* now clean the modem line and activate the settings for modem */ tcflush(fd, TCIFLUSH);tcsetattr(fd,TCSANOW,&newtio); /*set attrib*/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);}下面我们对这个程序的主要部分做一下简单的分析¾头文件#include <stdio.h> /*标准输入输出定义*/#include <stdlib.h> /*标准函数库定义*/#include <unistd.h> /*linux 标准函数定义*/#include <sys/types.h>#include <sys/stat.h>#include <fcntl.h> /*文件控制定义*/#include <termios.h> /*PPSIX 终端控制定义*/#include <errno.h> /*错误号定义*/#include <pthread.h> /*线程库定义*/¾打开串口在L inux 下串口文件位于/dev 下,一般在老版本的内核中串口一为/dev/ttyS0 ,串口二为/dev/ttyS1,在我们的开发板中串口设备位于/dev/tts/下,因为开发板中没有t tyS0这个设备,所以我们要建立一个连接,方法如下:[/mnt/yaffs] cd /dev[/dev] ln –sf /dev/tts/0 ttyS0打开串口是通过标准的文件打开函数来实现的int fd;fd = open( "/dev/ttyS0", O_RDWR); /*以读写方式打开串口*/ if (-1 == fd){ /* 不能打开串口一*/ perror(" 提示错误!");}¾串口设置最基本的设置串口包括波特率设置,效验位和停止位设置。