您的位置:首页 > 其它

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

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

假设存在一个竖向为Ax列,横向为Ay行的显示矩阵,则共有Ax*Ay个显示器,从左向右以“Z”形依次编号为1、2、3、4…n(n<=Ax*Ay),以n为左上定点拼接一个竖向Px列、横向Py行的矩阵(1<=Px<=Ax,1<=Py<=Ay)。当Px=1且Py=1时为不拼接,当Px=Ax且Py=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

起始码

屏幕编号

命令类型

拼接矩阵列数

拼接矩阵行数

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

停止码

校验码

(和校验)

屏幕编号:01、02、03、04、05、06、07、08、09、0A、0B、0C、0D…
 
通过观察假设校验方式为和校验,下面计算进行验证:

起始码

命令码

停止码

校验码

命令码求和

与校验码关系

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;

       
}

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  WinForm 串口 Vewell