首 页文档资料下载资料维修视频包年699元
请登录  |  免费注册
当前位置:精通维修下载 > 文档资料 > 家电技术 > 维修教程知识 > 单片机栏
基于嵌入式Linux的无纸记录仪通信设计
来源:本站整理  作者:佚名  2009-02-12 10:22:54



  串口通信通过三个线程来实现,主线程、发送子线程和接收数据处理子线程,如图4所示。同时,为了使收发数据管理更加方便,建立了四个数据缓存区:⑴ 发送缓存区,存放准备发送的命令; ⑵ 已发送缓存区,存放已发送好但未经接收确认的命令;⑶ RTU接收缓存区,存放接收到的RTU数据;⑷ ASCII接收缓存区,存放接收到的ASCII数据。所有线程共享上述四个数据缓存区的数据,并设置互斥锁用来确保一个时间段内只有一个任务在访问共享数据。

串口通信多线程程序流程图

点击看原图

图4  串口通信多线程程序流程图

  主线程主要负责设备的注册,扫描是否有数据发送,如果有发送数据,进行优先级设置,将发送数据转为发送所需的ASCII和RTU格式,存入发送缓存区以待发送。串口初始化主要功能为设置串口通信属性,如波特率、数据位、校验位和流控制等。串口通信采用异步通信模式,并以全局变量作为接收标志。解析数据时应将已收到数据和已发送数据进行匹配,根据发送的数据分析接收数据是否正确,如果接收数据正确则丢弃已发送命令,否则重发。

3 快速数据转换算法

  由于上位机与下位机的个别数据存储格式不同,需要转换为对方能够识别的数据。下面以浮点数为例,说明本次设计中的数据转换机制。

  上位机采用Linux操作系统,浮点数采用IEEE-754数据存储格式。IEEE规定一个浮点数在内存中占四字节,其数据格式如图5所示。

IEEE浮点数数据格式

图5  IEEE浮点数数据格式

  在IEEE浮点数数据存储格式下,第1位为符号位,指示浮点数的正负。指数部分共8位,第一个字节的后7位和第二个字节的第1位,表示范围是0 ~ 255。实际上的指数值应是-128 ~ 127的有符号整数,为了存储方便,指数值都加127转为0 ~ 255存储,即实际指数值是E-127。最后23位为小数部分,需要注意的是,在计算时,要将小数部分最高位补1。因此,实际的浮点数值可以通过下面的公式计算:

Real =(-1)*Sign*(D/224)*2E-126

  下位机浮点数在内存中同样占四字节,其数据格式如图6所示。

下位机浮点数数据格式

图6  下位机浮点数数据格式

  下位机浮点数数据格式中,数符用来指示浮点数的正负,阶符用于指示指数的正负,阶码有6位,即指数范围是0~64,小数部分比IEEE浮点数数据格式中多1位,因此在计算时高位无需补1。实际的浮点数数值可以通过下面公式计算:

Real =(-1)*Sign*(D/224)*2(-1)*SignE*E

  实际传输过程中,从下位机传来的浮点数,需要先转为IEEE标准格式,传给下位机的数据同样需要转为下位机能够识别的格式。由于浮点数存储格式复杂,在转换数据时应尽量避免使用浮点数运算。通过比较图5和图6可知,两种存储格式的最后23位相同,可以共用。因此,在编程时,采用共同体能够更快的解决两者之间的转换。编写共同体如下:

  union {

  float fdata;

  unsigned char byte[4];

  }data_change;

  fdata中存放转换前得浮点数,而字符型数组byte直接对应浮点数在计算机中以二进制存储的四个字节。通过对字符型数组的简单的加减法及移位计算就可以快速在两种存储格式之间转换。 实际测试时,采用共同体的数据转换在响应时间上要明显优于未采用共同体的数制转换,提高了串口通信的实时性。

  4 结论

  本文创新点:(1)将嵌入式Linux系统应用于无纸记录仪,使得该装置体积小,功能强,实时性能及可扩展性能良好;(2)实现了MODBUS协议中RTU与ASCII传输模式的共存,使无纸记录仪具有更强的通用性;(3)通过在数据转换编程中采用共同体这方面的改进,提高了无纸记录仪串口通信的实时性。

上一页  [1] [2] 

关键词:

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分)

推荐阅读

图文阅读

热门阅读

Copyright © 2007-2017 down.gzweix.Com. All Rights Reserved .
页面执行时间:32,652.34000 毫秒