STM32与中显串口屏的通信

本文将简要介绍STM32单片机和武汉中显串口屏之间的通信实现过程。不过使用大彩、迪文这些公司的串口屏的同学也能参考一下,它们的通信协议好像一样。

注意:我代码用的arduino框架,但其实在keil里面写都一样,只需要注意串口发送和接收那块的语句就OK了。

文章目录

  • STM32与中显串口屏的通信
    • 前言
    • 一、中显串口屏的通信协议
      • 1.串口屏显示文字
      • 2.串口屏显示数据
      • 3.串口屏绘制数据曲线
      • 4.单片机分析处理串口屏指令
    • 二、实现代码
      • 1.文本变量
      • 2.数据变量
      • 3.绘制数据曲线
      • 4.单片机解析串口屏指令
    • 总结

前言

本文主要介绍一下串口屏和单片机之间的通信过程,包括单片机向串口屏发送指令显示特定的文字、数据,绘制数据曲线,单片机接收串口屏上发来的信息等。


下面就串口屏通信协议、实现代码两个方面阐述具体实现过程。

一、中显串口屏的通信协议

我用的中显串口屏的具体开发指南可以移步此链接详细了解,看看和您用的是不是相似。

http://www.viewtech.cn/UploadFile/EditorFiles/VGUS-DevelopmentGuide.pdf

本文主要实现能向串口屏发送显示文字,数据,绘制数据曲线,并且单片机能够接收处理串口屏发来的信息。 下面简要介绍一下在串口屏上实现以上功能的需求,也就是串口屏和单片机之间的通信协议,这个是屏幕厂商制定好的,可以在该屏的开发指南中找。开发指南参考见上文链接。

1.串口屏显示文字

在串口屏上显示中英文字符串需要通过向串口屏发送指令。以发送汉字“中国”为例,其发送的顺序是这样的:

|帧头| 指令长度 |写变量存储器指令|变量地址|数据内容|结束符号|
|A5 5A|07|82|00 10|D6 D0 B9 FA |FF FF|

其中:

A5 5A:帧头

09:指令字节长度,82 01 40 D6 D0 B9 FA FF FF(不含帧头)

82:写变量存储器指令

00 10:变量地址,在控件属性中设置

D6 D0 B9 FA:数据内容,“中国”的汉字内码

FF FF:文本结束符

因此单片机向串口屏发送信息时应严格按照此格式。

2.串口屏显示数据

在串口屏上显示数据的指令格式和发送文字字符是很像的,只是更改了数据内容,将数据内容替换为该数据的16进制码即可。并去除掉结束符号FF FF。以发送1234为例:

A5 5A:帧头

05:指令字节长度,,82 00 20 04 D2 共 5 字节(不含帧头)

82:写变量存储器指令

00 20:变量地址,在控件属性中设置

04 D2:数据内容,1234 的十六进制数

3.串口屏绘制数据曲线

在串口屏上绘制上传的数据的趋势曲线。其实和其他的也差不离,只是指令有所变化,变量地址也变为通道号。该屏一个曲线框可以实现8条曲线,每条曲线有不同的通道,发送时要设定通道号。

A5 5A:帧头

04:指令字节长度,,82 00 04 D2 共 4字节(不含帧头)

84:写变量存储器指令

00:曲线通道号,在控件属性中设置

04 D2:数据内容,1234 的十六进制数

4.单片机分析处理串口屏指令

在串口屏使用中,需要使用到串口屏上的按钮,按下按钮会发送一串信息到单片机串口,这段信息有固定格式:

A5 5A 06 83 00 00 01 02 22

其中:

A5 5A:帧头
06:指令字节长度,83 00 00 01 02 22 共 6 字节(不含帧头)
83:读变量存储器指令
00 00:变量存储器地址
01:数据字长度, 02 22 共 1 字长
02 22:数据内容,设置的键值,在控件属性中设置

因此在单片机中分析每一次发送过来的这串数据,其中变量存储器地址、数据内容用户在制作串口屏显示界面时可以直接设定,因此的那篇及可以根据判断这几个数据来执行不同的命令。

下面展示代码部分:

二、实现代码

1.文本变量

/* 在目的变量地址写入文字,中英文均可 */void wText( int idCtrl, const char *msg )               /* 显示中英文文本 */{int textLen = strlen( msg );array[0]    = USER_R3;array[1] = USER_RA;array[2] = 1 + 2 + textLen;              /* 命令占1字节,地址占2字节,再加上数据长度4字节 */array[3] = 0x82;array[4]    = (idCtrl >> 8);                /* 取地址的高8位 */array[5]    = idCtrl;                       /* 取地址的低8位 */memcpy( array + 6, msg, textLen );array[6 + textLen]    = 0xFF;array[7 + textLen] = 0xFF;for ( int i = 0; i < (8 + textLen); i++ )       /* 通过串口发送指令 */{ser->write( array[i] );}}

在代码中,第1行的函数参数,idCtrl为屏上指定文本变量框的存储地址,msg即为要输入的字符串,可以在调用函数时直接写入。第2-16行表示将该字符串按照串口屏文本变量的通信格式上传到设定变量地址处。
需要注意的是,这里如果要显示汉字,那么你在串口屏的文本变量控件中使用了什么样的编码方式(GBK、GB2312等),那么编译器也要用相同的编码方式,这样转化出来的汉字才会正确显示。
使用时,调用函数完成文本显示。例如要在串口屏上地址为0x1020的文本显示控件中显示“中国人民万岁 CHINA”,调用函数,参数设置为:
wText(0x1020,”中国人民万岁 CHINA”);

2.数据变量

 void wNum_4B( int idCtrl, float val, int digi = 3 )     /* 绘制4字节数据 */{for ( int i = 0; i < digi; i++ )val *= 10;long    dat = val;uint8_t *pc  = (uint8_t *) &dat;array[0]    = USER_R3;array[1] = USER_RA;array[2] = 1 + 2 + 4;            /* 命令占1字节,地址占2字节,再加上数据长度4字节 */array[3] = 0x82;array[4]    = (idCtrl >> 8);        /* 取地址的高8位 */array[5]    = idCtrl;               /* 取地址的低8位 */array[6]  = pc[3];                /* 取数据的高8位 */array[7]  = pc[2];                /* 取数据的低8位 */array[8]  = pc[1];                /* 取数据的高8位 */array[9]  = pc[0];                /* 取数据的低8位 */for ( int i = 0; i < 10; i++ )          /* 通过串口发送指令 */{ser->write( array[i] );}}

在代码中,第1行的函数参数,idCtrl表示串口屏上设定的数据变量控件的变量地址,val表示要发送的数据变量,didi表示该数据小数点后的位数。其余的代码作用为将该数据以串口屏通信格式发送到串口屏上显示。
使用时,可以直接调用该函数,例如要将一个保留了两位小数的变量a显示在串口屏上地址为0x1010的变量框内,调用函数,参数设置为:
wNum_4B(0x1010, a,2);
需要注意的是,因为该串口屏的数据变量控件的属性设置有2B和4B之分,有时候数据可能会比较大,因此本文此处代码采用4B方式。

3.绘制数据曲线

//自定义曲线框参数绘制曲线// idCtrl:曲线通道  curveId:曲线描述指针 val:变量 vdCentral:曲线中心位置变量值 max:数据范围 digi:数据小数位数 void wCurve( int idCtrl, int curveId, float val, int vdCentral, int max ,int digi){for ( int i = 0; i < digi; i++ ){val *= 10;vdCentral *= 10;max *= 10;}wNum_2B( curveId + 0x06, vdCentral, 0 );        /* 曲线中心位置的变量数据值 */int mulY = 235 * 256 / (max);wNum_2B( curveId + 0x08, mulY, 0 );             /* 曲线纵轴放大倍数 */uint16_t  dat = val;uint8_t      *pc = (uint8_t *) &dat;array[0]    = USER_R3;array[1] = USER_RA;array[2] = 1 + 1 + 2;                    /* 命令占1字节,地址占2字节,再加上数据长度4字节 */array[3] = 0x84;array[4]    = idCtrl;array[5]  = pc[1];                        /* 取数据的高8位 */array[6]  = pc[0];                        /* 取数据的低8位 */for ( int i = 0; i < 7; i++ )                   /* 通过串口发送指令 */{ser->write( array[i] );}}

在代码中,第1行函数参数,idCtrl为曲线的数据源通道,用户可以调用时直接写入指定通道。val即为要显示的数据值。curveId为曲线变量框的描述指针,目的是为了能改变曲线变量框的一些属性参数值。vdCentral是用户所要显示的数据在曲线Y轴中心位置的数据值。max是用户所要显示数据最大最小值的差值。写曲线指令为0x84。5-7行是设置曲线框的具体参数,10-20行是将该数据按照串口屏曲线绘制的通信格式上传到屏上的曲线框中。用户调用该函数时,可以指定曲线显示变量,对其纵轴放大倍数以及曲线中心位置的变量值进行设定。
以上具体可以在串口屏开发指南中查阅。
使用时,调用函数写入参数即可。例如要绘制一个数值范围在0-100范围内的变量b的变化趋势曲线,该曲线控件在串口屏上设置描述指针为0x1060,数据源通道设置为0。调用函数,参数设置为:
wCurveDiy(0x01, b, 0x1060, 50, 100);

4.单片机解析串口屏指令

void dealCom(){//判断串口缓冲区数据数量是否在20ms内没变,如果没变则开始解析nowTime       = millis();     /* 记录当前时间 */nowLcdBufNum   = ser->available();if ( nowTime - lastTime >= 20 ) /* 检查 20 ms是否通过 */{lastLcdBufNum = ser->available();lastTime = nowTime;if ( nowLcdBufNum == lastLcdBufNum ){commBuff[talNum] = ser->read();talNum++;if ( talNum == BUFFER_SIZE )talNum = 0;uint16_t  i, curNum, tem_talNum;uint16_t  nowbuffer, len;len      = startNum;tem_talNum  = talNum;if ( tem_talNum == len )return;if ( commBuff[startNum] != USER_R3 ){startNum++;if ( startNum == BUFFER_SIZE )startNum = 0;return;}if ( tem_talNum > len )nowbuffer = tem_talNum - len;elsenowbuffer = tem_talNum + BUFFER_SIZE - len;if ( nowbuffer < 5 )return;curNum = startNum + 2;if ( curNum > BUFFER_SIZE - 1 )curNum -= BUFFER_SIZE;len = commBuff[curNum] + 3;if ( nowbuffer < len )return;i  = 0;curNum = startNum;while ( 1 ){cmdBuf[i++] = commBuff[curNum++];if ( curNum == BUFFER_SIZE )curNum = 0;if ( i == 4 ){if ( cmdBuf[0] != USER_R3 || cmdBuf[1] != USER_RA ) /*  */{startNum = curNum;return;}len = cmdBuf[2];}else if ( i > 4 ){if ( i == len + 3 )     /*  */{startNum = curNum;break;}else if ( i > 255 )    /*  */{startNum = curNum;return;}else if ( curNum == tem_talNum )return;}}cmdtype = cmdBuf[3];exflag = cmdBuf[4];highAdd = cmdBuf[4];lowAdd = cmdBuf[5];}//cmdBuf[4][5]:按钮变量地址  cmdBuf[7][8]:按钮键值}}

这一大段代码,就起到了串口屏每发一次信息,单片机读取串口缓冲区的内容并将这一串信息分开存入cmdBuf[]中的作用。cmdBuf[]里面就是上文提到的那一串按下屏幕按钮后屏幕发送的信息。根据特定的几个数据的不同,来执行不同的指令。

总结

以上就是使用中显串口屏实现文本变量显示、数据变量显示、数据趋势曲线绘制、读取屏上指令功能的大致过程。大彩和迪文好像也用的类似的通讯协议,可以参考参考。希望对大家有帮助!

文章目录

  • STM32与中显串口屏的通信
    • 前言
    • 一、中显串口屏的通信协议
      • 1.串口屏显示文字
      • 2.串口屏显示数据
      • 3.串口屏绘制数据曲线
      • 4.单片机分析处理串口屏指令
    • 二、实现代码
      • 1.文本变量
      • 2.数据变量
      • 3.绘制数据曲线
      • 4.单片机解析串口屏指令
    • 总结

STM32与中显串口屏的通信相关推荐

  1. 基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文)

    基于MODBUS协议的单片机与(串口屏)触摸屏通信(图文) 导读:触摸屏能够直观.生动地显示运行参数和运行状态,而且通过触摸屏画面可以直接修改系统运行参数,人机交互性好.触摸屏和单片机通信,需要根据触 ...

  2. cubemx stm32 陶晶驰 串口屏 基于YXY通信原理的串口屏驱动代码

    陶晶驰串口屏 资料 陶晶驰串口屏是本质是一个MCU,屏幕是MCU的模块,一般是一块TFT屏幕.在串口屏厂商提供的软件上面编写界面,然后通过串口直接烧到串口屏的MCU上,然后在屏幕上展示出来. 串口屏资 ...

  3. STM32物联网项目-HMI串口屏

    HMI串口屏实验 串口屏 屏幕使用的是淘晶池的串口屏,显示内容可以通过官方上位机来编辑,屏幕学习平台:http://wiki.tjc1688.com/doku.php?id=start 通信原理:屏幕 ...

  4. (跨平台UI)单片机用MTF HMI串口屏 UART通信易用兼容

    MTF Sagittarius 跨平台串口显示软件 MVVM 组态 MTF Sagittarius Serial Display v1.0 可直接用于产品, 或单片机版的串口屏调试 windows, ...

  5. Delphi中ComPort串口控件通信中的数据处理

    http://www.cnblogs.com/gaiyang/archive/2011/09/02/2163265.html 1.串口通信的基本原理: 一般计算机与外部设备通讯有两种方式: 并行传送( ...

  6. 武汉中显液晶屏在电梯行业中的应用解决方案:

    1. 引言  当今高科技信息时代,电梯在人们的生活中扮演着越来越重要的角色,写字楼.公寓.住宅.商城等场合电梯随处可见.随着电梯技术不断发展及生活的智能化,人们对电梯的要求不仅仅是乘人载物,更对电梯的 ...

  7. HMI智能串口屏——在STM32开发板上的实战应用及其详解

    HMI智能串口屏--在STM32开发板上的实战应用及其详解 一.HMI智能串口屏使用步骤 二.附录 一.HMI智能串口屏使用步骤 安装USART HMI软件 (一般买的串口屏里面,商家送的资料里面都有 ...

  8. USART HMI智能串口屏与单片机双向通讯

    目录 ·HMI串口屏介绍 ·HMI串口屏开发实操 ·准备 ·界面认识 ·写命令 ·下载 ·HMI串口屏与单片机(stm32)双向通信 [ 功能实现: STM32控制串口屏对应的数值.文本完成相应变化 ...

  9. 【逗老师的无线电】MMDVM串口屏相关开发

    哎呀呀,终于研究通透了MMDVM的串口屏相关了. 目录 一.Nextion和陶晶驰串口屏 NXT和TJC的设计软件资源 二.MMDVM与串口屏通信原理 1.指令发送 1.1.文本更新指令 1.2.页面 ...

最新文章

  1. Eclipse反编译工具Jad及插件JadClipse配置
  2. 记一次Mysql误删记录的挽救
  3. 北京规定6类高级人才来京最高奖励30万元
  4. 2013\Province_C_C++_A\4.颠倒的价牌
  5. 使用 create-react-app 构建 react应用程序
  6. Anconda安装教程
  7. 印前处理的“发动机”——RIP
  8. Cloudera Manager agent无法启动,拒绝链接 Failed! trying again in 2 second(s): [Errno 111] Connection refuse
  9. 【算法分析与设计】浅谈递归与非递归
  10. 坚果pro2刷机分享
  11. 为SQL Server 增加链接到SQL Server 的链接服务器
  12. 微信小程序操作数据库
  13. 计算机论文的研究思路与方法,计算机毕业论文开题报告教学网站的设计与实现...
  14. android 渐变动画,Android-实现背景渐变动画
  15. 软件授权 x-auth
  16. 蜗牛星际改内存_二、FreeNAS篇:使用U盘在蜗牛星际上安装FreeNAS
  17. QGIS 3.14|地震数据动画效果实战(一)数据准备篇
  18. 无广告的免费视频存储空间并提供视频上传转码的功能,很不错的哦
  19. 电影影院购票管理系统
  20. three.js 相对坐标的设置

热门文章

  1. word打开出错,要进入安全模式问题
  2. 技术经理成长复盘-要懂一些项目管理的知识
  3. 图灵学院专用-- 00JVM参数手册
  4. 《程序员的成长课》:增加收入的 3 大方向
  5. cmake和make的简单理解
  6. Dynamic Programming(1)
  7. Dynamic programming 1
  8. 腾讯AI Lab开放文本理解系统TexSmart,让AI想得更深更广
  9. 疫情地图 | EXCEL制作疫情风险地地图
  10. TOSCA自动化测试工具