基于Linux环境下串口通信的应用设计

发布者:温文儒雅最新更新时间:2014-08-14 来源: dzsc关键字:Linux  串口通信  s3c2440 手机看文章 扫描二维码
随时随地手机看文章

  0 引言

  数据采集系统中由于单片机侧重于控制,数据处理能力较弱,对采集的数据进行运算处理比较繁琐,如果通过串口与上位机通信,利用上位机强大的数据处理能力和友好的控制界面对数据进行处理和显示则可以提高设计效率。串口通信以其简单的硬件连接,成熟的通信协议,成为上下位机之间通信的首选。移植了Linux 操作系统的s3c2440 可以在Linux 环境下操作串口,降低了串口操作的难度,可以使开发者集中精力开发大规模的应用程序,而不必在操作底层设计上耗费时间。

  1 硬件连接

  s3c2440 是三星公司生产的基于ARM9 核的处理器,采用3.3 V 电压供电; C8051Fxxx 系列单片机是美国CYGNAL 公司推出的与8051 兼容的高性能高速单片机,采用3.3 V 电压供电。两者供电电压相同,所以进行串行口通信时不需要进行电平转换。硬件连接采用最常用的TXD,RXD,GND 三线连接方式。注意采用交叉连接方式,即TXDRXD,RXDTXD.

  2 Linux 下串口通信

  2.1 Linux 下串口设备描述

  s3c2440 上移植了Linux 2.6.32 操作系统,加载了s3c2440 的串口驱动程序,通过Linux 提供的串口操作函数和文件操作函数把对串口的操作等同于文件操作,降低了串口的操作难度,提高了效率。在程序中设备和文件都是通过文件描述符来操作的,文件描述符在Linux 内核中是一个非负整数。Linux 设备文件都存放在“/dev”目录下,串口也不例外,在/dev 中可以找到串口对应的设备文件,本文对应的串口1 的设备文件路径是“/dev /ttySAC1”.

  2.2 Linux 下串口通信程序设计

  串口通信需要设置一些参数,如波特率、数据位、停止位,输入输出方式等。这些参数都存在于Linux提供的termios 结构中,该结构是Linux 系统用于查询和操作各个终端的一个标准接口,定义在头文件< ter-mios. h > 中,如下所示:

  STruct termios{tcflag_t c_iflag; /* 输入标志* /tcflag_t c_oflag; /* 输出标志* /tcflag_t c_cflag /* 控制标志* /tcflag_t c_lflag /* 本地标志* /cc_t c_cc[NCCS]; /* 控制特性* /} ;Linux 串口通信步骤可分为以下三步,操作流程如图1 所示。

  第一步: 打开串口调用open( ) 函数打开串口设备文件,若出错则返回- 1,成功则返回文件句柄。

  #define UART1 /dev /ttySAC1int fd;fd = open( “UART1”,O_RDWR) /* 以可读可写方式打开串口设备* /

  第二步: 设置串口属性函数tcsetattr ( ) 可以设置串口的结构属性,tcgetatt( ) 可以得到串口的结构属性。在termios 结构中,? &=s ?最重要的是c_cflag,用户通过对其进行赋值可以实现串口波特率、数据位、停止位、奇偶校验位等参数的设置。c_cc 数组中的两个变量VMIN 和VTIME 判断是否返回输入,c _cc[VTIME]设定字节输入时间计时器,c _cc[VMIN]设定满足读取功能的最低接收字节数。这两个变量的值要设定合理,才能保证串口的通信成功率。

  int set_attr( int fd){struct termios newtio,oldtio;tcgetattr( fd,&oldtio) ;cfsetispeed( &newtio,B9600) ; /* 设置读波特率为9600* /cfsetospeed( &newtio,B9600) ; /* 设置写波特率为9600* /memset( &newtio,0, sizeof( newtio) );newtio. c_cflag = CS8 | CREAD; /* 设置数据位为8 位并且使能接收* /newtio. c_cflag & = ~ PARENB; /* 不进行奇偶校验* /newtio. c_cflag & = ~ CSTOPB; /* 1 位停止位* /newtio. c_cc[VMIN]= 1; /* 当接收到一个字节数据就读取* /newtio. c_cc[VTIME]= 0; /* 不使用计时器* /tcflush( fd,TCIOFLUSH) ; /* 刷清输入输出缓冲区* /tcsetattr( fd,TCSANOW,&newtio) /* 使设置的终端属性立即生效* /}

  第三步: 串口读写,串口关闭设置完通信参数后,就可以用标准的文件读写命令read( ) 和write( ) 操作串口了。最后在退出之前,用close( ) 函数关闭串口。

  void rd_wr( ){write( fd,wbuf,10) ;usleep( 500000) ; /* 延时50 ms 等待下位机发送数据* /read( fd, rbuf,10) ;printf( “read string is %s ”, rbuf) ;}

  3 通信程序设计

  ARM 与单片机的串口通信程序包括两方面: 一方面是作为上位机的ARM 的串口通信程序,另一方面是作为下位机的单片机的串口通信程序。在通信之前必须制定合理的通信协议以保证通信的可靠性和成功率。现约定双方通信协议如下:

  ( 1) 波特率为9600 bit /s,帧格式为1 - 8 - N - 1( 1 位起始位,8位数据位,无奇偶校验,1位停止位) ;( 2) 由于上位机ARM 的速度远远高于下位机单片机的速度,所以采用上位机主动联络,下位机等待的方式。在数据传送前ARM 先发送联络信号/0xaa,单片机收到后回答一个/0xbb,表示可以发送,否则继续联络;( 3) 单片机端可以有中断和查询方式收发串口数据。本文采用中断方式;( 4) ARM 处理器s3c2440 采用UART1 和单片机通信,UART0 则作为s3c2440 终端控制台。

  3.1 上位机ARM 的通信程序设计

  由于s3c2440 移植了定制和裁剪后的Linux2.6.32内核的操作系统,对串口的操作采用上述的Linux 下串口操作方法,程序流程图如图2 所示。[page]

  3.2 下位机单片机的通信程序设计

  选用C8051F021 的定时器T1 作为波特率发生器,晶振采用11.0592 MHz,定时器工作在方式2,计数初值为0xfd,串口工作在串行方式1( 1 - 8 - N - 1) ,采用中断方式收发数据。

  4 结束语

  随着近年来嵌入式Linux 在国内的应用范围日益壮大,基于ARM 平台的嵌入式Linux 设备也将会越来越多地用在数据采集中作为上位机对数据进行处理、显示、存储、发送。本文所介绍方案适用于大多数场合Linux 下ARM 和单片机的串口通信设计,设计人员只需根据自己的实际需要修改或重新制定通信协议即可。另外需要注意的是由于上位机ARM 的速度比单片机快很多,所以一次不能发送过多的数据,否则极有可能使发送缓冲区溢出而出现数据丢失的现象,开发人员要根据通信双方设备的状况选择合适的帧长度,以达到最佳的传输状态。

关键字:Linux  串口通信  s3c2440 引用地址:基于Linux环境下串口通信的应用设计

上一篇:应用于实验柜的排风控制系统的方案
下一篇:一种ARM处理器非特定人语音识别系统的设计方案

推荐阅读最新更新时间:2024-03-16 13:39

S3C2440与SDRAM的地址连线分析
该文章讲述了S3C2440与SDRAM的地址连线分析. S3C2440有27根地址线ADDR ,8根片选信号ngcs0-ngcs7,对应bank0-bank7,当访问bankx的地址空间,ngcsx引脚为低电平,选中外设。 2^27=2^7 * 2^10 * 2^10 = 128Mbyte 8*128Mbyte = 1Gbyte 所以S3C2440总的寻址空间是1Gbyte。 市面上很少有32位宽度的单片SDRAM,一般选择2片16位SDRAM扩展得到32位SDRAM. 选择的SDARM是HY57V561620F,4Mbit * 4bank *16,共32Mbyte。 首先了解下SDRAM的寻址原理。 SDRAM
[单片机]
<font color='red'>S3C2440</font>与SDRAM的地址连线分析
S3C2440—11.und异常
1 未定义指令 先看一下ARM中指令的格式: 注意:这个表的最上面的对应的位是从高到低的,所以0Xdeadc0de 就是一条未定义指令(方便易懂) 2 中断向量表 未定义异常,首先要产看中断向量表: 在板子上电之后,CPU从0地址开始执行,首先执行复位Reset操作,而且触发异常之后会跳转至相应的地址去进入异常处理程序,所以我们要在0地址开始按照中断向量表编写相应的异常处理程序的指引,如下: .text .global _start _start: /* 异常向量表 */ bl reset /* 0X0 Reset 上电复位,从0地址开始执行程序,依次:关闭看门狗、配置时钟系统、初始化sdram、拷贝代码
[单片机]
<font color='red'>S3C2440</font>—11.und异常
Linux驱动:s3c2440 lcd 驱动分析--终结篇
一,前言 s3c2440 lcd 驱动分析,涉及到的内容有,LCD图像显示原理、s3c2440的LCD控制器的操作、LCD驱动使用平台总线-设备-驱动模型的实例、LCD相关参数的设置、fb字符设备驱动实例、framebuffer的注册和管理、以及一次LCD显示的完整过程分析。 二,LCD原理和硬件分析 2.1 LCD原理解析 SDRAM:在SDRAM中申请了一块连续的内存作为LCD显示数据的存储,叫做显存(framebuffer)。 LCD控制器:LCD控制器通过硬件电路和LCD屏连接。 LCD屏:作为一个外设通过硬件电路和MCU(引脚配置为LCD引脚)连接。 图像在LCD屏上显示,可以看成是LCD控制器先从显存中取出一帧
[单片机]
基于Linux和MiniGUI的某型指控终端人机接口设计
简介: 一个车载指控平台的功能主要体现在以下几个方面:监控、显示车辆的技术状态;车际间的指控、通信;车辆的定位、导航;各种文电处理等。本文将介绍一个基于ARM和MiniGUI的车载指控系统人机接口部分的设计,这个系统初步实现了上述车载指控平台的主要功能。 l 软硬件的选型 受车辆内部空间的限制,指挥控制终端必须做到小型化,嵌入式。ARM作为一种已经在多个领域得到非常广泛应用的架构,这里采用它是一个很好的选择。该课题选择在国内有着较广泛市场的SAMSUNG公司的S3C2410芯片作为CPU。S3C2410芯片主要应用于手持设备或者其他对功耗、成本、性能有较高要求的场合。为了降低整机成本,该芯片内置了各16 KB的指令和数据缓存、
[单片机]
基于<font color='red'>Linux</font>和MiniGUI的某型指控终端人机接口设计
【ARM】制作Linux 文件系统
#1从零开始由busybox 建立文件系统 ##1.1文件系统在LINUX 中的结构图 ##1.2编译好kernel 编译linux kernel的具体操作在之前文章讲过,下面简要提示一下。 修改编译器PATH,指定寻找路径。 cd kernel-2.6.13 (进入内核目录) cp config_n35 .config make (编译内核,假设已经设置好了) cd arch/arm/boot (进入生成的zImage 目录) mkimage.sh (产生有uboot 可以引导的uImage 内核文件) ##1.3Uboot 状态下显示的环境设置信息 setenv bootcmd tftp 30008000 uimage;b
[单片机]
【ARM】制作<font color='red'>Linux</font> 文件系统
S3C2440上touchscreen触摸屏驱动
一、开发环境 主 机:VMWare--Fedora 9 开发板:Mini2440--64MB Nand, Kernel:2.6.30.4 编译器:arm-linux-gcc-4.3.2 二、前提知识 1、Linux输入子系统(Input Subsystem): 在Linux中,输入子系统是由输入子系统设备驱动层、输入子系统核心层(Input Core)和输入子系统事件处理层(Event Handler)组成。其中设备驱动层提供对硬件各寄存器的读写访问和将底层硬件对用户输入访问的响应转换为标准的输入事件,再通过核心层提交给事件处理层;而核心层对下提供了设备驱动层的编程接口,对上又提供了事件处理层的编程接口;而事件处理层
[单片机]
<font color='red'>S3C2440</font>上touchscreen触摸屏驱动
基于S3C2440的嵌入式Linux驱动——Framebuffer子系统解读
本文将介绍Framebuffer子系统 目标平台:TQ2440 CPU:s3c2440 LCD设备:3.5英寸,分辨率320X240 1. 概述 Framebuffer,中文名字是帧缓冲,这个帧也就是一副图像所需要的数据。因此,帧缓冲其实就是LCD设备的驱动程序。Linux中,framebuffer子系统框架如下: 核心层的代码以fbmem.c为主,核心层包括许多与具体硬件无关的代码,并且提供了API给用户空间。用户空间使用系统调用,系统调用会使用相应的API函数,最后会调用驱动层实现功能。对于不同的设备,驱动层的代码将有所不同。 接下来的内容中,首先给出framerbuffer使用的数据结构;随后简单描述framerb
[单片机]
基于ARM9的嵌入式Linux代码移植
0 引言 随着计算机技术、通信技术以及Internet的飞速发展。嵌入式系统已得到越来越广泛的应用。与此同时,嵌入式系统的复杂性也在不断增加,嵌入式操作系统已经成为其中最重要的组成部分。目前,市场上存在着众多的嵌入式操作系统,而在这些系统之中,兼有Linux和嵌入式优点的嵌入式Linux操作系统,凭借其在结构清晰、源代码开放性、裁剪性好,开发与使用均易实现等方面的优势,拥有巨大的市场前景和商业机会。当前嵌入式Linux的一个热点应用就是将Linux内核移植到一些典型的微控制器和微处理器上,提供操作系统层面支持,以实现嵌入式系统用软件的开发。 此研究基于Linux 2.6内核的嵌入式Linux系统,分析了所面临的理论问题、关
[单片机]
基于ARM9的嵌入式<font color='red'>Linux</font>代码移植
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved