数据交互可以说是任何一台仪器都需要的功能。我们的便携式气体分析仪,需要人来操作和配置,所以触摸屏就是我们必然的一个选择。本次我们计划采用3.5寸显示屏,串口通讯。

1、硬件设计

前面我们实验了串行通讯,这次来使用屏实现显示。这次我们计划使用的3.5寸触摸屏采用RS232串行通讯接口,其接口排布如下:

对于RS232接口我们采用了周立功RSM232模块来做实验,其推荐的连接方式如下图:

在实验过程中我们不需要这些保护措施,根据以上的分析我们可以对串口通讯做如下设计。RS232接口原理图如下:

2、软件设计

首先对串口部分做参数配置,波特率、数据位、停止位、奇偶校验等按要求配置好。接下来编写测试代码。

  1. static void LCD_UART_Configuration(void)
  2. {
  3. huart1.Instance = USART1;
  4.  
  5. huart1.Init.BaudRate = ;
  6.  
  7. huart1.Init.WordLength = UART_WORDLENGTH_8B;
  8.  
  9. huart1.Init.StopBits = UART_STOPBITS_1;
  10.  
  11. huart1.Init.Parity = UART_PARITY_NONE;
  12.  
  13. huart1.Init.Mode = UART_MODE_TX_RX;
  14.  
  15. huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  16.  
  17. huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  18.  
  19. if (HAL_UART_Init(&huart1) != HAL_OK)
  20. {
  21. Error_Handler();
  22. }

这次我们使用的屏串行通讯的协议是厂家自己定义的,不过数据帧结构较为简单,如下图所示:

而且功能也比较简单,只有5中功能码:访问寄存器的0x80和0x81、访问变量存储器的0x82和0x83以及访问曲线缓冲区的0x84,具体描述如下图所示:

根据以上描述我们可以编写对应不同对象访问的程序了。

(1)、写数据变量存储器

  1. void WriteDataToLCD(uint16_t startAddress,uint8_t txData[],uint16_t length)
  2. {
  3. /*命令的长度由帧头(2个字节)+数据长度(1个字节)+指令(1个字节)+起始地址(2个字节)+数据(长度为length)*/
  4.  
  5. uint16_t cmd_Length=length+;
  6.  
  7. uint8_t cmd_VAR_Write[WriteDataCommandLength];
  8.  
  9. cmd_VAR_Write[]=0x5A;
  10.  
  11. cmd_VAR_Write[]=0xA5;
  12.  
  13. cmd_VAR_Write[]=(uint8_t)(length+);
  14.  
  15. cmd_VAR_Write[]= FC_VAR_Write;
  16.  
  17. cmd_VAR_Write[]=(uint8_t)(startAddress>>);//起始地址
  18.  
  19. cmd_VAR_Write[]=(uint8_t)startAddress;//起始地址
  20.  
  21. for(int dataIndex=;dataIndex<length;dataIndex++)
  22. {
  23. cmd_VAR_Write[dataIndex+]=txData[dataIndex];
  24. }
  25. SendData(cmd_VAR_Write,cmd_Length);
  26. }

(2)、读变量存储器数据

  1. void ReadDataFromLCD(uint16_t startAddress,uint8_t readWordLength)
  2. {
  3. //命令的长度由帧头(2个字节)+数据长度(1个字节)+指令(1个字节)+起始地址(2个字节)+读取的字长度(1个字节)
  4.  
  5. uint16_t cmd_Length=;
  6.  
  7. uint8_t cmd_VAR_Read[]={0x5A,0xA5,0x04,FC_VAR_Read,0x00,0x00,0x00};//读数据命令
  8.  
  9. cmd_VAR_Read[]=(uint8_t)(startAddress>>);//起始地址
  10.  
  11. cmd_VAR_Read[]=(uint8_t)startAddress;//起始地址
  12.  
  13. cmd_VAR_Read[]=readWordLength;//读取长度
  14.  
  15. SendData(cmd_VAR_Read,cmd_Length);
  16. }

(3)、写曲线缓冲区

  1. void WriteCurveToLCD(uint8_t txData[],uint16_t length,uint8_t channelMode)
  2. {
  3. //命令的长度由帧头(2个字节)+数据长度(1个字节)+指令(1个字节)+通道模式(1个字节)+数据(length,最多8个字)
  4.  
  5. uint16_t cmd_Length=length+;
  6.  
  7. uint8_t cmd_Curve_Write[WriteCurveCommandLength];//写曲线缓冲区命令
  8.  
  9. cmd_Curve_Write[]=0x5A;
  10.  
  11. cmd_Curve_Write[]=0xA5;
  12.  
  13. cmd_Curve_Write[]=(uint8_t)(length+);
  14.  
  15. cmd_Curve_Write[]= FC_Curve_Write;
  16.  
  17. cmd_Curve_Write[]=channelMode;
  18.  
  19. for(int dataIndex=;dataIndex<length;dataIndex++)
  20. {
  21. cmd_Curve_Write[dataIndex+]=txData[dataIndex];
  22. }
  23.  
  24. SendData(cmd_Curve_Write,cmd_Length);
  25. }

(4)、写寄存器数据

  1. void SetRegisterData(uint8_t regAddress,uint8_t txData[],uint16_t length)
  2. {
  3. //命令的长度由帧头(2个字节)+数据长度(1个字节)+指令(1个字节)+寄存器地址(1个字节)+写的数据
  4.  
  5. uint16_t cmd_Length=length+;
  6.  
  7. uint8_t cmd_Reg_Write[WriteCurveCommandLength];//写曲线缓冲区命令
  8.  
  9. cmd_Reg_Write[]=0x5A;
  10.  
  11. cmd_Reg_Write[]=0xA5;
  12.  
  13. cmd_Reg_Write[]=(uint8_t)(length+);
  14.  
  15. cmd_Reg_Write[]= FC_REG_Write;
  16.  
  17. cmd_Reg_Write[]=regAddress;
  18.  
  19. for(int dataIndex=;dataIndex<length;dataIndex++)
  20. {
  21. cmd_Reg_Write[dataIndex+]=txData[dataIndex];
  22. }
  23.  
  24. SendData(cmd_Reg_Write,cmd_Length);
  25. }

(5)、读寄存器数据

  1. void GetRegisterData(uint8_t regAddress,uint8_t readByteLength)
  2. {
  3. //命令的长度由帧头(2个字节)+数据长度(1个字节)+指令(1个字节)+寄存器地址(1个字节)+读取寄存器的字节长度(1个字节)
  4.  
  5. uint16_t cmd_Length=;
  6.  
  7. uint8_t cmd_Reg_Read[]={0x5A,0xA5,0x03,FC_REG_Read,0x00,0x00};//读数据命令
  8.  
  9. cmd_Reg_Read[]=regAddress;
  10.  
  11. cmd_Reg_Read[]=readByteLength;
  12.  
  13. SendData(cmd_Reg_Read,cmd_Length);
  14. }

3、测试结果

完成上述编写后,接上显示屏下装,我们来查看显示效果:

STM32L476应用开发之四:触摸屏驱动与数据交互的更多相关文章

  1. UWP开发:APP之间的数据交互(以微信为例)

    目录 说明 UWP应用唤醒方式 跟微信APP交互数据 APP之间交互数据的前提 说明 我们经常看到,在手机上不需要退到桌面,APP之间就可以相互切换,并且可以传递数据.比如我在使用知乎APP的时候,需 ...

  2. 使用JSP/Servlet技术开发新闻发布系统---JSP数据交互(二)

    JSP内置对象application application对象 JSP常用的内置对象 对象的作用域 作用的分类 对象的作用域 page作用域 实例 //页面1 <% String name = ...

  3. Android开发学习——android与服务器端数据交互

    1.首先搭建服务器端. 使用MyEclipse开发工具 public class MyServlet extends HttpServlet { @Override protected void do ...

  4. 使用JSP/Servalet技术开发新闻发布系统------JSP数据交互一

    什么是内置对象 JSP内置对象是 Web 容器创建的一组对象,不用通过手动new就可以使用 JSP中的九大内存对象  request 请求对象  response 响应对象  out   输出对象  ...

  5. Phonegap开发的前后台数据交互

    在用Phonegap开发时,需要进行前后台数据交互,在网上找资料,很多东西让人一头雾水,最后借鉴了下面的博客: http://blog.sina.com.cn/s/blog_681929ae01017 ...

  6. S3C2440触摸屏驱动实例开发讲解

    出处:http://www.embeddedlinux.org.cn/html/yingjianqudong/ 一.开发环境 主  机:VMWare--Fedora 9 开发板:Mini2440--6 ...

  7. 基于设备树的TQ2440触摸屏驱动移植

    平台 开发板:tq2440 内核:Linux-4.9 u-boot:u-boot-2015.04   概述 之前移植了LCD驱动,下面继续移植触摸屏驱动,然后将tslib也移植上去. 正文 一.移植触 ...

  8. 【转】树莓派3代3.5寸触摸屏驱动的安装(通过ssh安装)

    这是用到的配件的树莓派3代 烧录好系统后,启动的树莓派,我的树莓派已经在一开始通过路由器和局域网,登陆了ssh,设置好了开机就能自动连接到电脑的360wifi,所以无论到哪 里,只要自己的笔记本电脑还 ...

  9. MVC5 网站开发之四 业务逻辑层的架构和基本功能

    业务逻辑层在Ninesky.Core中实现,主要功能封装一些方法通过调用数据存储层,向界面层提供服务.   目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 ...

随机推荐

  1. Canvas画圆形

    转载:https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial/Drawing_shapes#圆弧 function d ...

  2. vi常用指令

    vi filename 打开文件 i 进入编辑模式 esc 退出编辑模式 : 进入指令模式 wq 保存退出 q!不存盘强制退出vi 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字 ...

  3. linux 共享内存的理解

    1.  共享内存是在shmget时创建出来的, 在 shmget(USER_SHARE_MEM_KEY,  sizeof(ADDR_NODE) , IPC_CREAT|0666)) ==-1) 的 s ...

  4. 阿里云上 配置 vsftpd 配置文件 (一个成功例子)

    # # READ THIS: This example file is NOT an exhaustive list of vsftpd options. # Please read the vsft ...

  5. 20165221 JAVA第三周学习心得

    知识点回顾 类与对象学习总结 类:java作为面向对象型语言具有三个特性:①封装性.②继承性.③多态性.java中类是基本要素,类声明的变量叫对象.在类中定义体的函数题叫方法. 类与程序的基本结构: ...

  6. sonar的安装以及使用

    SonarQube是管理代码质量一个开放平台,可以快速的定位代码中潜在的或者明显的错误,下面将会介绍一下这个工具的安装.配置以及使用. 1. 简介 1.  sonar是什么 Sonar是一个用于代码质 ...

  7. Java 类加载机制(阿里面试题)-何时初始化类

    (1)阿里的面试官问我,可以不可以自己写个String类 答案:不可以,因为 根据类加载的双亲委派机制,会去加载父类,父类发现冲突了String就不再加载了; (2)能否在加载类的时候,对类的字节码进 ...

  8. Wireshark技巧-过滤规则和显示规则【转】

    转自:https://www.cnblogs.com/icez/p/3973873.html Wireshark是一个强大的网络协议分析软件,最重要的它是免费软件. 过滤规则 只抓取符合条件的包,在W ...

  9. MVC 中Delete 方法报错问题解决方案

    最开始前台ajax提交时代码 function Del(id) { $.ajax({ type: "GET", url: "/Test/Delete", dat ...

  10. a标签中href属性引起的页面不跳转问题

    先简单描述问题,今天在做一个简单的提交页面的时候,碰到了跳转不了的问题.其中a标签的形式<a href="" onclick="submit()"> ...