1.下载 免费版 Visual Studio 2019 并进行安装# I; K% J( w. {3 o

0 Q$ t4 T; n* u, p S) [6 G/ `) J# p& s
4 C3 d k! N3 {9 m' ~# l. o2.双击软件创建项目! \- ?7 z& ^2 H O' t% K
- N. `* j- b; d
4 V% r8 d: E& X& x
( |0 I$ G) S7 A( K8 @( b, k/ e$ U
5 V [. ?/ ^6 u" O' G3 p" u9 A
; j7 A8 s5 t5 P: {9 t$ i4 n9 E3 w! ]0 @" z+ H
3.选择Windows窗体应用程序(.NET Framework)创建项目。5 D% N" _: Y( u r0 P
. F! l% t2 ~ I. K+ L4 |
4 X8 J. A0 O( \/ U; d. v9 Z

& j9 o$ H" u( x
: q8 X! T" Q- G# R! ?5 B4.项目创建完成,初始界面。+ Y9 Y- S/ _6 Q! {/ r8 i
3 m( r7 v7 W- m, o% y: Q' x

* L5 m2 c4 n8 O7 v. J
5 w5 }& S4 r6 k8 G5 S$ I5.选择左侧的工具栏,选择 组件,然后双击 串口组件将串口添加进入项目。
3 _3 P- _: q/ A0 j* e8 p' \& O2 `) B% ]' M9 g5 t% z4 a% n( i

* @" Q0 N" C/ ~% J0 k! q6 m3 |* ]8 J8 {: y) D1 O
6.开完会了继续编辑,(●'◡'●)- g' {% ]2 w; u6 y- M: i4 @
7.点击鼠标右键,修改串口模块的属性,包括 波特率等,本实验采用默认。
" I" v4 i5 s4 x( v2 Q8 }; S4 P$ q
; q5 R6 E6 ~" I$ Y. F
' v( r) C+ k% e$ ]
, R. A. t1 ] t8.双击串口模块,添加数据接收中断函数7 s( I0 O' Y+ [% V/ [( T
5 C. C, W5 c4 ~2 X6 A& _0 T0 M/ P" e
) r3 N! p* }: M8 O7 u% A1 a2 F0 _3 m' L+ q2 |) {6 k
/ C7 w4 v' Z/ P# c K9.添加按钮模块,控制STM32开发板LED灯的亮灭。
0 k, B. Y+ l, d1 t2 }, s o- i5 z* o" t. c9 B
+ M" s" m+ N8 j3 e* M. Z u4 g
9 D5 C- L! N2 H0 e& e G6 G/ D
4 @+ _; x f1 v+ R& K10.好的现在基本界面与模块添加完成,开始写程序,添加程序各种变量:' B/ Z& C& R* v
- //串口通讯命令" l' a. z2 n2 R+ Y
- public static byte[] SendOrder = new byte[3] { 0x5A,0x00, 0xA5 }; //中间为命令,头尾为校验 00 关灯 01开灯 02关蜂鸣器 03开蜂鸣器: _7 f8 Z0 P' B$ u7 a: q
- // 串口接收
# p0 P ?8 U% ^2 F/ y - public static byte[] revcmd = new byte[3];
复制代码
) f. V1 @2 ^) n+ k11. 开灯LED0程序如下:) R& T# K2 A; a+ l* m
- private void button1_Click(object sender, EventArgs e) //开灯LED04 R% N; z. d8 T: }2 {
- {/ m& Q: M. I$ T4 i6 I6 U) ~1 f
- try3 G+ ~ _0 t* G B5 d/ {% U% O
- {
! h+ J p4 d$ P4 k8 x8 {" b - if (serialPort1.IsOpen)
8 H, X$ p" m( d) l - {* k" b0 X1 P) t! m! N
- serialPort1.Close();
; k F3 \ p1 v* a% \9 I3 i, y - }
/ ]/ }% T: Z1 A* \ - serialPort1.Open(); //打开串口- @9 t) o: i) c$ r* x
- serialPort1.DiscardInBuffer();//清空缓冲区数据
5 d' [9 i! @" ^! \/ H/ f. [ - SendOrder[1] = 0x01;//发送开灯命令7 \8 K# g# G1 a
- serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区
0 Z1 A/ L# H, A- F$ Z0 `2 ? m - }
# D5 i$ z: I; o6 K0 Z+ S - catch* V" F7 o# i; ]3 G ?0 @
- {* Z+ R9 X+ ^% C+ W* H
- MessageBox.Show("请检查串口1是否打开");8 N) G3 Z5 Q( P4 z: v
- } X w! E$ f' q& r
- }
复制代码
% ^" L+ ]& @$ x1 A12.关灯LED0程序如下:
+ K) F+ d3 D) n8 y& N" X! p- Z- private void button2_Click(object sender, EventArgs e)
& ?: _! v" X7 C! P+ Q' s( @ - {# k- x3 l' z7 z, Z. u
- try
; `% i/ B8 C2 c5 g. s8 Z - {; X) Q' d7 A0 d; \1 G8 M2 q4 {% `
- if (serialPort1.IsOpen)
3 E, l4 \0 E; R8 } - {
7 G2 \! x) I2 c' X1 V$ n - serialPort1.Close();
: J F- w; b( d! \ - }1 B; i- W4 k- j4 b# M
- serialPort1.Open(); //打开串口
% W+ @- Z3 n0 [ Q4 d" n7 n7 }! A' t - serialPort1.DiscardInBuffer();//清空缓冲区数据+ }+ _( S* u* E% W9 _5 a6 X
- SendOrder[1] = 0x00;//发送开灯命令
! C6 g5 ?4 u3 u3 q3 w1 `5 x - serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区
4 h5 w! L P! G6 ~; q+ g. P5 } - }
0 D7 D1 [6 Y; X( o& | - catch
( L- j+ N5 }0 A, G' [" h! x n - {
* w* e7 J( a) n$ _! S% R - MessageBox.Show("请检查串口1是否打开");
& Q) Q1 `. \2 a9 @% d/ g - }/ T1 ~1 E. t3 k) X, x5 e9 s9 m
- }
复制代码 3 u- P) `6 k- |/ b( u4 P; {
13.蜂鸣器程序留给大家写,偷个懒(●'◡'●)4 s0 D5 s7 K. g, J/ R' l: A/ C+ G
% s) m0 e5 `- Q# v4 f( W5 \14.串口接收函数如下:, ^; N u! S! g( k
- private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) //串口接收中断
6 q4 x" Y' P. G6 \( l D. c - {6 x) J# {! l* U, J& q# Y
- try4 S5 E7 ^2 z6 y T- o
- {; i$ C9 [/ K, h0 ]
- serialPort1.Read(revcmd, 0, 3); // 将接收缓冲区输入revcmd1 {. l% X9 L* Q7 X
- 1 n) y" N- t/ I
- }
) _' `' {* p' ~; c - catch2 }' k- k6 t! ~' }- o" t
- {
: d7 V! U& a5 A, s0 j - MessageBox.Show("请检查串口1是否打开");
/ `6 _$ p0 g1 i - }& ^7 s4 e" x4 z* A* {9 u% C
- this.Invoke(new EventHandler(ComService)); //调用事件处理函数
: G% Q; B! k" v- H2 U0 @ - }
复制代码 : z8 ?) d& q2 k' {
9 i$ t, S8 J$ ?, E2 X15.串口接收数据处理函数如下:7 R- a D* N) o) Z
- private void ComService(object sender, EventArgs e)+ s: s: L# S# P: b% l
- {
0 {" h! H5 n B. Y- Q5 o - if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x01) & (revcmd[2] == 0xA5))
/ m7 B8 p& A' |# t0 Q. y, K) ? - {0 j. u# L% t: L0 V6 M. h
- button5.Text = "灯开了";; D# A% W1 a6 V/ t( }8 \
- button5.BackColor = Color.FromArgb(255, 0, 0); //设置控件颜色为红色+ O: W4 B6 z' g* Y# q% o4 b
- // button5.BackColor = Color.FromKnownColor(KnownColor.LightSeaGreen);; //设置控件颜色为
! k5 ^" ^9 Z3 B. j3 \
* a! c1 I% f, k }' F; @- }
) f' S& @9 `& W5 I9 v0 F - if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x00) & (revcmd[2] == 0xA5))$ s2 K2 K0 ]; D# o V5 j8 }
- {9 o) I" X: M9 Q
- button5.Text = "灯关了";& G- g4 d9 A, ]7 ]3 b
- button5.BackColor = Color.FromArgb(224, 224, 224);//灰色' l2 c1 p: R0 O$ ^
- }
' D4 h- z: e. P9 \# w - }
复制代码 " \' i4 C0 s/ D j# h: S. \# ?
% Y9 S6 q0 q2 B; r
16.上位机程序编写完成。
, d. c5 z6 i& B& ~; r) b4 z, T9 y4 w: A: W$ ?# R7 m# h6 a& m
; }* Z/ o# x3 Q8 E2 r* L5 O17.下面开始写STM32开发板程序,这个比较简单,大家应该都会吧。(●'◡'●)
/ n5 Z! b9 Z8 D+ h/ N! G4 A/ H! c
- void USART1_IRQHandler(void)//串口1中断服务程序* |) s8 C5 [* J c4 C! I9 w2 e
- {
1 P* O6 [9 B" y2 O5 O+ q - u8 res; , e9 N5 E1 }1 W8 q
- USART1_StartFlag=1;
7 ~3 y W: ^! O' p0 J& Y - if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)& D. _9 @2 ~, @ @+ K: P/ {
- {. g* e1 {; `+ k# e" O
- res=USART_ReceiveData(USART1); //读接收到的字节,同时相关标志自动清除
# j' U3 n% @4 l% S - if(USART1_RX_CNT<100)
' h1 A7 k! H3 p! G' ?/ X) M% H - {
- y+ A4 f7 k( K$ B- \2 o - USART1_RX_BUFF[USART1_RX_CNT]=res;$ d) {) ?8 b, Q. A$ A& f$ Y
- USART1_RX_CNT++;( q9 n4 s" q6 m _8 p% ^1 V
- @% J8 x: h8 C6 v% D! J- TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除定时器溢出中断$ [$ W2 V1 |, t
- TIM_SetCounter(TIM7,0);//当接收到一个新的字节,将定时器7复位为0,重新计时(相当于喂狗)4 l) ]2 _" s' ~" F ~9 X2 a
- TIM_Cmd(TIM7,ENABLE);//开始计时: z3 X& V' O9 G1 G) k
- }! M9 S6 E4 U+ A4 U7 W% g
- }+ c; ^* |# d n+ P6 D+ F% a
- }
9 q/ W0 w5 u w+ L' m& Q
7 D* c0 J' i* l0 a" g. i- /
$ U. L6 N% T5 T5 b - //串口服务函数
1 S* ], u5 p7 h7 Z7 G7 J# b - void USART1RX_Service(void)- t5 d1 o+ d6 V9 h% _( G) d6 G% B
- {
) u, p: I, J2 f# W6 g* ~, `9 @, } - if(USART1_FrameFlag==1), X7 X8 y5 w# c
- {) d8 q' R, p- h* H; y3 j5 f
- USART1_StartFlag=0;
* o; P7 _3 n0 [) N; ]" i5 M - USART1_FrameFlag=0; //复位帧结束标志
3 s# e6 T) N# }6 F - USART1_RX_CNT=0;//接收计数器清零
) e. V7 C7 R% c - if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x00)&&(USART1_RX_BUFF[2]==0xA5)) //通讯测试 5A 00 A5
; @2 b+ L4 S: ^/ i - {
" b! O. @4 E% a3 f, f, U) U, J - SendBUF[0]=0x5A;
( o3 {7 w/ w0 a( ~+ P% Y - SendBUF[1]=0x00;
/ q4 p% k. ?) H! T7 p- _+ w- E - SendBUF[2]=0xA5;! o- i; S h+ l: Q/ O0 W$ T2 w7 Y
- LED0=1;
3 `* P+ `' }2 z* D% s- W - USART1_SendData(SendBUF,3);
& i8 t R1 |' ]' N - $ H4 e3 L0 K% Y# w, I) b. ~
- }- x" M- f' m8 E+ O, ~
- if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x01)&&(USART1_RX_BUFF[2]==0xA5)) //通讯测试 5A 00 A57 z! z5 Z, o- c- H e0 V
- {
" a) i6 K, ^8 a7 C - SendBUF[0]=0x5A;) F+ T2 Q/ R& u3 D
- SendBUF[1]=0x01;
& L* D0 ^8 L5 E& w& P - SendBUF[2]=0xA5;0 [# Z4 h+ x- G7 t0 ^6 K2 y
- LED0=0;
+ d& K* } z) j& w7 e - USART1_SendData(SendBUF,3);' U, g) B0 z; r+ I
-
0 C7 L4 m n9 P- E$ t6 J - }
0 G! `+ d; J9 X' U! O( S - * r) F( ^1 _" A
- }
+ h8 u. r( ?, N5 s$ Z4 Y - }
复制代码 , P& a2 y$ f& k; G/ F4 u; n
19.下面进行配置电脑,由于水平有限,本程序需要设置电脑的COM口且需要改为COM1如下图: * j* y5 Z/ [7 \3 w8 v

7 i0 q3 X7 T, Z9 `* X& d, h4 I& p2 Z! x P$ a
或者更改VS2019中串口模块的属性,如下:* Y7 E" @4 o! F* F# @+ ?/ S
h4 q1 G; H% C, W9 h( {
8 W# G' y/ R c' n; q8 r
9 W5 J1 H$ Z& s& r K9 W1 ]
---------------------
' h. i$ I1 y% j* }3 i2 J7 L作者:刘东君8 B7 m9 J& c, i$ m6 z- q- |
* Y! i9 ~" r7 a+ Y, J2 x% ?' g& F ~0 g2 }
" v# G; b: B! a, U6 Q+ d" f
) k/ q# M6 P! {0 O3 g0 e% e9 _ c$ o
9 I. o& l6 \, A4 t7 }4 V4 G8 p |