毕业论文格式范文网,免费提供各类本科、专科、研究生、硕士毕业论文模板素材提纲范文。免费分享各类学术论文、开题报告、综述论文等。如需论文写作服务,请联系微信:ym5152529。

首页 >  工学论文 正文

Linux下ARM和CC2530的串口通信【通信学论文】

毕业论文范文网 2020-08-23 01:21:47 工学论文 349℃
Linux下ARM和CC2530的串口通信

  中图分类号:TP39 文献标识码:A 文章编号:2095-1302(2016)01-00-03

  0 引 言

  由于ARM嵌入式系统具有体积小、功耗低、噪音低、成本低、数据处理能力强等优点,被广泛用作自动控制、智能终端等设备的硬件平台。通常ARM嵌入式平台是在操作系统的支持下工作,常见的操作系统有Wince、uCOS、uCLinux、嵌入式Linux等,其中,Linux操作系统具有稳定性高、源代码公开等优点,而被广泛用于工业控制、机器人、物联网等领域。Linux-ARM嵌入式系统是Linux操作系统与ARM硬件平台的结合,兼具了Linux操作系统和ARM嵌入式的优点,是开发智能控制设备的常用组合。物联网是继计算机技术、互联网技术之后世界信息产业发展的新浪潮,它所包含的无线传感网具有使用、安装便利的特点。基于IEEE 802.15.4协议的ZigBee技术是随着物联网的兴起而发展起来的一种无线传感网组网方案[1],基于该技术,Ti公司推出了系列网络处理器芯片,其中CC2530是Ti公司推出的第二代网络处理芯片,集成了RF收发器、增强型8051控制器、可编程存储器等模块,具有更卓越的RF性能,更小的封装尺寸和IR产生电路,并支持多种协议如ZigBee PRO、ZigBee RF4CE等[2],由其组成的无线传感网可用于居家、消费类电子产品、工业、医疗等领域。虽然CC2530所采用的CPU技术成熟,有一定的计算、控制等能力,但在控制通信较复杂的场合下不能满足需求,因而需要性能更强的处理器作为上位机,如Linux-ARM嵌入式系统。由此可见,采用Linux-ARM为上位机、CC2530为下位机是一种优秀的智能无线网络组网方案。在由Linux-ARM和CC2530组成的网络系统中,Linux-ARM和CC2530间的通信是该组网方案必须解决的一项技术问题。Linux-ARM嵌入式系统[3]和CC2530均拥有串口通信方式,这可成为两者传递信息的通道。基于以上分析,本文设计了Linux系统下ARM Cortex A8的串口通信;使用ZStack协议栈开发了CC2530的串口通信,实现了Cortex A8和CC2530间的通信。

  1 Linux-ARM串口通信

  S5PV210AH是三星基于ARM Cortex A8内核生产的一款处理器,主频达1 GHz,被广泛应用于数据采集、图像处理、智能终端、自控设备、物联网网关等方面。在Linux-ARM系统中,Cortex A8的串口通信是在Linux操作系统的控制下完成的,其程序流程图如图1所示。

  图1 Linux下ARM Cortex A8串口通信流程图

  为在Linux-ARM系统中进行串口通信,首先需打开串口设备,而Linux系统对设备的管理是通过文件实现的,对串口的操作等同于对文件的操作。Linux系统中的设备管理文件存放在/dev目录中,串口的文件名一般为ttyS*,其中*表示不同的串口,是从0开始的整数。串口可通过open()函数打开: fd=open(“/dev/ttyS0”, O_RDWR),语句中的参数ttyS0表示串口1,O_RDWR表示可对串口进行读写操作,fd是open()函数的返回值,称为文件描述符,在随后的操作中,Linux系统的内核可使用该文件描述符来访问文件。如果fd=-1则表示打开失败,程序通过return返回系统,若打开成功则进行串口参数设置。串口参数设置过程如图2所示,首先是获取串口参数,而后根据需要进行参数配置,最后对串口进行参数设置,该过程主要涉及到的有tcgetattr()函数、termios结构体和tcsetattr()函数。

  图2 Linux-ARM的串口设置过程

  在串口参数配置的过程中,termios结构体是完成配置的关键,该结构体包含在termios.h头文件中,其内容如下:

  struct termios

  {

  unsigned short c_iflag;输入模式标志

  unsigned short c_oflag;输出模式标志

  unsigned short c_cflag;控制模式标志

  unsigned short c_lflag;本地模式标志

  unsigned short c_line;线路规则

  unsigned short c_cc[NCC]; 控制字

  }

  串口的详细配置步骤如下:

  (1)定义一个termios结构体变量opt,使用tcgetattr()函数把串口参数提取到opt中,相应的语句是tcgetattr(fd, &opt)。为避免打开串口后写入缓存数据的干扰,可使用tcflush(fd, TCIOFLUSH)语句清除缓存中的数据。

  (2)串口参数的基本配置包括波特率、校验位、停止位、流控等。在配置程序中可使用cfsetispeed(&opt, B115200)和cfsetospeed(&opt, B115200)分别把串口通信的输入输出波特率设为115 200 b/s;而数据位、奇偶位、停止位则是通过c_cflag参数的设置实现:可使用opt.c_cflag &=~CSIZE和opt.c_cflag |=CS8把数据位设置为8位;使用opt.c_cflag &=~PARENB和opt.c_iflag &=~INPCK让串口通信时不采用奇偶校验;使用opt.c_cflag &=CSTOPB使串口有1位停止位。   (3)串口参数设置。该过程是把opt结构体中的参数设置到串口中,可调用tcsetattr(fd, TCSANOW, &opt)函数,其中的参数TCSANOW表示不等数据传输完毕就立即改变串口属性。如果参数设置成功,tcsetattr()函数的返回值为0,据此值可做以下判断:只有返回值为0时才进入串口通信的下一步,若返回值不为0则返回到操作系统。

  串口参数设置完成后,串口即可进入数据收发状态。数据的接收可调用read(fd, RD_buff, RD_buff_size)函数进行,该函数表示从fd所指示的文件中读取RD_buff_size个字节到RD_buff缓冲区中。数据的发送可使用write(fd, WR_buff, WR_buff_size)函数,是从WR_buff所指的缓冲区输出WR_buff个字节到fd所指示的文件中。数据收发任务完成后,使用close(fd)函数关闭串口。

  通信中的Cortex A8是由无线龙科技有限公司提供的,程序的开发是在Linux环境中进行的,并使用arm-Linux-gcc进行交叉编译[4],在XP操作系统中通过PC机的超级终端下载到Cortex A8中。

  2 CC2530串口通信

  CC2530的开发是在IAR集成环境中使用ZStack 2.5.1协议栈进行的,ZStack的目录结构如图3所示。

  图3 ZStack协议栈的目录结构

  ZStack是从ZMain层中的main()函数开始执行的,main()函数含有系统初始化函数osal_init_system(),该函数可完成新任务的登记。在osal_init_system()中找到osalInitTasks(),并在该函数的最后添加新任务的初始化函数SampleApp_Init(taskID),SampleApp_Init()的函数体定义在SampleApp.c文件中,可在SampleApp_Init()函数中添加串口初始化函数调用语句和串口任务登记函数调用语句。协议栈的工作机制是一种轮询方式,当系统进入运行函数osal_start_system()后,在do while循环体的作用下开始轮询。当协议栈的操作系统抽象层(OSAL)在查看taskEvents的过程中发现有事件发生,会记下该事件的idx值,而后通过events=(tasksArr[idx])(idx, events)语句调用登记在tasksArr[]数组中的函数指针,随后进入到任务处理函数。由此可见在添加新任务时,需在tasksArr[]数组的最后添加新任务的函数指针,并在SampleApp.c文件中修改相应的函数体。

  本文采用的CC2530是由网蜂科技提供的ZigBee开发套件,在串口通信开发的过程中,CC2530被定义为协调器,其开发步骤分为如下三步:

  (1)串口初始化。找到应用层(App)中的操作系统接口文件OSAL_SampleApp.c,并在该文件中找到osalInitTasks()的函数体,osalInitTasks()中的最后一个函数SampleApp_Init(taskID)被作为串口通信任务。在SampleApp.c中找到SampleApp_Init()的函数体,并添加函数调用语句MT_Uartinit(),如下所示:

  void SampleApp_Init( uint8 task_id )

  {

  SampleApp_TaskID=task_id;

  SampleApp_NwkState=DEV_INIT;

  SampleApp_TransID=0;

  MT_Uartinit();

  MT_UartRegisterTaskID(task_id);

  ……

  }

  MT_UartInit()函数位于MT目录下MT_UART.c文件中,是串口初始化函数,可完成CC2530的串口参数设置。根据uartConfig.baudRate=MT_UART_DEFAULT_BAUDRATE语句找到MT_UART_DEFAULT_BAUDRATE的位置,并修改为#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_115200,使串口的波特率为115 200 b/s;根据语句uartConfig.flowControl=MT_UART_DEFAULT_OVERFLOW查找到MT_UART_DEFAULT_OVERFLOW,并将其修改为#define MT_UART_DEFAULT_OVERFLOW FALSE,修改好之后关闭流控。

  (2)登记任务号。任务号的登记是通过MT_UartRegisterTaskID()函数完成的,该函数的调用语句可直接跟在MT_Uartinit()函数调用语句之后,其功能是把串口事件通过task_id登记在SampleApp_Init()中。

  (3)串口通信。在SampleApp.c文件中找到SampleApp_ProcessEvent()函数,添加接收或发送语句,发送使用HalUARTWrite()函数,接收使用HalUARTRead()函数,这两个函数位于MT_UART.h库中。

  为验证CC2530串口通信的效果,使用串口调试助手对CC2530的串口通信进行了验证,其结果如图4所示。在测试过程中使用的语句是HalUARTWrite(0,"Hello, this is serial data from CC2530.\n",40),可以看出串口调试助手完整地接收到了来自CC2530的信息。

  图4 CC2530串口通信测试

  3 结 语

  对Linux ARM Cortex A8和CC2530的串口通信进行了研究,分别采用交叉编译和ZStack协议栈开发了Cortex A8和CC2530间的串口通信程序,该方法为Cortex A8上位机与CC2530协调器间的通信提供了解决方案。

Tags: 串口 2530 串口通信 操作系统 嵌入式系统 结构体 组网方案 传感网 设备 能力