第五部分 控制软件编写实例
: }1 [! b' R8 b' u: D. ^, {
. T, l# b, z& J: Z8 e0 f/ k 在这一部分我将给大家介绍STUDER录音机控制软件的编写实例。编写控制软件使用哪种计算机编程语言都可以,关键是你熟悉哪个语言、熟悉哪个语言的RS232串行端口编程方法。$ h$ s/ r) \6 p a: Q1 f7 l
1、开发环境
3 d7 r0 q$ P4 t9 B+ s7 O- W 编译软件:Microsoft Visual Studio 20107 p" i8 b" b" e: T/ o
基础框架:Microsoft .NetFramework 4.0, R- L! z4 O) D$ y2 a9 w% f
程序框架:Microsoft WPF
U1 `. p% \7 e: I' x* g 编程语言:C#& b6 S( J! [9 ?8 Z1 ]+ N2 B
2、实例功能
6 C9 p7 m. X1 K% B ——播放功能
$ l; b( `. u6 T) H ——停止功能
. `2 |2 r6 ^4 L6 Y; w; p& c/ ~ ——快速前进功能
9 s. a2 e0 M8 _% q% X% T. [# p3 n ——快速倒退功能: y" u8 I: G" y- s4 m; Q
——录音功能
! [( ]. E4 u; d ——复位功能- e' \- b- s2 v' B- G4 w
——定位功能
9 W6 N8 C4 K2 a% { 3、实例代码6 ^ g7 y! c" L4 F1 z$ ^9 x7 c
——在Visual Studio 2010中新建一个工程文件。+ o% m4 f9 ^8 Q ]
——在工程文件中的窗体代码文件中添加IO端口的引用。" V6 g! _% w% \. f! I2 w2 P
using System.IO.Ports;
7 }, y0 O- L4 Y1 f5 I$ o5 M7 {) | ——在窗体代码文件的程序类中定义一个SerialPort类型的静态变量。
1 D2 a& J9 y8 Q2 @; B static SerialPort _serialPort;" r) |0 Q+ v: R! A" V' c
——双击窗体增加窗体装入事件处理方法- R* M3 E# Z6 m, a
private void Window_Loaded(object sender, RoutedEventArgs e)) T7 m) P) u. C7 F. o b9 w8 G
{
; x5 k$ d4 g8 e }. N: W; C$ x! n0 }' \
在窗体装入事件处理方法中写入端口初始化的代码。
3 @9 w7 ?# ^ Z private void Window_Loaded(object sender, RoutedEventArgs e)# {" p$ Y) u" k1 C5 j3 e$ n* R
{
6 h3 W+ Z" I6 I" k& e //创建一个新的串口对象实例# X( u* E Q# ^" u) b9 H6 C
_serialPort = new SerialPort();
* K) v% I: V. K* ? b //枚举计算机中的串口
% H5 z; j9 S! D/ H2 W( o5 f# { string[] ports = SerialPort.GetPortNames();
; g4 |4 |, C5 W //如果系统没有串口装置则退出
6 D+ U! X3 A- Q- j! Z0 F if (ports == null)
! L6 }1 T7 Y* h* I {. U& v# H% J) p
this.close();& j% z' L- i3 G% F9 ?- w' |) _
}; k4 V, J4 Z4 l2 s
try
2 Y, c' y) O( p {# s3 [* o: b) ~8 V3 X8 H7 Q
//使用系统的第一个串行端口
+ E2 H$ {7 V8 J2 A# C( L& L _serialPort.PortName = ports[0];. p3 ]+ E) q+ G7 o: I0 O
//设置为9600的速率* f9 `% t, ]8 w8 F, _5 a- R5 `
_serialPort.BaudRate = 9600;" @. Q2 {8 w, r. i( [6 A5 t$ v
//设置为无校验
% h7 x1 ^$ f# I' f+ P3 ? _serialPort.Parity = Parity.None;0 j1 B$ i. k9 }9 R3 a
3 I0 x4 |! E- ^8 h% N
//设置为8位数据
+ [. _6 ~& F8 z* n$ r7 ~0 e _serialPort.DataBits = 8;: v: R+ n* A* \3 _9 ~1 M* \" f: X
//设置停止位为1+ q7 x A4 Z4 S+ g* q5 S
_serialPort.StopBits = StopBits.One;& h; \4 m2 `2 ~. E, P$ M
//设置为无握手
; m8 {* _7 S% w) ~: O _serialPort.Handshake = Handshake.None;) S* @: \- `& @1 @2 }: w1 i
//设置读/写超时值
4 t$ R, z$ N, T5 I- _1 f _serialPort.ReadTimeout = 500;
# P* A7 e7 o1 I Z. _: D: P( e _serialPort.WriteTimeout = 500;
* {4 A+ b* d; C( O& U2 d# c //打开串行端口
* \0 C f3 g: d( U. r. z3 u _serialPort.Open();
9 H% v- n- J: G% k" ] }
) {0 q1 i3 `7 N- ~ catch (Exception ex) l+ y6 p$ [7 E- }$ I: E& v
{' c" H9 ]- J3 ?1 D* ~2 I" R
Message.show(ex.Message);
2 E1 o% ~ ]' {2 L% r: n } ^2 }: s2 C) p7 x
}8 i c9 F+ f6 C% o7 {9 {* o
——从工具箱中向窗口添加相关按钮,命名按钮及提示内容。% T8 R M: y* ?6 {- l4 G
按键命名 提示内容
$ |; Y4 O3 E3 \- z5 W" e% R button_PLY 播放9 o# @+ R2 X- Z8 m4 i/ R* E' A4 g
button_STP 停止1 @ l' a7 D" R4 h: @2 `" o: J
button_FWD 快进. L' b& K: M1 c- H
button_RWD 快倒& y+ x# z9 B& l
button_RCE 播放+ p$ o! s: Z5 x& n$ L1 _9 b1 }* K
button_RTM 清零& Q% n2 d: \; f) @6 K# z
button_ZLO 定位到零& D7 |' I* d1 ?" N- Z) e
——双击按钮图标增加按钮处理方法(以录音为例)4 c6 h, v- @6 a9 g
private void button_PLY_Click(object sender, RoutedEventArgs e)3 x" s5 Z/ z6 Q- g
{# W% t& ~; x0 P: j5 |; p
try' ]7 `: w8 |7 J9 ]
{. [* I( h% o0 m2 d8 U( P" P
//发送从输入信号直接输出方式控制字符串
% ^8 c" B# r: k5 K _serialPort.WriteLine("INP F ");
6 t/ D8 ^! Q4 S* {+ b8 o2 N5 o
6 A5 V, ?2 E8 q! R //休止100ms
. H. T3 R7 K. Y; O7 _ Thread.Sleep(100);
) B! s8 N3 Y& a {, F$ p //发送所有通道Ready的控制字符串
3 I) H/ p9 U2 B/ n6 e3 e$ y* Z _serialPort.WriteLine("REA F ");
6 q! M' D1 h3 Q( I7 m/ o Thread.Sleep(100);
8 G! g5 h$ h% D5 I6 T* T* H //发送开始录音的控制字符串。3 z9 H1 r& _1 \9 r
_serialPort.WriteLine("REC ");. b1 h7 p, f# ~5 {5 d! ?
}0 A) Q( r" }! [* c6 S
catch (Exception ex)
" U, W- |7 [* L$ z! _& u {
) Q+ N. L7 v. Q4 m1 C3 L9 q Message.show(ex.Message);' K* a' a. |/ {6 s1 @0 q
} ~: G V: u! B3 c, a% l
}
: p4 g$ T1 G6 A# S9 ~" v 注:发送REC指令后录音机就开始起动录音,不需像手动录音时需同时按送录音和播放键才能录音。
, N5 K% p+ o$ U" C* G 按以上方法增加相应按键的处理方法,并发送对应的指令即可。
, v! h, @& C5 _& e6 k; `, @ 播放控制字符串:PLY+空格+回车7 U3 T0 N6 b; y9 S0 i3 O- Z2 n
停止控制字符串:STP+空格+回车# p6 }( q( Y( h. j* i) p6 ^$ O
快进控制字符串:FWD+空格+回车' X# m1 U1 S+ \* }) B
快倒控制字符串:RWD+空格+回车
- [6 z2 T6 H7 o0 z 复位控制字符串:RTM+空格+回车
9 A0 d0 e: s! ]! c) f; Z% M5 q 定位到零字符串:LZA+空格+回车" h; E! Z2 m: c3 t0 n6 V
+ n; A f k( W4 |1 H; A! C 写好这此代码后,接好连线,编译运行就可以控制你的录音机了,就这么简单,你不觉得吗?!{:4_240:}
- J4 P4 D+ W' v' [ ! ^& R- g ?+ f/ Q y( }! Z
有了这个基础,你就可以根据STUDER控制指令集实现更多的控制功能了。
( M) N; I( r$ D& o5 b |