1.下载 免费版 Visual Studio 2019 并进行安装7 {6 f. z+ H* p
5 A v! r' c+ K+ h/ L# Y0 c
" ?$ \* g3 H! k# y- g+ R5 H# G% ?
- k/ u" J# V% G/ T8 ?% C1 t
2.双击软件创建项目' A- @/ j* k2 { ]4 v3 F# ~# O7 A$ t
8 o1 ~4 F ^; m* g2 h" ]: F: B5 f: \
. q/ f- O# g- }+ q- E5 O " T+ s- ]% I( Q
) Y+ N4 h! A: t6 R3 R' F% s6 L
. C$ B" Q6 c |. Y4 u
6 y0 H) r- }4 m1 ]1 z5 e3.选择Windows窗体应用程序(.NET Framework)创建项目。
( ^9 p/ d* q' d$ ?
V) M6 O* ?% o% U. b4 V/ z
6 u0 C* C! f. ]. z' i 9 N, I5 h! {. \3 p2 f0 H# K
! m. {: }3 W! K K1 y& d8 S* R6 o
4.项目创建完成,初始界面。* {3 ^1 p; y. L; t8 Z- p' N6 o
3 b! M2 ^0 f( `9 d2 q2 M5 D6 w- u/ X

1 @4 \$ } w8 {2 F% e/ i0 W3 k6 X# I3 i: |" [# M3 {- Q. @
5.选择左侧的工具栏,选择 组件,然后双击 串口组件将串口添加进入项目。$ ~4 w# _* F$ G8 h; @
( H3 G2 f/ D$ ~9 x& I
3 h! C6 Z- V3 a {4 i$ d- [5 ^. V6 Z; X0 `- n
6.开完会了继续编辑,(●'◡'●)
6 W- l1 s! h/ `+ D: H% `+ f0 k& \$ S% I7.点击鼠标右键,修改串口模块的属性,包括 波特率等,本实验采用默认。 m9 a& T" u/ {1 `/ i7 e" l0 W* c
( K" B' g9 n, K* Z; ^
8 D) B$ f" p# {9 w
I1 \ {5 `) F3 Z7 G( ^
8.双击串口模块,添加数据接收中断函数
( D( c+ r8 N. e+ @' P, F
) u7 b2 L6 A8 S$ E
5 C; S/ c. y, L2 Y8 `: A
3 u4 L0 k# U; E+ x5 e
7 v3 C8 C! P; b0 _9.添加按钮模块,控制STM32开发板LED灯的亮灭。' Y# X' j# Q; \# p
% T1 H. _7 \6 V: x
5 Y- Z+ C$ F+ B( X g, J
) W$ \& X' ^) F# J# _4 C8 D8 R! s: W2 K* s2 W; `% E
10.好的现在基本界面与模块添加完成,开始写程序,添加程序各种变量:
) ?8 b8 w4 q, w4 P' D- //串口通讯命令+ K& o* E5 v5 P; ?, N$ p
- public static byte[] SendOrder = new byte[3] { 0x5A,0x00, 0xA5 }; //中间为命令,头尾为校验 00 关灯 01开灯 02关蜂鸣器 03开蜂鸣器6 u, h4 g2 L& v* H
- // 串口接收
! n; j3 v5 a0 `; U5 l& n" A - public static byte[] revcmd = new byte[3];
复制代码 3 z& k! d6 Z( C" J8 p5 x0 L+ |
11. 开灯LED0程序如下:
& {1 J3 g8 a% B9 `$ I' m- private void button1_Click(object sender, EventArgs e) //开灯LED0% z& e- R: n$ [& i. n, p9 D8 Q3 G7 }
- {
0 q6 I0 E) K% d" _9 L- } - try
' D0 q- H8 B. w) x - {
+ Y* p3 Y3 t/ G# q9 J! v0 d - if (serialPort1.IsOpen)
9 M) i* I. Z- f& U4 ^' b% [ - {
" P0 H7 Y6 H* ?: d/ G7 ]8 H# {% a - serialPort1.Close();/ Z) m. J1 s& h
- }
- t4 x; U5 w7 d% f3 m+ u( l - serialPort1.Open(); //打开串口
, D: Z# g6 @1 L0 E1 T9 t - serialPort1.DiscardInBuffer();//清空缓冲区数据' Z! ~# o( D* Y# G2 Q8 G
- SendOrder[1] = 0x01;//发送开灯命令
8 Z |. W2 S0 w% H$ I - serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区$ d- W% @. c, r
- }
$ _, @3 w+ |' j( o8 m# I5 \ - catch
0 u4 X5 J" Y. b/ G: y5 g0 D - {* y4 @9 R6 _ ^, e
- MessageBox.Show("请检查串口1是否打开");
8 }0 k) k, c p; P# k% | - }
& P$ }, w9 W: E* C% m! ` - }
复制代码 ; J' u% G( a9 N+ A
12.关灯LED0程序如下:
% W/ r9 ?1 t ]- private void button2_Click(object sender, EventArgs e)( A, A% C, e1 r$ S
- {+ B, F+ j! w2 z( b; l1 S J. i
- try0 y# F3 E+ v$ v% e3 o9 h
- {' S. U" H4 i5 Z5 r' J
- if (serialPort1.IsOpen)% ~6 e e6 v! N7 u6 e6 t2 x
- {( O8 z8 i- S% b* P9 U
- serialPort1.Close();
( \" E$ T Y; ]; d/ ?' G - }
S# V: ~/ F8 s/ j* [ - serialPort1.Open(); //打开串口
" _; Y6 j& \/ B: Z# n# z: M - serialPort1.DiscardInBuffer();//清空缓冲区数据) J1 R+ y" u3 N9 c
- SendOrder[1] = 0x00;//发送开灯命令
5 }% ?" V) X z; j& c0 B5 E - serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区
5 \) ?6 A* J% B; I$ k7 L: s - }0 D2 e4 Q* r: C
- catch
1 \* e" b, Z$ o! m3 ~ - {
+ g( L$ E( L% U X4 a% Q; t - MessageBox.Show("请检查串口1是否打开");
+ ^ T. p6 B4 r" _0 N - }
" [% q+ g( C' [* x1 K$ b9 M# W - }
复制代码 ! Z: C s) i* P
13.蜂鸣器程序留给大家写,偷个懒(●'◡'●)
+ ?/ X$ B& L# L# k( d* }1 _& P* Q! y- e; K9 F0 U& I. B' n
14.串口接收函数如下:- t( J% d2 l$ W+ ^* P1 u. F
- private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) //串口接收中断
: G7 b8 R1 q/ f" w3 a - {
. ~) @# j/ s( A3 B% h! ^. E - try
# t8 ] P- } n5 B - {
) V5 A* ~' r4 I+ k/ Z - serialPort1.Read(revcmd, 0, 3); // 将接收缓冲区输入revcmd$ x2 l& h( P$ o
- # |0 b3 a# S, u9 J# ]
- }. I: B2 ?- a' V6 d* @4 _- R, `
- catch
. x! d& Q" J! D* Y - {
2 Q& j( f7 A. i - MessageBox.Show("请检查串口1是否打开");
! Y2 o8 m& `- C - }& b- ?5 x" T3 S- w7 u
- this.Invoke(new EventHandler(ComService)); //调用事件处理函数
Q/ E: L+ X/ \0 l. x3 z, n" H7 K - }
复制代码 7 @9 ~0 G! G( L
. I) x. I. A ]
15.串口接收数据处理函数如下:+ w9 _1 c5 g( R. ^( k
- private void ComService(object sender, EventArgs e)
0 N$ J" |6 K8 u2 _9 ?$ J - {
: \; p5 I$ v' J7 m6 \3 `1 i$ M" { - if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x01) & (revcmd[2] == 0xA5))* O2 Q9 g, @5 |" H( O0 X; S
- {* s+ `6 ?# |! l* ]" V! _
- button5.Text = "灯开了";
% l: ~# e" K4 b2 |0 p" Y/ V - button5.BackColor = Color.FromArgb(255, 0, 0); //设置控件颜色为红色6 i9 F9 l) _+ S; e
- // button5.BackColor = Color.FromKnownColor(KnownColor.LightSeaGreen);; //设置控件颜色为
8 `& X- Y2 e" N% I - % @' K- e* C+ |" \! \8 g$ L& j2 i- z
- }
. y# N1 k( q$ J) ] - if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x00) & (revcmd[2] == 0xA5)), ^' |' L/ J3 Q
- {" f2 Q2 ]0 m' X8 ]
- button5.Text = "灯关了";; V$ t1 X7 g8 I4 T
- button5.BackColor = Color.FromArgb(224, 224, 224);//灰色
9 h4 G0 \: Y# n3 S6 O( ^( c - }
) Y$ T5 y: o: F - }
复制代码 % B. X+ b1 u& I3 ?
8 o3 j8 w+ }2 X, Z7 M2 G1 I0 Q1 ?- u
16.上位机程序编写完成。) g) A2 t7 O9 e5 R
! j( F- D5 y$ b h$ X
8 f- X4 p3 z* m6 A/ n1 Q6 _9 |17.下面开始写STM32开发板程序,这个比较简单,大家应该都会吧。(●'◡'●)
3 _3 u# m& X9 r G# Y
' }, e) e0 v: z# D- void USART1_IRQHandler(void)//串口1中断服务程序) h( h; {5 J: p! M/ _) b3 ^1 W
- { 0 Q9 c. _$ k5 [9 g2 O, J3 W
- u8 res;
/ z% h( T* p6 N' h% a8 t - USART1_StartFlag=1; ! o. X5 q# A4 ?; W& B) b6 L' t7 \
- if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
) f! b, s2 i& P. @3 C( z0 _ - {( |' C/ m+ T* y/ \
- res=USART_ReceiveData(USART1); //读接收到的字节,同时相关标志自动清除
6 ]: x5 C" \! ]8 q( A+ S& S - if(USART1_RX_CNT<100)
6 e# Y# e/ u& \7 J - {' S# H8 {* t1 b$ i; C. v9 L9 o
- USART1_RX_BUFF[USART1_RX_CNT]=res;$ k/ K) {( U9 u! l' ?! r
- USART1_RX_CNT++;3 U# B, ]. H. ]+ Z$ f( w
2 O- \6 z% B v- TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除定时器溢出中断0 ^3 B+ [" Z! W8 t+ m
- TIM_SetCounter(TIM7,0);//当接收到一个新的字节,将定时器7复位为0,重新计时(相当于喂狗)3 M+ Q W0 d& f
- TIM_Cmd(TIM7,ENABLE);//开始计时5 n& T) ]$ g7 \- \( D: X" U
- }
1 E3 J9 ]" Q! o - }
, r" B B! q+ n5 F% Y n: n' k7 O - }
/ p% M( X8 {+ g. R - * F7 N: x( `: A- u- Z, ?( ~
- / 0 k5 Z, m0 P& ]* _6 b0 k+ A9 y3 u6 N
- //串口服务函数
; q- I A0 c+ f7 n, Y - void USART1RX_Service(void)7 k. M! J3 q3 a; G' n* q- z7 J
- {
; w0 z& U& M. N - if(USART1_FrameFlag==1)8 e4 V) m1 i# V' l6 Z1 }* L
- {$ m( k: U& }& Z+ a1 n# H
- USART1_StartFlag=0;
1 l5 M% ^/ v$ F - USART1_FrameFlag=0; //复位帧结束标志
" r5 I1 e; W. \ - USART1_RX_CNT=0;//接收计数器清零
3 |) d& m# |. F% p5 a$ X. v - if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x00)&&(USART1_RX_BUFF[2]==0xA5)) //通讯测试 5A 00 A5
$ m6 G" T0 I B1 b6 _ - {% W" C$ ^1 n8 {! M- ]- {
- SendBUF[0]=0x5A;& I' ~! I9 h7 D& u( s1 G3 Q
- SendBUF[1]=0x00;
1 y* f/ w& o9 p2 r2 r! b - SendBUF[2]=0xA5;
. |4 s9 g8 K; e; Y+ ]5 _0 E F5 B - LED0=1;% L' k8 i) c/ T) p' t2 A6 E( a& F1 g
- USART1_SendData(SendBUF,3);# F% o: n6 O+ S/ o- E9 ]5 W+ ]* A! i3 s
-
4 w6 u4 F8 [0 R: l6 G3 P- u3 m - }7 W, K2 Z3 d4 R; m% Z$ R W/ |# v" V. F
- if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x01)&&(USART1_RX_BUFF[2]==0xA5)) //通讯测试 5A 00 A5
: c7 C* C( e/ y3 I* r2 K" I - {+ ]0 K# f- a( _* |4 ?
- SendBUF[0]=0x5A;2 a6 O8 _/ y0 F6 J9 e* P
- SendBUF[1]=0x01;
2 ^1 B, M5 i; Z8 d2 `9 ^ - SendBUF[2]=0xA5;" f% G3 B3 Y0 L0 D9 S" ^
- LED0=0;
# H0 M5 @6 i4 F/ A8 f, k - USART1_SendData(SendBUF,3);. g/ I, F S& ?. Z4 y! h
-
8 `/ p! ~1 |9 g& q! O - }" F! R6 ?, ?" N+ H9 Z# U( j% ?$ `: b
- % E. W- L" ?, K1 v- o( u
- }$ V' F# x3 g% z; \4 K6 D
- }
复制代码 ; F% c. B' _9 f5 \: `' N
19.下面进行配置电脑,由于水平有限,本程序需要设置电脑的COM口且需要改为COM1如下图: m6 P3 J2 K5 E* |" ?, {
) B+ ]4 g3 Z" V0 X
5 U- ~) M6 n% s( q
或者更改VS2019中串口模块的属性,如下:5 R6 ]2 b3 m* O' Z' ~/ D) [3 Q' k
5 ^* T6 s) @* ?3 c
5 i; B7 u$ }7 _2 d- @
2 `7 U& {& y; m4 Z" f
---------------------! x' T' h* t+ ~2 C
作者:刘东君& H0 Z0 ?9 h7 Z4 d2 Z# N
+ E4 p, X( s9 p8 D4 J: r. Y, g9 i
- U4 I- ~: Q( J9 \/ C% b5 {
1 U$ P3 Z1 q% _4 g' r. \/ P# I: A& M* d, `
% Z1 l1 y/ G9 @2 B1 f! c
( o$ G2 u. b5 x0 z" \* p: N1 H |