1.下载 免费版 Visual Studio 2019 并进行安装
4 K4 _7 K' e! _. Y! U8 S' D
5 U- _$ J- D9 q. Q, Q+ Z6 @7 \! o# f! l
) o m" f% N8 w7 ?8 D
2.双击软件创建项目
5 X6 H7 t: k$ r2 v' t1 W# H& }" R* N+ P
: A( o1 z5 @: A+ \" U6 s) y3 S
, n( Q' [8 x/ ?4 O+ e
& v$ U( s1 \3 F- T, T
; ]4 }2 t# |. [7 O! G
$ F! }/ O( ?3 A3 Q# L3.选择Windows窗体应用程序(.NET Framework)创建项目。$ q9 u' P2 Z% \, g. X
* y% O8 C k; F8 f8 h8 _; P" G, j5 N. Z5 C* T/ W ~

$ v7 I& k9 F8 N8 z; H% i! f) h2 A; K! I
/ v* ?7 ?- W/ y% `! `0 P# k4.项目创建完成,初始界面。% t% s6 x1 [# m- @" Y
; h5 _9 w+ e8 C, y) X' Z

: L3 E8 g1 h; s: A2 ^- z$ Z9 ?0 A/ [, d7 Y& S% z! \
5.选择左侧的工具栏,选择 组件,然后双击 串口组件将串口添加进入项目。
/ R# D% ^; \6 n3 G5 ]! t6 P2 S2 u( U" y0 o/ a
/ g" ]7 D4 s( G4 m% N
( l# h5 J# ^5 \& W6 n+ Y
6.开完会了继续编辑,(●'◡'●)
! ^! R% u6 ]5 c; U" v7.点击鼠标右键,修改串口模块的属性,包括 波特率等,本实验采用默认。
) G" r {0 S* D+ f$ {
+ o3 j- Q+ A y2 q$ i
3 n" @/ v3 Q4 K8 o2 k1 d2 Z- @5 ?
. N2 B' x* a/ N" J4 |" e6 o8.双击串口模块,添加数据接收中断函数
) u z M' M& u; A# N% v% O& O# s+ H- ] k6 S1 L I0 W% M
, s7 r* I2 z6 Y F
M. w4 f7 i# g) c
: X) G; Y/ ^1 J) r% E$ O
9.添加按钮模块,控制STM32开发板LED灯的亮灭。5 K6 v5 c8 ~9 z$ L l
% y4 p: a6 C% [: R

) } H2 l$ T/ q
( t+ h( |' j" f8 d* |, @& K! D/ r& n8 M) K. \' @: J0 j- E1 ?
10.好的现在基本界面与模块添加完成,开始写程序,添加程序各种变量:
' s5 m! P8 N R' c- //串口通讯命令
7 i e) D. }5 b8 E& u, b4 N - public static byte[] SendOrder = new byte[3] { 0x5A,0x00, 0xA5 }; //中间为命令,头尾为校验 00 关灯 01开灯 02关蜂鸣器 03开蜂鸣器+ i8 ~6 o4 b, f* E) t' f* @
- // 串口接收* B2 w- z* j" {1 u. h& s4 D8 v
- public static byte[] revcmd = new byte[3];
复制代码
' H: ]0 O3 o2 {1 y11. 开灯LED0程序如下:% t! }3 X6 W& |" |8 w* n7 N
- private void button1_Click(object sender, EventArgs e) //开灯LED0
1 m' j+ l8 J4 [, R - {6 D* F- L# j5 t+ b7 h( b+ M
- try7 a" L* e+ R+ V( q
- {
1 }& A5 L# L& C- M2 P/ [& k - if (serialPort1.IsOpen)2 K/ \' o: v* V' t( i! T) h
- {$ A, e9 R% C* Q! w9 @3 T
- serialPort1.Close();& I T8 B) f C& A* W. }
- }, K2 ^" F1 G3 u" w' Q) @( U
- serialPort1.Open(); //打开串口6 C$ E5 S% n5 S) [8 t; F
- serialPort1.DiscardInBuffer();//清空缓冲区数据- B0 Y% n1 r3 L% T, t7 k2 I
- SendOrder[1] = 0x01;//发送开灯命令
$ Z5 M) v! M. G% O* g; x - serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区4 E I7 K5 R" L9 ?
- }9 v3 Y3 r/ `9 Q" j9 W. v, C$ C% o
- catch
1 Q3 ?- F( ^2 j, U( N: `5 p - {
4 `7 H# ?3 a0 [- F; D; l: _ - MessageBox.Show("请检查串口1是否打开");, d6 z* P+ \( n
- }
% N- ^+ }+ I4 ]) ?2 J - }
复制代码
4 s4 V/ N* B) V12.关灯LED0程序如下:
, h( ?' E S" @3 u }9 B' J- private void button2_Click(object sender, EventArgs e)
: z. [" {0 Y2 Z% i' f p - {
1 `: t0 f+ b( v, R" C! p" \ - try
" x9 h/ ]6 J9 G& ^, ~# i' t5 E - {
+ t. }' w4 X/ \ - if (serialPort1.IsOpen)
3 }. B2 Z( U& o8 B: P( e/ s - {4 Y! e. l+ C: z$ x, m
- serialPort1.Close();% V0 E/ V; z1 q* k6 w8 x7 H
- }6 R3 C/ F/ g# T/ M8 n: G
- serialPort1.Open(); //打开串口/ w% z S0 M' H+ ~* G( g4 W
- serialPort1.DiscardInBuffer();//清空缓冲区数据& L5 k7 O) w* F9 K) Z( ]
- SendOrder[1] = 0x00;//发送开灯命令
+ t+ d: | M2 g - serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区
8 G7 i! B. L" U* Q( `$ R) g - }3 x3 ?; M9 n" C' z
- catch3 p$ R% [& J3 L0 g; h( x& ^
- {7 c! a! ]+ j" P9 }# l
- MessageBox.Show("请检查串口1是否打开");
) f2 V/ o8 u5 ^( R - }
w' y% t; \6 P - }
复制代码 & ^8 E5 N" ^. c0 v
13.蜂鸣器程序留给大家写,偷个懒(●'◡'●)$ @$ ^+ ?3 e( f; G
+ u% {1 W1 o! c$ T6 V; t2 Z
14.串口接收函数如下: ^( q7 G% i: V9 W9 p) x1 f, t
- private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) //串口接收中断
6 Q- { N' J! m8 C4 Q: Z9 ? - {
' T: a/ ]) c: X4 J# Y1 f( f. | - try
, B+ s' z' l& w2 {$ L/ O9 o- k2 r - {8 ~9 `) _$ M# @" H
- serialPort1.Read(revcmd, 0, 3); // 将接收缓冲区输入revcmd, @6 X* N/ o# w8 L
" K" h& _7 F% ^( u- }
& n$ s" B- _# { |2 v - catch+ Q% r3 Z* k1 t% v8 s2 _ k9 Z! o1 C
- {
# f/ a6 N+ J- F M8 L, M - MessageBox.Show("请检查串口1是否打开");$ C7 M& k" k! {
- }
7 x" ~ b8 h$ m& n! [ - this.Invoke(new EventHandler(ComService)); //调用事件处理函数
7 @* |7 } `+ ^! z) }0 _9 n3 ^) @% b - }
复制代码
$ e: b- R& B* ~# d" i' l# Q' r1 W2 A# Q( D! T w
15.串口接收数据处理函数如下:
1 q" a0 u" V4 c% ]/ Y0 h B! n- private void ComService(object sender, EventArgs e)) n+ W% W/ E8 {1 J; ^4 Z7 f4 H) C
- {
6 ^$ u/ ~' _6 o' ^, e1 O6 |6 u: n! U% r - if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x01) & (revcmd[2] == 0xA5))
0 ], A+ }2 @8 B' f, ? - {
6 D, |% n/ j+ U8 o6 M - button5.Text = "灯开了";
, u o9 ^! J* }6 [4 @# Z6 y! h& z2 T - button5.BackColor = Color.FromArgb(255, 0, 0); //设置控件颜色为红色9 f' P) I$ M5 b
- // button5.BackColor = Color.FromKnownColor(KnownColor.LightSeaGreen);; //设置控件颜色为- O1 x8 S( M8 y/ |0 x
- - a H2 V, v$ l8 p; j
- }, w2 f+ k. A- E @% \
- if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x00) & (revcmd[2] == 0xA5))& }5 W' C0 z2 u( d: S, H; d& H
- {8 V* F, Z6 d! C1 @; {6 m3 l8 h
- button5.Text = "灯关了";) \: C- e# D) @4 d2 {: F' ^
- button5.BackColor = Color.FromArgb(224, 224, 224);//灰色
$ s, p( E7 ?( X0 q - }
% }6 e6 b6 ?5 N$ F' f - }
复制代码
' s8 d. W/ C" U
; N9 z9 l! z( v ^16.上位机程序编写完成。
& K8 O8 F7 R5 r; H4 N/ ~0 e( b4 q
" X- m7 N% }% p- }17.下面开始写STM32开发板程序,这个比较简单,大家应该都会吧。(●'◡'●)3 n5 i/ f0 q2 K. [2 A
1 R/ g( A+ ~' Y- void USART1_IRQHandler(void)//串口1中断服务程序
* X: S! Q, g0 {8 E1 | - {
% g" T1 `9 w' d8 f0 O) I( {* b - u8 res; ' @8 H- G; M- u2 Y& R" W# Q
- USART1_StartFlag=1; ; C. r1 k& g; X$ I& s) n
- if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
( f% F8 F! k* u4 S - {7 t* [- F+ l8 [2 V4 w/ j
- res=USART_ReceiveData(USART1); //读接收到的字节,同时相关标志自动清除
4 i' N7 L8 y2 O6 L - if(USART1_RX_CNT<100)6 l* ?' t: l2 d3 ~& ~7 ]1 j
- {- S9 f& t' @( ^3 x# |
- USART1_RX_BUFF[USART1_RX_CNT]=res;
0 d7 z, w0 g9 [" E2 W% }; ` - USART1_RX_CNT++;
6 E/ \, A* s+ _7 \# [; f) E
7 S, T9 J# l+ I2 x4 x9 d/ B- TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除定时器溢出中断
3 s3 m3 k$ D: E9 p6 v9 ? - TIM_SetCounter(TIM7,0);//当接收到一个新的字节,将定时器7复位为0,重新计时(相当于喂狗)
7 P7 _# q: Q0 ?* |5 U4 Z E& y - TIM_Cmd(TIM7,ENABLE);//开始计时
7 U/ D- a% v# v5 {, @, x - }
# K. e- @0 M) |; C - }( Y9 w. L" V& d4 N' m
- } y; v3 y# g2 C ~% Z6 w
- 4 g+ d, s% x. q3 K
- / / u3 a. ]: j" N
- //串口服务函数
9 ]8 j, I" g J$ T' y3 k - void USART1RX_Service(void)
( _: e, \) E$ `9 a+ L - {( P" h6 @7 [9 X7 W
- if(USART1_FrameFlag==1)( o2 L& F. [# c) a
- {% V, D9 J4 h+ l" N
- USART1_StartFlag=0;
' V" }( B, P% A% [/ J* N3 R1 _ - USART1_FrameFlag=0; //复位帧结束标志
3 V; {. b: m1 }" k, `4 {- ` - USART1_RX_CNT=0;//接收计数器清零
3 m Q9 D @2 Y5 d4 K - if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x00)&&(USART1_RX_BUFF[2]==0xA5)) //通讯测试 5A 00 A5/ j6 K. L3 K2 y+ L9 s+ M# E5 c
- {$ r+ j; e( D% E( u* ^% P# {+ {' t; ~
- SendBUF[0]=0x5A;
) y K" Z) ^/ x0 ?' J5 T+ y - SendBUF[1]=0x00;2 h' ^( R% }+ C% d* o* J0 {, Q
- SendBUF[2]=0xA5;; p% s) C+ M2 F D/ H9 C
- LED0=1;. j* y( f0 h- W* R8 K& E1 W
- USART1_SendData(SendBUF,3);
1 V% r* [3 S) x8 x7 \; q - . H. T9 q& i+ c; M( d! O" S+ f
- }0 G2 _' m- V; ]7 L* m
- if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x01)&&(USART1_RX_BUFF[2]==0xA5)) //通讯测试 5A 00 A5
! g( L& g0 p( K/ d; n - {# p- M8 h6 G% \* S- a! j
- SendBUF[0]=0x5A;
9 @ ?& ~" ?' w+ i" V - SendBUF[1]=0x01;3 H! {3 `$ S" }0 T3 Y. K, y
- SendBUF[2]=0xA5;
) r' M5 i8 k0 H - LED0=0;$ p- \! x, \" k( Z; L N
- USART1_SendData(SendBUF,3);
" I5 P* f: c$ n$ m: N( ]! ` -
- z7 r$ ]. K2 i9 h - }. S E0 c6 K" w% F) a# b- i5 M+ w
- ' w! F/ F: ?9 h a
- }- k0 {3 b7 f$ g
- }
复制代码 4 h8 x; n. q; s( |! ^1 d% |' @
19.下面进行配置电脑,由于水平有限,本程序需要设置电脑的COM口且需要改为COM1如下图:
: M: q- V0 I2 r0 K1 n
) [5 b b" ], r! ?
4 L# n/ n/ T* ]( v) x% O或者更改VS2019中串口模块的属性,如下:- N/ c3 N' T6 @7 }( h1 c! H9 ~& C
* _( f! k# m) t- z; ~! u" J1 D# B& n0 z1 b ) f' l* e% Y7 X$ }; u& t0 _; e, @
9 r0 X7 W: v1 @2 G$ @" F5 E2 g---------------------1 Y; w7 Q: L5 R( A/ J
作者:刘东君
, n2 v$ d$ @2 Y. l: d5 s& _* ~( r2 ~/ `# t! x* k
1 z; i: [" L( x: }7 P+ U
. }& L9 n; _8 S' F
: t+ v8 E. v; Q( T
# A/ G" G3 L: }+ n
$ C+ Y) G9 O' o7 y5 Q& q" g& O/ B |