多屏系统拼接通用方法探究


最近在项目中需要用WinForm程序发送串口命令控制多个显示屏的拼接和视频信号的切换。显示屏控制可以使用厂家软件,但由于和控制视频信号切换的矩阵不是一个厂家,所以用户要求单独编写一个程序同时对矩阵和显示屏进行控制。矩阵厂家提供了二次开发文档,这部分的代码编写比较简单。但由于显示屏厂家没有提供二次开发文档,所以采用了最原始的方法:通过自带控制软件控制屏幕拼接,同时使用串口监听程序监听每种拼接模式下对应的串口命令,然后将这些命令固化到自己编写的程序中,点击操作按钮时向指定串口发送相应的命令即可。实践证明上述方法可行,但由于命令字符都是在程序中写死的,不灵活,下次客户有类似的需求还要再从新编写一次程序,因此想到可以编写一个通用的方法以适应不同的情形。


本次项目中的显示屏结构如下:

1

2

3

4

5

6

7

8

9

10

11

12

“Z“形顺序给显示屏编号,要求可以将相邻的四块显示屏拼接成2X2的大显示屏。也就是说类似1-2-7-82-3-8-93-4-9-10号这样拼接在一起。下面是探究过程:


假设存在一个竖向为Ax列,横向为Ay行的显示矩阵,则共有Ax*Ay个显示器,从左向右以“Z”形依次编号为1234…nn<=Ax*Ay,n为左上定点拼接一个竖向Px列、横向Py行的矩阵(1<=Px<=Ax,1<=Py<=Ay)。当Px=1Py=1时为不拼接,当Px=AxPy=Ay时为全部拼接。


以唯瑞多屏拼接系统为例

6*2矩阵中拼接1-2-7-8号显示器的命令如下:

  AA BB 02 01 0A 02 02 01 55 55 55 11

         AA BB 02 02 0A 02 02 02 55 55 55 13

         AA BB 02 07 0A 02 02 03 55 55 55 19

         AA BB 02 08 0A 02 02 04 55 55 55 1B

3*3矩阵中拼接全部显示器的命令如下:

         AA BB 02 01 0A 03 03 01 55 55 55 13

         AA BB 02 02 0A 03 03 02 55 55 55 15

         AA BB 02 03 0A 03 03 03 55 55 55 17

         AA BB 02 04 0A 03 03 04 55 55 55 19

         AA BB 02 05 0A 03 03 05 55 55 55 1B

         AA BB 02 06 0A 03 03 06 55 55 55 1D

         AA BB 02 07 0A 03 03 07 55 55 55 1F

         AA BB 02 08 0A 03 03 08 55 55 55 21

         AA BB 02 09 0A 03 03 09 55 55 55 23

打开全部大屏的命令如下:

AA BB 02 00 15 AA AA 55 55 55 55 BF

单独关闭某个屏幕的命令如下:

AA BB 02 01 15 BB BB 55 55 55 55 E2

设置全部屏幕为DVI模式的命令如下:

AA BB 02 00 08 06 55 55 55 55 55 B9

根据以上串口命令可推断出命令结构大致如下(16进制命令码)

AA BB 02

04

0A

03

03

04

55 55 55

19

起始码

屏幕编号

命令类型

拼接矩阵列数

拼接矩阵行数

显示器在拼接矩阵中的编号

停止码

校验码

(和校验)

屏幕编号:0102030405060708090A0B0C0D…

 

通过观察假设校验方式为和校验,下面计算进行验证:

起始码

命令码

停止码

校验码

命令码求和

与校验码关系

AA BB 02

01 0A 01 01 01

55 55 55

0F

0E

校验码=命令码和+1

AA BB 02

03 0A 02 02 01

55 55 55

13

12

校验码=命令码和+1

AA BB 02

01 15 AA AA 55

55 55 55

C0

1BF

校验码=命令码和(低两位)+1

AA BB 02

02 15 AA AA 55

55 55 55

C1

1C0

校验码=命令码和(低两位)+1

AA BB 02

00 08 06 55 55

55 55 55

B9

B8

校验码=命令码和+1

AA BB 02

00 15 BB BB 55

55 55 55

E1

1E0

校验码=命令码和(低两位)+1


综上,将校验规则定义为命令码求和后取低两位加1满足需求。

生成串口命令


函数名

p_join

输入

屏幕列数Ax、屏幕行数Ay、起始矩阵编号i、拼接矩阵列数Px、拼接矩阵行数Py

输出

命令字符串strCmd

内容

        private string p_join(int Ax,int Ay,int i,int Px,int Py)

        {

            StringBuilder strCmd = new StringBuilder();

            for (int k = 0; k < Py; k++)

            {

                for (int j = 0; j < Px; j++)

                {

                    int pNum = i + j + k * Ax;//当前显示器编号

                    int pNum_in = 1 + j + k * Ax;//当前显示器在拼接矩阵中的编号

                    string pTmp = "0" + pNum.ToString("X") + " ";

                    string pTmp_in = "0" + pNum_in.ToString("X") + "";

                    string xTmp = "0" + Px.ToString("X") + " ";

                    string yTmp = "0" + Py.ToString("X") + " ";

                    string strPart = "AA BB 02 " + pTmp + "0A " + xTmp + yTmp + pTmp_in + "55 55 55 ";

                }

            }

            return strCmd.ToString();

        }



串口命令校验

函数名

CheckString

输入

待校验命令strCmd

输出

校验结果strCheck

内容

        private string CheckString(string strCmd)

        {

            string strCheck = "";

            //此处省略

            return strCheck;

        }



 


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值