第五部分 控制软件编写实例* F# c# q* v! p( k u% ?: i/ n
6 u4 ~3 m6 p- r( a4 w5 W* b( X( v
在这一部分我将给大家介绍STUDER录音机控制软件的编写实例。编写控制软件使用哪种计算机编程语言都可以,关键是你熟悉哪个语言、熟悉哪个语言的RS232串行端口编程方法。
& D H0 {' Q2 ^& X 1、开发环境, @/ f) f7 _! ^ U3 m& X$ ~
编译软件:Microsoft Visual Studio 2010( v! K$ N, z5 R3 b- k& E2 W
基础框架:Microsoft .NetFramework 4.0
) a" F) G8 Y* F! s" J: M; |* k2 K$ O 程序框架:Microsoft WPF! p' b8 q" `0 c9 J) k
编程语言:C#; l# T" c4 M# X# a& o9 `
2、实例功能; G, V" u) l- P' g
——播放功能1 x; c; z G. V* ]' S. K* s6 f A+ o
——停止功能
- \1 X. A9 M- \ G) l$ H* l ——快速前进功能! d7 X& }2 |) C1 g
——快速倒退功能
" Z7 U G5 h C- ~3 s ——录音功能
9 F0 C; Z# T% @. |1 q4 ~* r ——复位功能
?( C2 W; f3 X& R ——定位功能7 Y2 O# f( a, Y6 C$ W
3、实例代码
. Y* w6 S! K- F5 D: z; B0 Y4 o% j ——在Visual Studio 2010中新建一个工程文件。: @0 j1 p2 M( A4 r1 ^$ y$ G) k
——在工程文件中的窗体代码文件中添加IO端口的引用。
! S/ o6 ?3 t. ?8 b' v& Y3 q8 @ using System.IO.Ports;7 t; B$ c( n: l( M
——在窗体代码文件的程序类中定义一个SerialPort类型的静态变量。
2 M( X" u+ o& t5 H8 M static SerialPort _serialPort;
+ q! B1 M' b0 ` ——双击窗体增加窗体装入事件处理方法1 ]& |' c! b; [* N
private void Window_Loaded(object sender, RoutedEventArgs e)2 E- p! ?6 z% p5 C W
{
3 c1 V/ Z. f2 i' _' ?; \ }
, S4 B. U9 R$ O: `' S" k( n* P 在窗体装入事件处理方法中写入端口初始化的代码。
' b- D. e5 p& \# a' C$ d$ k1 {5 B- @ private void Window_Loaded(object sender, RoutedEventArgs e)
" m) d% J2 t1 {5 u {
1 n% T7 Q f2 N7 Q2 H' q //创建一个新的串口对象实例3 S* Z* N) _( K2 t/ H& g2 W3 u4 {
_serialPort = new SerialPort(); P4 F; X1 l- l' p3 A
//枚举计算机中的串口 @1 d; ]! N! S+ t& J; E* e* g
string[] ports = SerialPort.GetPortNames();$ i+ a2 j9 z! s. u: R' D
//如果系统没有串口装置则退出* J- E% b% v, p$ v4 }0 u2 Z
if (ports == null)9 i5 w% b% u* U! g6 I. y
{
( \, J5 H" h ?( v) W% y this.close();
+ z2 x+ M% @- i J! b }
# ]4 z* k! s+ S- h, l try6 s, G2 c8 C8 e5 t' W$ h( S
{- e. Y" A! r9 j
//使用系统的第一个串行端口# O! u: A3 T9 v1 o, W
_serialPort.PortName = ports[0];
) u$ h( d+ T4 |9 u( t3 l+ y //设置为9600的速率+ b& _2 V" W; h. G, n! m4 ~& E A- s
_serialPort.BaudRate = 9600;7 ^" [! s8 d5 s" O. J3 r2 ]
//设置为无校验
" g9 r) C( z6 j9 g& a _serialPort.Parity = Parity.None;
! W0 d8 G* b) y$ k2 R9 }! Y5 A ( L, Y# |/ C" r
//设置为8位数据9 d) [. p! F T* Z4 i7 u. D1 {) v
_serialPort.DataBits = 8;
" V5 o9 N" A) N2 N9 k, N //设置停止位为1
. p( }7 B+ |! }/ X) _% L- I _serialPort.StopBits = StopBits.One;
5 D6 m- i# P: S8 J& b% ^* p8 _# G //设置为无握手
6 K! B3 B6 w; e; t& Y; n2 K% R4 q _serialPort.Handshake = Handshake.None;' O1 T4 B; H8 T2 U( E) C
//设置读/写超时值
; R& b1 @( h1 B _serialPort.ReadTimeout = 500;% F7 n* b6 V* ^- b
_serialPort.WriteTimeout = 500;7 W4 A) P) T2 @( X& t
//打开串行端口! i- U+ M5 }( Y: W
_serialPort.Open();
8 \: U; [) E7 H5 O }' ]# ^6 q; ]( o1 Z- |3 X
catch (Exception ex)2 i% _7 S# ` D2 L. a3 D
{
2 o' P+ |4 {1 Q0 f Message.show(ex.Message);
! w4 J$ [% ~7 E4 Y4 w }* b5 V! M# ^- m. s1 L! T; j
}' `+ f! h% |5 d& {1 ]2 h
——从工具箱中向窗口添加相关按钮,命名按钮及提示内容。: \4 o9 g: P# n- Z
按键命名 提示内容6 V0 X+ \- u4 `+ i
button_PLY 播放; U$ {* E/ D! K2 A* K, A
button_STP 停止3 ^! I/ b, v7 z' Y, F& x
button_FWD 快进
& {4 e; v" O3 ~1 g3 x$ B button_RWD 快倒! L0 J1 v) ?8 [4 s# E
button_RCE 播放
# [. l% p2 O9 n: @$ W5 b; v button_RTM 清零- Q3 i, ]3 ~1 n S) Y& x7 P }' O- j
button_ZLO 定位到零
. f6 }' r: P1 a% m% i ——双击按钮图标增加按钮处理方法(以录音为例)
. Q" ] M$ X# n; \ private void button_PLY_Click(object sender, RoutedEventArgs e)
0 l; f* \) f( R {
6 R# C- \' r: p7 {3 e3 g try
) l8 L3 d# i' l$ g8 S# W7 n {
- a4 S+ M/ ~$ d% y9 H& F, D9 m //发送从输入信号直接输出方式控制字符串/ A" f' f7 r0 k7 X% d/ `) z
_serialPort.WriteLine("INP F ");5 C5 A& I& u$ m" [8 i' M0 |
8 L% z: Y* H2 i$ |5 r; G3 K7 x- Y //休止100ms
/ t' R' x# C* F, q8 _/ J Thread.Sleep(100);
" N/ i _5 L' o( R7 w1 Q# c //发送所有通道Ready的控制字符串: c2 N5 V* z* }/ j9 d& t, E
_serialPort.WriteLine("REA F ");
a( q+ W$ o0 M- q: ~ Thread.Sleep(100);
, V" H$ W+ Y2 q) m! N p" K //发送开始录音的控制字符串。
! O9 J( g d% ^. p n9 d) U7 P1 \; i _serialPort.WriteLine("REC ");
. h2 K- V0 I3 {) V. O+ w }
: U/ ^0 i1 C: o catch (Exception ex)3 @0 L4 t8 i r
{
1 t2 d- Y$ C1 Y6 P+ ]' r+ F Message.show(ex.Message);$ c/ h$ _# @% e! j9 @+ O3 S& t
}
" _* U6 r0 \, s+ ~% }0 x }
- [5 I. ?, h$ i3 W' c 注:发送REC指令后录音机就开始起动录音,不需像手动录音时需同时按送录音和播放键才能录音。
$ Z) r3 i0 g) s1 A+ S 按以上方法增加相应按键的处理方法,并发送对应的指令即可。
+ V: p H7 P7 O 播放控制字符串:PLY+空格+回车
* K3 I; m( Y' L& Y0 S: s 停止控制字符串:STP+空格+回车) C, i$ c* T! l) n/ t) i- d
快进控制字符串:FWD+空格+回车
( c! ?3 F& A* z( i) s 快倒控制字符串:RWD+空格+回车
$ ?" [% B3 j, Q 复位控制字符串:RTM+空格+回车, l4 y* \! {0 {
定位到零字符串:LZA+空格+回车6 m- H4 ` }- b
. O+ M. J" f, Y, v9 O7 K* K
写好这此代码后,接好连线,编译运行就可以控制你的录音机了,就这么简单,你不觉得吗?!{:4_240:}
; j/ h4 p/ G) ~& y e 2 ?# b: ^, t; v9 i! o0 X' w; G
有了这个基础,你就可以根据STUDER控制指令集实现更多的控制功能了。" M6 V, d+ L; C: f E/ H/ T+ p
|