第五部分 控制软件编写实例 
4 U  u1 X7 N" a& L% n# C 
7 I/ G( X9 V+ a2 A: s1 s1 j# U, B    在这一部分我将给大家介绍STUDER录音机控制软件的编写实例。编写控制软件使用哪种计算机编程语言都可以,关键是你熟悉哪个语言、熟悉哪个语言的RS232串行端口编程方法。. V* `: I% X; U% ? 
    1、开发环境* S& @( ^- \$ k) H) Q- } 
    编译软件:Microsoft Visual Studio 2010: o+ I, x7 e! K9 {, L 
    基础框架:Microsoft .NetFramework 4.0 
$ H) A6 k/ U9 J- ~    程序框架:Microsoft WPF 
7 Y% D6 I( U: V  V* l    编程语言:C# 
  {6 Q$ W# K8 U( f1 e7 j' \/ A3 J7 M    2、实例功能 
8 ~: v  ^, {! l    ——播放功能8 T0 i7 }+ N# e: h2 W: l 
    ——停止功能" x3 C% G( _" T, A 
    ——快速前进功能2 D, Q" \2 ~* m  N: z/ l# u& _ 
    ——快速倒退功能" @5 n% Z2 d! N! G/ U 
    ——录音功能' Y& u/ c" ^' ]2 M5 T; u! h/ U 
    ——复位功能0 M5 y2 d4 C" j9 c& L; A 
    ——定位功能3 T) H) Z+ m( A3 ]6 y; W 
    3、实例代码 
& C' b# R5 u! Q3 z: {6 A    ——在Visual Studio 2010中新建一个工程文件。 
8 r8 c/ [6 a' H  K8 m% F! C    ——在工程文件中的窗体代码文件中添加IO端口的引用。 
5 }1 T4 a6 ^. Y  ?: |        using System.IO.Ports;$ s8 h! D) I  R; q$ h 
    ——在窗体代码文件的程序类中定义一个SerialPort类型的静态变量。 
  s7 ]9 z' Q- Z8 R, l7 S  ?  R1 h static SerialPort _serialPort;3 `. D; _0 m7 [  K: f% [ 
    ——双击窗体增加窗体装入事件处理方法 
* R: y$ f; S& Z1 j- J5 q        private void Window_Loaded(object sender, RoutedEventArgs e) 
/ a$ z& N  N; `: }( X/ c+ {) U        {& a( h8 ^1 h/ t* \. n$ ]5 m9 g 
         }7 b$ j' z  u' W9 W: Y3 T% Q 
       在窗体装入事件处理方法中写入端口初始化的代码。 
+ }; b1 a  p: Z$ M1 B       private void Window_Loaded(object sender, RoutedEventArgs e)- O4 W8 E/ J+ k5 h% r( I! O( J. n 
        { 
# K+ ?4 D7 y( Y7 t            //创建一个新的串口对象实例* A2 y1 z" K) J% ?% e6 y 
            _serialPort = new SerialPort();9 `+ R/ Z* ?! \. e( R* x 
            //枚举计算机中的串口 
4 Z* c; Z: h  d2 H            string[] ports = SerialPort.GetPortNames(); 
  M  E# F, J3 n) @) T; R            //如果系统没有串口装置则退出 
4 B$ m# R3 L' l7 i5 ?- o3 U            if (ports == null)* j9 w9 _* A' n: D; h5 P 
            {" W( Z. H7 G0 k$ G  e  a  n 
                this.close();7 j( Z. v* f# Z; Y1 G, U 
            }; w/ g0 j% ]" y9 o; J9 } 
            try 
4 z) C+ L& O+ a/ _0 D: S            {* @% n. ~) a& X1 e& f 
                //使用系统的第一个串行端口  ~' c" |8 ]6 |% m2 v, b 
                _serialPort.PortName = ports[0];" y6 X  l0 ]- b5 r) b8 c) Q 
                //设置为9600的速率! S: r% D3 ?- K- H& z! c  f 
                _serialPort.BaudRate = 9600;8 T& V% w6 F2 a, w9 L( U 
                //设置为无校验 
) y2 G& N- I3 I8 ]/ ]; J7 P# {                _serialPort.Parity = Parity.None; 
. R6 W6 R9 S' G9 F) b9 ?4 Y                 
: b9 ^0 }2 n: B; V, ^4 ?                //设置为8位数据 
" x4 Y) K3 p3 w: s( L4 o                _serialPort.DataBits = 8;; Q, t+ A. Z1 p0 d5 I, o 
                //设置停止位为1! R9 L- h% r, [1 K( z/ s! N 
                _serialPort.StopBits = StopBits.One;  C, J8 y" p! w+ M* L# d7 Y 
                //设置为无握手 
+ X  t8 `% L  h. L5 s: P5 V# |2 A3 ]                _serialPort.Handshake = Handshake.None; 
, p8 G0 p, S' [. h1 c2 b0 e                //设置读/写超时值: c) M# M. C2 I% K! u9 { 
                _serialPort.ReadTimeout = 500;" [( y: d" X& b' E% u 
                _serialPort.WriteTimeout = 500;3 c/ j5 q% `1 H: R8 m3 T; h 
                //打开串行端口. Q6 C" ?) s( ^  | 
                _serialPort.Open();& l, P9 Y( k% ~! `( ~, H 
            } 
; ?/ Y7 F. y3 }6 n0 S            catch (Exception ex) 
( r# {; M9 r( d6 k3 b1 R. k            {+ d4 A6 z8 i- V6 R0 Z 
                Message.show(ex.Message);1 k/ _( M5 N, {# E# ? 
            }7 P6 u" q# o; I4 K* V$ D0 b, ^ 
        }) u$ b. h% R5 X% b# L- `2 q0 I 
    ——从工具箱中向窗口添加相关按钮,命名按钮及提示内容。 
& x. ?" X; g; f        按键命名          提示内容 
1 p6 J& Y. @) `4 z7 c( c# O        button_PLY        播放 
& D! |3 S; U0 r1 y3 q; L        button_STP        停止 
3 x/ ?, h. l3 M( |        button_FWD        快进 
' ]- s6 O* L" n" s4 V2 R) l        button_RWD        快倒 
; j* @$ X0 H% s4 Z$ M, @4 o/ a        button_RCE        播放 
9 E% ?7 J4 `- N0 C, Q( G        button_RTM        清零; Y) |6 C( b; q7 @) _2 H 
        button_ZLO        定位到零/ f/ Q; @2 t; t5 V0 L! T+ n8 f# p4 _ 
    ——双击按钮图标增加按钮处理方法(以录音为例)6 q/ }3 Z" w' h+ n/ ^  w 
        private void button_PLY_Click(object sender, RoutedEventArgs e) 
/ W$ H2 R8 ~% w  \. ?3 M        { 
4 |0 M2 c2 h+ G8 M            try 
; y5 d- y$ k9 d& @0 ]0 r            {. X( \0 L( b/ @6 l/ _: P 
                //发送从输入信号直接输出方式控制字符串 
3 r& @3 p2 s6 U5 S& ^                _serialPort.WriteLine("INP F "); 
) I( d+ L) K# k2 L0 j& P7 w7 n                % r% u6 o  k; J6 M 
                //休止100ms3 c0 v# p7 W1 F7 _( [4 @ 
                Thread.Sleep(100); 
( P9 h& j; d4 _* D& d7 F& {                //发送所有通道Ready的控制字符串. O# E  D) R1 q  L 
                _serialPort.WriteLine("REA F ");               9 l# k0 Z1 Z8 J; x& w0 d8 F 
                Thread.Sleep(100);7 R7 z  I( h( z+ V4 o 
                //发送开始录音的控制字符串。* M4 m# i1 }) a4 W& ]! k% Y 
                _serialPort.WriteLine("REC "); 
" p0 h1 N5 P) S. ?4 w% a; b$ g- K0 s            } 
$ f6 a' P0 n0 ~/ D/ @            catch (Exception ex) 
2 z) C* B% l# i, ^- W+ @4 k8 g            {; p) v( B' W6 _0 v; ^0 F8 u 
                Message.show(ex.Message);9 s! b4 J2 n/ a" A( W( }) w+ k/ ? 
            }; a! q( g1 w8 ~+ z8 D0 g& w. | 
        }, Q* J  d' [8 n 
    注:发送REC指令后录音机就开始起动录音,不需像手动录音时需同时按送录音和播放键才能录音。2 v! H. R( L& j+ W9 T 
    按以上方法增加相应按键的处理方法,并发送对应的指令即可。 
/ H3 q) [" e4 f    播放控制字符串:PLY+空格+回车 
; B& _3 N6 u* ^9 g' n    停止控制字符串:STP+空格+回车' @( U2 G. i  u+ M$ J! o+ g 
    快进控制字符串:FWD+空格+回车. ]2 y% ~% [1 R" T6 [: m+ \6 n 
    快倒控制字符串:RWD+空格+回车 
& {* R0 k. u. o0 C* T    复位控制字符串:RTM+空格+回车 
% ?% C% R  t( E* w/ n4 ]$ ?    定位到零字符串:LZA+空格+回车 
- f" y7 C& M; t) g  
+ _) H' G& r$ N. E% {  a- t9 U    写好这此代码后,接好连线,编译运行就可以控制你的录音机了,就这么简单,你不觉得吗?!{:4_240:} 
% O( C1 a" u8 k+ W  m 4 O2 V2 ]$ O! X# ^' E2 @ 
    有了这个基础,你就可以根据STUDER控制指令集实现更多的控制功能了。 
1 p, ?: T4 Q6 S- g% {2 e |