当前位置:网站首页>昆仑通态屏幕制作(连载5)---基础篇(串口接收,文本与灯显示)
昆仑通态屏幕制作(连载5)---基础篇(串口接收,文本与灯显示)
2022-07-30 05:45:00 【透明的光】
前言
前面介绍了基本的功能,现在差了一个串口的接收,所以按照以下流程进行接收,一步一步的来。这个思维挺重要的:
第一步:接收数据,文本显示;
第二步:接收数据,数据直接控制灯;
第三步:接收数据,数据变位数据控制灯。
其实中间还省略几步,比如用示波器观察传输数据的正确性,调试脚本程序的正确性。所以做技术得一步一步的,先完成最简单的,一步正确后再做后面的,当然这个分步骤就是自己的逻辑思维了,需要慢慢训练才能将一个事情分几步走。再将分步的几个事情转化为更小的步骤,然后一步一步的实现。
第一节:脚本编写
DIM nSendByteArr(9) as BYTE
DIM nRecvByteArr(9) as BYTE
nSendByteArr[1] = &H5A
nSendByteArr[2] = &HA5
nSendByteArr[3] = &H03
nSendByteArr[4] = &H04
nSendByteArr[5] = !BitRShift(gnGetData1, 8)
nSendByteArr[6] = gnGetData1
nSendByteArr[7] = !BitRShift(gnGetData1, 8)
nSendByteArr[8] = gnGetData1
nSendByteArr[9] = !SvrByteArraySum(nSendByteArr,3,6)'和校验
!DevClearBuff() '清缓冲
!DevWriteAndReadByteArr(nSendByteArr,9,nRecvByteArr,9,通讯延时)
这部分是前面串口发送部分的程序。发送9个,接收9个,完成发送之后,加入以下接收程序。其实接收的数据已经放进数组里面了,至于怎么接收怎么放进去的这个是屏幕自己完成的,不用去管,工程思想就是关注入口和出口就行了,至于里面的黑盒子是啥,不用关注。
DIM glRecvDataH(9) as INTEGER
DIM glRecvData(9) as INTEGER
glRecvDataH[1] = nRecvByteArr[1] '0x5A--帧头
glRecvDataH[2] = nRecvByteArr[2] '0xA5--帧头
glRecvDataH[3] = nRecvByteArr[3] '0x06--数据长度(从长度位后一位开始的数据总长)
glRecvDataH[4] = nRecvByteArr[4] '0x80--读指令
glRecvDataH[5] = nRecvByteArr[5] '0x00--数据1
glRecvDataH[6] = nRecvByteArr[6] '0x00--数据2
glRecvDataH[7] = nRecvByteArr[7] '0x00--数据3
glRecvDataH[8] = nRecvByteArr[8] '0x00--数据4
glRecvDataH[9] = nRecvByteArr[9] '0x86--和校验
!SetIntChannelValueByName("接收数据1", glRecvDataH[5])
!SetIntChannelValueByName("接收数据2", glRecvDataH[6])
!SetIntChannelValueByName("接收数据3", glRecvDataH[7])
!SetIntChannelValueByName("接收数据4", glRecvDataH[8])
DIM glSerialLed1 as INTEGER
DIM glSerialLed2 as INTEGER
DIM glSerialLed3 as INTEGER
DIM glSerialLed4 as INTEGER
glSerialLed1 = glRecvDataH[5]
glSerialLed2 = glRecvDataH[6]
glSerialLed3 = glRecvDataH[7]
glSerialLed4 = glRecvDataH[8]
!SetIntChannelValueByName("串口控制灯1", glSerialLed1 )
!SetIntChannelValueByName("串口控制灯2", glSerialLed2 )
!SetIntChannelValueByName("串口控制灯3", glSerialLed3 )
!SetIntChannelValueByName("串口控制灯4", glSerialLed4 )
一块一块解释:
第一块:定义接收后变量数组,这里不建议直接使用串口接收的那个数组,一定要再定义一个新的数组,这样可以保证接收的正确后,再做后面的处理。只要经过一步,就要加入一步的变量,这样第一个按步骤检查正确性,第二个容易扩展程序,一步一步互不影响,可以分成块块去做。
第二块:将串口得到的数据复制到定义的数组中;
第三块:将接收数据的数据位:5/6/7/8byte放入“接收数据1/2/3/4”中,目的是直接文本显示;
第四块:定义灯变量;
第五块:将缓存的数据放入定义的灯变量中;
第六块:将灯变量输出给LED灯,目的是指示灯显示。
同时增加设备通道。保存退出。
第二节:脚本驱动链接屏幕界面
将脚本的通道类型链接到对应数据对象中。
第三节:屏幕界面设定
其中LED灯的设置比较特殊:
仅仅设置数据对象就行了,选择串口控制灯1/2/3/4,至于鼠标怎么点,在框框里点点就出来箭头了,我试了好久才点出来。
第四节:串口数据准备
串口发9个数,收9个数。指令里面有个通讯延时。
!DevWriteAndReadByteArr(nSendByteArr,9,nRecvByteArr,9,通讯延时)
里面设置发送到接收的最大时间差,这点和QT的串口很像,里面设置的200ms。差不多那么高的波特率,返回的数据肯定能接收到完整的帧。想看这个时间怎么确定的小伙伴可以移步:
https://blog.csdn.net/weixin_45426095/article/details/119210830
《QT连载1:readyRead()函数,数据分包不完整解决办法》。
所以串口助手必须在200ms内回复数据才能正确接收,所以直接在串口助手100ms发一次,发着玩呗,没啥影响。但是如果屏幕链接单片机的话,这个就有问题了,也就是说单片机从接收到屏幕发送的数据指令,到回复屏幕的数据的时间要尽可能的短,这点程序里面就需要很大注意了,如果得到的数据不能正确显示的话,就需要看看是屏幕的问题,还是单片机的问题了。现在用串口助手首先确定屏幕没有问题才好。所以使用串口助手尽快的发送。
报文:5A A5 03 04 00 00 00 00 07 定时发送的报文
报文:5A A5 06 80 05 02 00 00 CA 回复的报文
第五节:测试
运行,(步骤省略,具体可见前面几章)
解释:收到数据0x05 0x02 0x00 0x00 四个byte,直接显示到对话框中,而灯是只要数据不为0就亮,所以前两个灯亮,后两个灯不亮。
第六节:存在问题
接收到的数据0x05 转化为二进制后就是00000101,用一个byte控制一个灯比较费,所以希望是用一个byte控制8个灯,这样可以减小传输数据量,增加装置的可靠性。所以必须利用位来控制灯。所以再加入4个灯,利用0x05的这个5来控制,即00000101中的0101来控制四个灯。按照结果应该是两个灯亮,另两个灯不亮。当然实际上可以控制8个灯,思想是一样的,所以只用四个灯代替,有兴趣的小伙伴可以试试。
第七节:加入bit控制灯程序与界面
DIM glSerialLed5 as INTEGER
DIM glSerialLed6 as INTEGER
DIM glSerialLed7 as INTEGER
DIM glSerialLed8 as INTEGER
glSerialLed5 = !BitAnd(glRecvDataH[5], &H01)
glSerialLed6 = !BitAnd(glRecvDataH[5], &H02)
glSerialLed7 = !BitAnd(glRecvDataH[5], &H04)
glSerialLed8 = !BitAnd(glRecvDataH[5], &H08)
!SetIntChannelValueByName("串口控制灯5", glSerialLed5 )
!SetIntChannelValueByName("串口控制灯6", glSerialLed6 )
!SetIntChannelValueByName("串口控制灯7", glSerialLed7 )
!SetIntChannelValueByName("串口控制灯8", glSerialLed8 )
成块解释:
第一块:定义位控制变量,其实定义的是整数变量,但是灯控制只分为数据为0和不为0
第二块:根据第一块思维,将数据与0x00000001,0x00000010,0x00000100,0x00001000,与一下,这样就去除了其他位,而每个变量只保留了数据的一位,这位等于1的话,整数就不为0,这位为0的话,整数就为0,达到将数据中位取出来的目的。
第三块:位变成的整数控制灯。
脚本链接和屏幕界面设计后,运行程序:
横排:5 和 2对应灯亮;
竖排:5对应0101,所以第一个和第三个灯亮 。验证了上述说的灯亮的现象。
改变报文:5A A5 06 80 09 02 00 04 CA
横排:9 2 4 对应灯亮
竖排:9为1001,所以第一个灯和第四个灯亮。
第八节:结论与展望
至此,昆仑通态屏的全部基础内容告一段落,以上介绍的东西差不多能满足大部分屏幕的制作需要。以后有时间再看看屏幕的中级用法吧,想着还会有高级用法,哈哈。如果需要的话我再去研究屏幕的其他东西,看看还有策略啥的,应该能像PLC一样去编写,这块应该也比较麻烦,但是会了之后也应该是体力劳动。如果有需要源代码和其他高阶东西的小伙伴可以添加微信,我会发送源代码和再次制作需要的连载。微信码放在下面,需要的话可以添加下。
边栏推荐
- 函数的信息传递(C语言实践)
- 边境的悍匪—机器学习实战:第五章 支持向量机
- Pytorch(一):动态图机制以及框架结构
- 卷积神经网络(CNN)之卷积操作、池化操作、激活函数
- Twenty-two, Kotlin advanced learning: simply learn RecyclerView to achieve list display;
- 【青岛站】SWAT模型高阶应用暨无资料地区建模、不确定分析与气候变化、土地利用对面源污染影响模型改进及案例分析研讨
- MATLAB怎么在图像中显示nii文件切片信息?
- HSPF 模型应用
- 十三、Kotlin进阶学习:内联函数let、also、with、run、apply的用法。
- MySQL index optimization and failure scenarios
猜你喜欢
The first WebAssembly program
Target detection, object classification and semantic segmentation of UAV remote sensing images based on PyTorch deep learning
MYSQL一站式学习,看完即学完
卷积神经网络(CNN)之卷积操作、池化操作、激活函数
Pytorch(三):可视化工具(Tensorboard、Visdom)
边境的悍匪—机器学习实战:第七章 集成学习和随机森林
protobuf coding and network communication applications (1)
Flood Control Assessment Report Compilation Method and Flood Modelling under the New Guidelines (HEC-RAS)
The types of data structures and MySQL index
Application of remote sensing, GIS and GPS technology in hydrology, meteorology, disaster, ecology, environment and health
随机推荐
【总结】工业检测项目中如何选择合适的损失函数
R-GIS: 如何用R语言实现GIS地理空间分析及模型预测
Self-augmented Unpaired Image Dehazing via Density and Depth Decomposition程序运行记录
Use kotlin to extend plugins/dependencies to simplify code (after the latest version 4.0, this plugin has been deprecated, so please choose to learn, mainly to understand.)
Trust anchor for certification path not found. Exception solution.
Twenty-two, Kotlin advanced learning: simply learn RecyclerView to achieve list display;
函数的信息传递(C语言实践)
二十一、Kotlin进阶学习:实现简单的网络访问封装
User password encryption using Bcrypt instead of MD5, SHA1 and SHA256
工厂模式(Swift 实现)
思谋面试准备
Simulation of Future Air Pollution Changes Based on Global Model Comparison Program CMIP6 and Regional Climate-Chemistry Coupling Model WRF-Chem
CLUE Model Construction Method, Model Validation and Land Use Change Scenario Prediction
Xcode 绑定按钮点击事件
2021-09-16 集成学习上--task1机器学习数学基础
边境的悍匪—机器学习实战:第十六章使用RNN和注意力机制进行自然语言处理
原创 Acegi 1.03 安全机制
十六、Kotlin进阶学习:协程详细学习。
常用损失函数(一):Focal Loss
Meta分析在生态环境领域里的应用