摘 要:為滿足拳擊比賽的公平性,雙屏顯示比賽中的詳細信息成為關鍵。系統在VB 6.0的環境下,根據不同的硬件環境要求,通過調用API函數和MSComm控件,使用單機中的雙屏顯示和主從機的串行通信雙屏顯示。在場地顯示屏上可以顯示裁判員的姓名、單位,裁判員的有效點和打點信息,運動員的姓名、單位,以及公斤級、場次、時間、比分等詳細內容。主從機串行通信中使用RS 232串行口,在近距傳輸中系統的穩定性好、通用性強,能夠滿足比賽和拳聯的要求。從程序的界面設計到源代碼,都做了詳細的說明。
關鍵詞:Visual Basic 6.0; 雙屏顯示; API; MSComm控件; RS 232
中圖分類號:TP274 文獻標識碼:A
文章編號:1004-373X(2010)09-0191-03
Design of Dual-screen Display System for Boxing Game
YANG Ting-lei, ZHANG Zi-ming, SHI Yuan-zheng, GONG Jin-liang, TIAN Da-jun
(College of Electronic Information and Control Engineering, Beijing University of Technology, Beijing 100124, China)
Abstract: In order to meet the fairness of a boxing game, dual-screen display details in a game become critical. The system in the VB 6.0 environment, by calling the API function and MSComm control unit respectively, achieves stand-alone function in the dual-screen display and relies on the master-slave serial communication dual-screen display. In the big screen it can display the referee names, units, the effective points of the referees, the small flash points, the athlete names, units, and kilograms, screenings, time, score and other details. The RS 232 serial port is used in master-slave serial communication. The system working in the short-range transmission has high stability and strong versatility, and can meet the requirements of competition and the International Boxing Federation. The details from the program interface design to the source code are explained.
Keywords: Visual Basic 6.0; dual-screen display; API; MSComm control unit; RS 232
0 引 言
在現代體育比賽中,特別是關系到裁判的打分、打點的體育項目,裁判的公平、公正性直接關系到比賽能否順利進行和體育競技水平的高低。拳擊比賽中運動員的得分是靠5個臺下裁判打的有效點計入的。由于有效點需要至少3名裁判同時判有效才有效,裁判的水平和裁判的公正性直接決定運動員比分的高低。通過場地顯示屏的顯示,將裁判的詳細信息(姓名、單位、有效點和打點信息)公布于眾,能夠大大提高裁判的公平、公正性,保證比賽的質量和水平。
Visual Basic是Microsoft公司推出的一種在Windows環境下的面向對象程序設計語言,他將Windows編程的復雜性封裝起來,使用可視化界面設計應用程序,提高了應用程序的開發效率,并且具有功能強大、易學易用、編程簡潔等特點,是當今世界上使用最廣泛的編程語言之一,它也被公認為是編程效率最高的一種編程方法[1]。無論是開發功能強大、性能可靠的商務軟件,還是編寫能處理實際問題的實用小程序,VB都是最快速、最簡便的方法[2]。
該軟件是在Visual Basic 6.0環境下設計的,兩種實現方法:一是單機通過調用API函數實現雙屏顯示[3];二是主從機之間通過串行通信實現雙屏顯示,這樣能夠滿足不同硬件環境的需求[4]。
在VB 6.0中提供了完成串行通信的控件MSComm,該控件提供了標準的事件處理函數、過程,并通過屬性的方法提供了串行通信參數的設置,比較容易地解決了串行通信的問題[4]。
1 單機雙屏顯示設計
系統設計流程如圖1所示[5]。
1.1 調用API函數
API(Application Programming Interface,應用程序編程接口)是一些預先定義的函數,目的是提供應用程序與開發人員基于某軟件或硬件的以訪問一組例程的能力,而又無需訪問源碼,或理解內部工作機制的細節。所有運行在Windows平臺上的應用程序包括Windows操作系統都可調用,VB是以Windows為編程環境的,所以可以利用API函數[1]。
圖1 系統設計流程
首先判斷雙屏標志位doublescreen_flag,若為0,則啟用單機雙屏顯示:
聲明API函數,各定義函數調用API函數,例:
Public Declare Function UnhookWindowsHookEx Lib ″user32″ (ByVal hHook As Long) As Long
Public Declare Function GetWindowLong Lib ″user32″ Alias ″GetWindowLongA″ (ByVal hwnd As Long,ByVal nIndex As Long) As Long
Public Declare Function GetCurrentThreadId Lib ″kernel32″() As Long
Public Declare Function SetWindowsHookEx Lib ″user32″ Alias″SetWindowsHookExA″ (ByVal idHook As Long,ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
1.2 雙屏尺寸的設置
定義ChangeScreenSize()函數設置顯示界面在子屏中顯示尺寸的大小,例:
ZeroMemory dm, Len(dm)
dm.dmSize = Len(dm)
dm.dmFields=dm_pelswidth or dm_pelsheight
dm.dmPelsWidth = size.cx
dm.dmPelsHeight = size.cy
1.3 雙屏位置的設置
定義ChangeScreenPosition()函數,設置畫面在子屏中的位置,例:
dm.dmPosition.x = Position.x
dm.dmPosition.y = Position.y
1.4 雙屏分辨率、頻率的設置
定義ChangeScreenFrequency()函數,設置子屏的頻率和分辨率,例:
dm.dmPelsWidth = size.cx
dm.dmPelsHeight = size.cy
dm.dmDisplayFrequency = nFrequency
1.5 雙屏顯示的詳細內容設計
根據比賽和拳聯的要求,場地顯示屏顯示的內容主要有:裁判員的詳細信息(包括:姓名、單位、有效點以及打點信息)、運動員的信息(包括:姓名、單位)以及比賽信息(包括:公斤級、場次、輪次、時間、比分)等。雙屏內容的顯示直接從軟件數據庫中采集。6個顯示界面包含不同的顯示信息,可以按顯示要求選擇不同的界面,滿足比賽的需求。其中界面1的部分代碼為:
指示燈:Label15(0).Caption=CboRed.Text
回合:Label7.Caption=Trim(roundnum)
有效點:Form1.Label10.Caption=recptt.Caption
2 主從機串行通信雙屏顯示設計
2.1 串行通信技術RS 232
串口通信技術采用了RS 232串口通信。目前RS 232是PC機與通信工業中應用最廣泛的一種串行接口,它被定義為一種在低速率串行通訊中增加通訊距離的單端標準。RS 232采取不平衡傳輸方式,即所謂單端通訊[6]。
圖2 RS 232接口端口圖
在通信中選用2、3引腳作為通信的輸入輸出端口,5引腳作為地,制作兩個串行口時2、3號接口跳線。由于需傳送的內容短少且只有一幀,沒有使用奇偶校驗位,采用判別幀頭幀尾的方式判斷接受信息,只是簡單的通信傳送,大大減少了系統的復雜程度。
2.2 MSComm控件
Microsoft Communications Control(以下簡稱MSComm)是Microsoft公司提供的簡化Windows下串行通信編程的ActiveX控件,它為應用程序提供了通過串行接口收發數據的簡便方法。
MSComm 控件的常用屬性:
CommPort:設置并返回通訊端口號。
Settings:以字符串的形式設置并返回波特率、奇偶校驗、數據位、停止位。
PortOpen:設置并返回通訊端口的狀態,也可以打開和關閉端口。
Input:從接收緩沖區返回和刪除字符。
Output:向傳輸緩沖區寫一個字符串。
MSComm控件的設置:
With Info_Show_Form1.MSComm1
.CommPort=com_port
.Settings=″9600,n,8,1″
.InputMode=comInputModeText
.InBufferCount=0
.RThreshold=LEN_OF_FRAME_ALL
.InBufferSize=3000
.OutBufferSize=1000
.SThreshold=0
.InputLen=0
.OutBufferCount = 0
If .PortOpen = False Then .PortOpen = True
End With
2.3 串行通信的發送
首先判斷雙屏標志位doublescreen_flag,若為1,則進行串行通信。將需要發送的信息(裁判員的信息、運動員的信息、比賽信息)連成一幀,以FFFF作為幀頭以EEEE作為幀尾發送[3]。根據發送幀長判斷接受緩沖區的大小。根據是英文名稱還是中文名稱判斷發送內容。部分代碼如下:
For i = 0 To 4
send_msg=send_msgSendMsg_Trans(Trim(redplus1t(i).Caption))
Next i
For i = 0 To 4
send_msg=send_msgSendMsg_Trans(Trim(redacptt(i).Caption))
Next i
send_msg = send_msg Trim(roundnum)
使用英文單位名稱:
send_msg=send_msg Left(Trim(CboBlue.Text), 3)
send_msg=send_msg Left(Trim(cboJ1.Text), 3)
For i=1 To 119
send_msg=send_msg ″0″
Next i
使用中文單位名稱:
send_msg=send_msgSendMsg_Trans_Name(Cn_Judge_Unit_Cut(Cn_Space_Cut(Trim(cboJ1.Text))))
2.4 串行通信接受
在接受系統的顯示,采用從接受緩沖區截取的方法,將每部分賦給要顯示的文本,部分代碼如下:
控件的調用[7]:
Private Declare Function GetWindowLong Lib ″user32″ Alias ″GetWindowLongA″ (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib ″user32″ Alias ″SetWindowLongA″ (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib ″user32″ (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
串口初始化:
Ds_Fd_Module.Com_Int
字符及時鐘控件初始化:
Ds_Fd_Module.Val_Int
接收啟用串口通信[7]:
Select Case MSComm1.CommEvent
Case comEvReceive
recv_msg = MSComm1.Input
Label18.Caption=recv_msg
Label19.Caption=Len(recv_msg)
Test_Timer.Enabled = True
大屏信息:
Label11(0).Caption=Val(Mid(recv_msg,85,1))
Label15(0).Caption=Val(Mid(recv_msg,89,3))
Label15(1).Caption=Val(Mid(recv_msg,92,3))
Label28.Caption=Val(Mid(recv_msg, 95, 3))
Label29.Caption=Val(Mid(recv_msg, 98, 3))
For i=0 To 9
Label31(i).Caption=Val(Mid(recv_msg, 35+i*3, 3))
Next i
Label3(0).Caption=RecvMsg_Trans_Name(Mid(recv_msg, 101, 5))
For i = 0 To 4
Label32(i).Caption=RecvMsg_Trans_rep(Mid(recv_msg, 121 + i * 5, 5))
Next i
3 場地顯示屏顯示界面
場地顯示屏顯示界面如圖3所示[5]。
圖3 場地顯示屏顯示界面圖
該界面包含了:場次、級別、輪次、時間、比分、運動員的信息、裁判員的信息、各有小點和指示燈等詳細信息,滿足比賽的要求。
4 結 語
詳細介紹了拳擊比賽場地顯示屏顯示系統設計,并將各環節的代碼示出,VB語言的簡潔高效性顯得尤為突出。通過單機雙屏的介紹和主從節串口通信雙屏的介紹,從不同的角度實現雙屏顯示,該系統在全國運動會上得到應用。
參考文獻
[1]柳青.程序設計語言VB及開發應用[M].北京.高等教育出版社,2004.
[2]龔沛曾.Visual Basic程序設計簡明教程[M].北京:高等教育出版社,2001.
[3][美]赫美爾.Visual Basic高效編程:改進VB/COM+應用程序[M].嚴靜東,郭文明,譯.北京:清華大學出版社,2007.
[4]范逸之.利用Visual Basic實現串并行通信技術[M].北京:清華大學出版社,2001.
[5]陳錦昌.VB計算機繪圖教程[M].華南:華南理工大學出版社,2003.
[6]王向陽,謝雙喜.利用VB實現計算機串口通信實例[J].現代計算機,2002(10):92-94.
[7]源江科技.VB編程技巧280例[M].北京:高等教育出版社,2002.
[8]Siler B, Spotts J. Visual Basic 6開發使用手冊[M].北京:機械工業出版社,2000.
[9]曹妮娜.基于VB技術實現數據管理系統[J].才智,2009(18):26-27.