1.下载 免费版 Visual Studio 2019 并进行安装
- j0 ?8 c8 l) ^7 w) b7 A4 b: h% s! R4 Y
2 L X. K& i' [) b' p& U& }
7 O. E( Z' M+ i
2.双击软件创建项目
# W" W' I7 H# ]: L$ n. z* P5 e4 z" a. T h1 u
; G% o2 ]& l$ k$ J& s& W
9 o8 f# ^" V' W; H3 |+ s* V- B! q5 M, Q' D3 b
6 P( r$ O3 |: f, }: k2 t4 a& u- V; A d) c5 d5 o( _
3.选择Windows窗体应用程序(.NET Framework)创建项目。
, P# a$ u: x5 Q* @* P: w9 ~/ t3 E# u; I5 e1 J* ~. V
8 u( j. P! H5 f3 S: U# i% S8 F1 ~# i/ T( D2 [, j, S
8 Q5 p1 g1 P( R0 ^4.项目创建完成,初始界面。% ]" o) Y' q- q- K
# C/ m! R, G7 Y2 w
, y: Z. f9 M5 I2 r# x5 z* m/ F% @- G6 M: k( s1 g* t
5.选择左侧的工具栏,选择 组件,然后双击 串口组件将串口添加进入项目。
6 i, K5 N9 i# p9 K/ E3 p5 p# F, q, D, o6 s0 f
8 U: y4 V/ c& Q
1 R8 e' R0 Y, W# ^7 m6.开完会了继续编辑,(●'◡'●)1 c) G( C! W. N
7.点击鼠标右键,修改串口模块的属性,包括 波特率等,本实验采用默认。/ Q% N3 y$ d! ]) h; _! x n! p
* H6 y2 ]# ` ?8 O
$ \- U8 p/ ]+ Q2 t1 L& A0 ^
) M C2 h4 K! f) G% K8 z- B- r8.双击串口模块,添加数据接收中断函数8 l7 @; i! G) M' P
0 @! m9 t5 r* K" D! i' J6 L8 O) f6 X) i
+ F; F4 b9 [. o6 F
R- J2 q3 `+ _+ w }8 w! j9.添加按钮模块,控制STM32开发板LED灯的亮灭。6 H6 U0 G: l q$ |4 y# N
+ N" t, E+ _; p q5 r" P: W
$ \, C, H3 _$ ~/ o0 k
$ g# H: D5 S- V3 A0 m3 v7 I8 R
/ ?# x8 D7 E7 x$ d+ C; K10.好的现在基本界面与模块添加完成,开始写程序,添加程序各种变量:& g5 ?0 O' |" A2 B: `+ N7 X, i
- //串口通讯命令1 \: q L6 [0 m3 }, L9 G( `
- public static byte[] SendOrder = new byte[3] { 0x5A,0x00, 0xA5 }; //中间为命令,头尾为校验 00 关灯 01开灯 02关蜂鸣器 03开蜂鸣器
v/ C7 z0 ?% p) b - // 串口接收9 l$ O( F( s! q7 g' ?+ y# `7 \
- public static byte[] revcmd = new byte[3];
复制代码 3 E" o8 n" F: \/ d$ ]
11. 开灯LED0程序如下:
1 I) j) y0 x/ y+ F# E; e- private void button1_Click(object sender, EventArgs e) //开灯LED02 f( G9 a1 l- }0 U
- {: b& k; ^3 q6 Q5 |$ n5 t- g
- try$ G' T* m7 T! G
- {' Q3 a/ N q" O9 [- t* @
- if (serialPort1.IsOpen)
9 v" _$ v& T: r - {* u& J5 m5 b. I- l+ @# X
- serialPort1.Close();
: h; D0 k4 r) ?( X% H, v& N# }' ? - }
5 E2 Q9 X* z) W1 d, r! j7 G - serialPort1.Open(); //打开串口* l' T, I! z7 N7 k1 I" h
- serialPort1.DiscardInBuffer();//清空缓冲区数据' U# x8 W: ?: N$ k- E) c
- SendOrder[1] = 0x01;//发送开灯命令% i/ L7 m M Q
- serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区" _1 X" D1 V. h1 ]3 E: C1 @
- }
8 c$ o; s, r0 y) Q - catch: y* `' J+ Y1 }; t% f5 u- N- B
- {
' m3 f& r5 k: g5 U1 j: L - MessageBox.Show("请检查串口1是否打开");0 O+ ]1 |% v3 W& C6 M# |
- }
( N6 Y4 S0 n, B" v& X. t. `" p- g7 _ - }
复制代码 1 F3 D8 R2 K8 K. p) ]! m' A1 z7 u
12.关灯LED0程序如下:
1 Z% P: m# J1 g8 k, }9 b/ |- private void button2_Click(object sender, EventArgs e)
- X" `/ L7 }% |, U% s; S - {* k. B3 o) H# \6 S" H
- try
- e; [! J( m& c* m - {; E( z. `3 O2 X* q
- if (serialPort1.IsOpen)& z! w M- ?/ A. J5 j7 X
- {9 r( x) u0 e' z' O% H% a
- serialPort1.Close();
K+ s( F+ O, u$ w- k8 G: q3 U - }5 o- f S+ m" C3 R. Z
- serialPort1.Open(); //打开串口5 W# b0 }: I H S: ?, z
- serialPort1.DiscardInBuffer();//清空缓冲区数据) s) U% j8 F5 n9 q5 v% r
- SendOrder[1] = 0x00;//发送开灯命令
5 `6 w# |, G" q v* c: I/ Y - serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区$ n" a5 n: C+ W6 p, E% P
- }% C- h9 i6 B8 J' Z! |
- catch
# ^ W5 e# G# ^2 x8 ^. v% ? - {' W4 t4 y* y; N8 z
- MessageBox.Show("请检查串口1是否打开");
! |; S- ~; M- a4 w3 h9 i - }' {8 r5 k" p! A9 R! Q0 x; f! _4 m% i
- }
复制代码
+ `0 K* M* R* A: C! n; n v( y/ W13.蜂鸣器程序留给大家写,偷个懒(●'◡'●)
0 E6 k- I" b% ~$ e! ?6 a2 z5 j' h/ ^0 i, |* |0 d
14.串口接收函数如下:0 L9 V3 V9 u0 r: o$ F9 v" w( m' o
- private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) //串口接收中断
; b+ v) a- W8 W' b - {4 C" p) X0 L: t- S3 @
- try
! m( d9 }8 x( N `8 I* r; t - {5 T% ~2 a. F# t, r T' c
- serialPort1.Read(revcmd, 0, 3); // 将接收缓冲区输入revcmd
6 c( n% I' ] U$ s8 M& H# b
& V! N$ {% q" F' J5 S4 C# K- }
6 ?* D: c# x/ S5 b - catch, h4 v% Z' Z' }' M; U4 A2 |, W( i! K' @
- {! P8 u* J; L+ Y5 [& ` K, Y w
- MessageBox.Show("请检查串口1是否打开");
" [ w, Q( `% |" S( j - }
5 o& U( ^" d( c6 x3 p d) Z - this.Invoke(new EventHandler(ComService)); //调用事件处理函数
: y' m- p# k! H( U+ }1 U, L; Q - }
复制代码
, ~; x3 V! O6 W8 a5 `2 d
4 l; E" e9 r B7 n, j& W15.串口接收数据处理函数如下:
0 ?- y) G' K, q' Y2 p+ F- private void ComService(object sender, EventArgs e)
8 [4 s4 T/ W, l+ ] - {& w$ a2 @* S- U4 o. W" Q) ?
- if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x01) & (revcmd[2] == 0xA5)). y' ^5 v& _# ?1 s
- {
2 O& l. f4 y" j/ K: U% j - button5.Text = "灯开了";7 S; q+ [" }& |) J
- button5.BackColor = Color.FromArgb(255, 0, 0); //设置控件颜色为红色
/ S2 r9 W4 k! i3 M* ] - // button5.BackColor = Color.FromKnownColor(KnownColor.LightSeaGreen);; //设置控件颜色为 f% T: i) c+ P* q) h3 t
- - P: [2 o* Y5 |3 r5 [
- }$ b9 _$ s. m5 F9 V- q3 ?4 t6 G
- if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x00) & (revcmd[2] == 0xA5))
3 U4 |) {1 V( `; q - {
( F* p" q% H) C4 N' \ - button5.Text = "灯关了";/ [- F9 w! ~& t2 N6 Z6 o
- button5.BackColor = Color.FromArgb(224, 224, 224);//灰色
0 t$ K) s% V7 \, g8 l5 ` - }9 P) Y' ^- R+ K F# |. w
- }
复制代码
8 ^1 z) W0 U7 f+ P5 g9 a& z# Q8 x( j* `8 z: {0 ?. Y9 @3 T
16.上位机程序编写完成。# U* |( _# H* N0 G' M
3 A4 }3 {8 J' ^7 l
& q5 ?' f$ E$ @5 ]7 Y$ j
17.下面开始写STM32开发板程序,这个比较简单,大家应该都会吧。(●'◡'●)
1 f. o6 ~" `7 c& w3 K' |6 o) J1 L% E% F
- void USART1_IRQHandler(void)//串口1中断服务程序
. ?) n% ]6 D- F% f2 G1 P, E% d - { ! D' b2 y e; F9 [7 C9 u: z
- u8 res; " X- ^. @0 S9 R( S, `
- USART1_StartFlag=1; 5 k; V7 _: E8 x$ f$ K, [2 B
- if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
, A; a* p6 x* o6 j" ^ - {: q4 Q" L% e) K) \: ~+ v& _
- res=USART_ReceiveData(USART1); //读接收到的字节,同时相关标志自动清除 ' E; I: \* I2 k8 V3 r
- if(USART1_RX_CNT<100)# h" N* @5 D& R/ `: i1 U8 s! _" c5 C
- {
6 ?( a4 I# N* ^$ Y7 v - USART1_RX_BUFF[USART1_RX_CNT]=res;) g: y) y1 A) | }) f/ x1 }3 f
- USART1_RX_CNT++;
! f/ A3 n, |2 S7 r f - ' F( z4 B3 u7 G
- TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除定时器溢出中断1 D) ^, U3 x6 O+ j' V/ R0 v
- TIM_SetCounter(TIM7,0);//当接收到一个新的字节,将定时器7复位为0,重新计时(相当于喂狗)
2 m9 t5 A/ t t f - TIM_Cmd(TIM7,ENABLE);//开始计时5 U" E" h; a+ T/ q0 |. @0 e
- }5 P3 J9 S8 m" c
- }
. d9 ~+ @6 @) O0 [! n# s3 b M - }
* l% H1 d$ b" t - 7 M; _+ t' W Z% k' _
- /
+ D `( Y: K# ]8 p2 E8 Q - //串口服务函数7 V9 S! [- F9 U, D% b* N+ O& e9 A$ h* h
- void USART1RX_Service(void)
$ ~( e$ V9 Z2 S% T - {) }2 J& I) ]1 w. R: ~9 y5 C/ N9 b% u
- if(USART1_FrameFlag==1) E2 O: h2 s. }: @* D6 |. T& W
- {% A/ G& v; H T
- USART1_StartFlag=0;
- r D/ M/ c) I! y; \2 h - USART1_FrameFlag=0; //复位帧结束标志, f4 p& W3 d5 G/ ?* B- Q
- USART1_RX_CNT=0;//接收计数器清零
; I. h- d i2 _" B) J+ Z - if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x00)&&(USART1_RX_BUFF[2]==0xA5)) //通讯测试 5A 00 A5
$ U$ o; B d* H7 t/ [ - {
7 A; s" z- D0 y r |( s, C - SendBUF[0]=0x5A;
/ |; h# C& f/ I S - SendBUF[1]=0x00;- X% Q. _( l) u. y& v! R
- SendBUF[2]=0xA5;
. K. m1 l) e. {5 C. g - LED0=1;2 q6 v( {& d" J! y3 A# Y; y& W' e
- USART1_SendData(SendBUF,3);. ^# u9 q0 g# x
-
# y/ P2 b/ N0 v4 `0 {, P: j: e - }0 N7 {6 o3 e* B9 l
- if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x01)&&(USART1_RX_BUFF[2]==0xA5)) //通讯测试 5A 00 A5
2 h1 l. p" F' V, F- [ - {
8 b! l: G) [2 e& C& p - SendBUF[0]=0x5A;5 x- u3 A* e6 W# f1 B, [
- SendBUF[1]=0x01;
. x7 T0 y) k( N* g4 { - SendBUF[2]=0xA5;: e2 m2 g: g) y F# M# F% {
- LED0=0;
% K* R; ?0 s! B: L V% W4 h4 O - USART1_SendData(SendBUF,3);
% a" v$ I- {4 E1 C* g -
& T. |: D6 s" H% Y - }
) {0 v2 T1 G& T -
! L# M. e- u: i2 ]* n c - }
4 g% O5 g/ C; I - }
复制代码
( D" {% x7 F3 F19.下面进行配置电脑,由于水平有限,本程序需要设置电脑的COM口且需要改为COM1如下图: 0 L2 x4 q3 U4 z3 n& u2 K
2 Z% _$ b$ j2 A( z" i% o. L1 I, |5 G8 d
或者更改VS2019中串口模块的属性,如下:- U) J, X9 D r7 W( K6 p
, {9 C8 \9 I9 M: }5 U; f/ X
8 ^* Q6 ~) C1 E7 n9 j! r8 m9 X8 ?+ t4 j# p+ ~
---------------------
2 u5 d) {8 A1 r' f, d作者:刘东君
8 Y: Y3 V& U, L) C4 `
5 ^% G% d' S3 p% M& N" w3 ]4 H" \
$ A5 ~1 d9 b& f# q; w+ E0 @# {- I8 I5 J: q( }
. u' q: i1 i+ a# s7 I* p0 t0 Z
" x- F+ p; P, `& `; O0 K- c' | |