昆仑通态屏幕制作(连载5)---基础篇(串口接收,文本与灯显示)

前言

    前面介绍了基本的功能,现在差了一个串口的接收,所以按照以下流程进行接收,一步一步的来。这个思维挺重要的:

    第一步:接收数据,文本显示;

    第二步:接收数据,数据直接控制灯;

    第三步:接收数据,数据变位数据控制灯。

    其实中间还省略几步,比如用示波器观察传输数据的正确性,调试脚本程序的正确性。所以做技术得一步一步的,先完成最简单的,一步正确后再做后面的,当然这个分步骤就是自己的逻辑思维了,需要慢慢训练才能将一个事情分几步走。再将分步的几个事情转化为更小的步骤,然后一步一步的实现。

第一节:脚本编写

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一样去编写,这块应该也比较麻烦,但是会了之后也应该是体力劳动。如果有需要源代码和其他高阶东西的小伙伴可以添加微信,我会发送源代码和再次制作需要的连载。微信码放在下面,需要的话可以添加下。

    

 

 

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值