多屏系统拼接通用方法探究
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;
}
本次项目中的显示屏结构如下:
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;
}
相关文章推荐
- Linux串口通信
- winform绑定快捷键的方法
- C#实现WinForm捕获最小化事件的方法
- WinForm之BindingSource基础操作实例教程
- WinForm相对路径的陷阱
- winform实现拖动文件到窗体上的方法
- WinForm实现程序一段时间不运行自动关闭的方法
- C#采用Winform实现类似Android的Listener
- WinForm自定义控件应用实例
- WinForm实现为TextBox设置水印文字功能
- C#设置WinForm中DataGrid列的方法(列宽/列标题等)
- winform 实现控制输入法
- WinForm实现最小化到系统托盘方法实例详解
- WinForm中的几个实用技巧汇总
- WinForm实现按名称递归查找控件的方法
- Winform窗体传值的方法(示例)
- Winform实现抓取web页面内容的方法
- WinForm实现自定义右下角提示效果的方法
- WinForm特效之桌面上的遮罩层实现方法
- C#中如何使用Winform实现炫酷的透明动画界面