串口通信实验
- 格式:doc
- 大小:41.50 KB
- 文档页数:4
串口通讯实验1 实验目的1、通过实验了解Linux 系统中EMPOSIII-sv210串行口功能单元;2、通过实验了解EMPOSIII-sv210 上Linux 的串行通讯。
2 实验设备硬件:EMPOSIII-sv210目标板,PC 机;软件:Linux 开发环境VMWare在XP系统安装虚拟机,通过虚拟机加载一个Linux系统开发环境Linux内核开发工具: 交叉编译器3 实验内容学习和掌握EMPOSIII-sv210串行通讯(UART)单元的相关寄存器功能。
学习和掌握Linux 的串行通讯单元的设置和基本操作。
4 实验原理和所有设备一样,Linux 也是通过设备文件来访问串口,即在访问时打开相应设备文件。
Sv210 处理器内部共有三个UART 单元,分别都提供了Linux 驱动,串行接口UART0、UART1 和UART2 分别对应设备文件/dev/ttyS0、/dev/ttyS1 和/dev/ttyS2。
1、串口操作函数open 用于打开串口设备close 用于关闭串口设备read 用于从串口设备上读取数据write 用于往串口设备上写数据ioctl 用于串口设备除读写外的控制操作2、串口设置函数串口通讯里termios.h 是个很重要的头文件。
分别使用tcgetattr()和tcsetattr()函数可以获取核设置串口属性。
tcgetattr (int __fd, struct termios *__termios_p)tcsetattr (int __fd, int __optional_actions, __const struct termios *__termios_p)其中termios 是结构termios 形式的数据结构,用于存放串口属性:struct termios{tcflag_t c_iflag; /* 输入模式标志*/tcflag_t c_oflag; /* 输出模式标志*/tcflag_t c_cflag; /* 控制模式标志*/tcflag_t c_lflag; /* 本地模式标志*/cc_t c_line; /* line discipline */cc_t c_cc[NCCS]; /* 控制特性*/speed_t c_ispeed; /* 输入速度*/speed_t c_ospeed; /* 输出速度*/};对串口属性的设置主要是对c_cflag 参数的不同位进行与或操作。
波特率设置使用函数cfsetispeed 核cfsetospeed,这两个函数分别设置入口端和出口端的速率,它们也是通过改变struct termios 结构实现。
cfsetispeed (struct termios *__termios_p, speed_t __speed)cfsetospeed (struct termios *__termios_p, speed_t __speed)设置波特率SerialPara.c_cflag |= Baud设置数据流控制termios.c_cflag &= ~CRTSCTS //不使用流控termios.c_cflag |= CRTSCTS //使用硬件流控termios.c_cflag |= IXON | IXOFF | IXANY //使用软件流控设置数据位termios.c_cflag &= ~CSIZE //无数据位termios.c_cflag |= CS8 //8位数据位termios.c_cflag |= CS7 //7位数据位... ...设置奇偶校验位termios.c_cflag &= ~PARENB //无校验位termios.c_cflag |= PARENB //奇校验位termios.c_cflag &= PARODDtermios.c_cflag |= PARENB //偶校验位termios.c_cflag &= ~PARODD5 实验步骤1. 准备实验环境使用EMPOSIII-sv210 目标板附带的串口线连接目标板上UART0 和PC 机串口COMx;使用EMPOSIII-sv210目标板附带的交叉网线连接目标板NET1 和PC 机网络接口。
2. 串口/网络设置在PC 机上运行Windows 附件中自带的超级终端串口通信程序(波特率115200、1 位停止位、无校验位、无硬件流控制);或者使用其它串口通信程序。
在PC 机上运行TFTP 服务器tftpd32.exe 选择工作目录为/home/app。
3. 实验操作过程1)编译应用程序2)下载测试程序编译好测试程序后,启动目标板的Linux 操作系统,通过以太网使用tftp 或ftp等途径下载刚编译好的test-uart 程序。
3)修改文件属性修改test-uart 程序的属性,使其拥有可执行属性,执行以下命令:#> chmod +x test-uart4. 观察实验结果执行下载到Linux 系统的test-uart 测试程序,通过串口输入字符,观察返回结果:#> ./test-uart按下Ctrl+C 或输入Enter 键后退出测试。
5. 完成实验练习题理解和掌握实验后,完成实验练习题。
6 实验参考程序/*********************************************************************文件:test-uart.c*作者:Embest R.X.Huang 2005.6.20*说明:示例程序, Linux 下的串口通讯应用程序-1 2 3 -*修改:*注释:********************************************************************//* Uart open and setting fuction */int uart_open(char *Port, int Baud){struct termio SerialPara;int i, fd;/* We want to open the port in nodelay mode */if ((fd = open (Port, O_RDWR)) == -1) {#ifdef UART_DEBUGfprintf (stderr, "uart_open: Cannot open port %s\n", Port);#endifreturn -1;}/* Now change the rest of the parameters - non-canonical input, etc. *//* 获取内核termios 参数,并存放到SerialPara 中*/if (ioctl (fd, TCGETA, &SerialPara) == -1) {#ifdef UART_DEBUGfprintf (stderr, "uart_open: Cannot ioctl(TCGETA) on port %s. Errno = %d\n", Port, errno);#endifreturn -1;}SerialPara.c_cflag = Baud | CS8 | CLOCAL | CREAD | HUPCL;SerialPara.c_lflag &= ~ICANON;SerialPara.c_lflag = 0;SerialPara.c_oflag = 0;SerialPara.c_iflag = IGNBRK | IGNPAR;for (i = 0; i < NCC; i++)SerialPara.c_cc[i] = (unsigned char) 0;SerialPara.c_cc[VMIN] = (unsigned char) 0;SerialPara.c_cc[VTIME] = (unsigned char) TIMEOUT;/* 把当前SerialPara 设置更新到内核termios 参数*/if(ioctl (fd, TCSETA, &SerialPara) == -1) {#ifdef UART_DEBUGfprintf (stderr, "uart_open: Cannot ioctl(TCSETA) on port %s. Errno = %d\n", Port, errno);#endifreturn -1;}return fd;}/* Main test program */int main(void){char buf[] = "Write Something to Test...\n";static char *driver = "/dev/ttyS0";…// 略fd = uart_open(driver,B115200);/* print string to UARTx */write(fd,buf,strlen(buf));/* Wait input through UART0, */…// 略read(fd,&ch,1);printf("ch = %c\n",ch);…// 略printf("end.\n");return 0;}7 实验要求及结果分析1、所有实验结果截图;2、修改test-uart.c 实验测试程序,改变串口0 波特率后重新编译,下载到目标板上观察运行结果。
8 实验体会通过实验了解Linux 系统中EMPOSIII-sv210串行口功能单元以及EMPOSIII-sv210 上Linux 的串行通讯。