你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验之谈】基于STM32 Visual Studio 2019 +STM32实现串口通讯详解的经验分享

[复制链接]
STMCU小助手 发布时间:2022-12-11 15:29
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$ i
4 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
  1.        //串口通讯命令" l' a. z2 n2 R+ Y
  2.         public static byte[] SendOrder = new byte[3] { 0x5A,0x00, 0xA5 }; //中间为命令,头尾为校验  00 关灯 01开灯 02关蜂鸣器 03开蜂鸣器: _7 f8 Z0 P' B$ u7 a: q
  3.         // 串口接收
    # p0 P  ?8 U% ^2 F/ y
  4.         public static byte[] revcmd = new byte[3];
复制代码

) f. V1 @2 ^) n+ k11. 开灯LED0程序如下:) R& T# K2 A; a+ l* m
  1.         private void button1_Click(object sender, EventArgs e)  //开灯LED04 R% N; z. d8 T: }2 {
  2.         {/ m& Q: M. I$ T4 i6 I6 U) ~1 f
  3.             try3 G+ ~  _0 t* G  B5 d/ {% U% O
  4.             {
    ! h+ J  p4 d$ P4 k8 x8 {" b
  5.                 if (serialPort1.IsOpen)
    8 H, X$ p" m( d) l
  6.                 {* k" b0 X1 P) t! m! N
  7.                     serialPort1.Close();
    ; k  F3 \  p1 v* a% \9 I3 i, y
  8.                 }
    / ]/ }% T: Z1 A* \
  9.                 serialPort1.Open();  //打开串口- @9 t) o: i) c$ r* x
  10.                 serialPort1.DiscardInBuffer();//清空缓冲区数据
    5 d' [9 i! @" ^! \/ H/ f. [
  11.                 SendOrder[1] = 0x01;//发送开灯命令7 \8 K# g# G1 a
  12.                 serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区
    0 Z1 A/ L# H, A- F$ Z0 `2 ?  m
  13.             }
    # D5 i$ z: I; o6 K0 Z+ S
  14.             catch* V" F7 o# i; ]3 G  ?0 @
  15.             {* Z+ R9 X+ ^% C+ W* H
  16.                 MessageBox.Show("请检查串口1是否打开");8 N) G3 Z5 Q( P4 z: v
  17.             }  X  w! E$ f' q& r
  18.         }
复制代码

% ^" L+ ]& @$ x1 A12.关灯LED0程序如下:
+ K) F+ d3 D) n8 y& N" X! p- Z
  1.         private void button2_Click(object sender, EventArgs e)
    & ?: _! v" X7 C! P+ Q' s( @
  2.         {# k- x3 l' z7 z, Z. u
  3.             try
    ; `% i/ B8 C2 c5 g. s8 Z
  4.             {; X) Q' d7 A0 d; \1 G8 M2 q4 {% `
  5.                 if (serialPort1.IsOpen)
    3 E, l4 \0 E; R8 }
  6.                 {
    7 G2 \! x) I2 c' X1 V$ n
  7.                     serialPort1.Close();
    : J  F- w; b( d! \
  8.                 }1 B; i- W4 k- j4 b# M
  9.                 serialPort1.Open();  //打开串口
    % W+ @- Z3 n0 [  Q4 d" n7 n7 }! A' t
  10.                 serialPort1.DiscardInBuffer();//清空缓冲区数据+ }+ _( S* u* E% W9 _5 a6 X
  11.                 SendOrder[1] = 0x00;//发送开灯命令
    ! C6 g5 ?4 u3 u3 q3 w1 `5 x
  12.                 serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区
    4 h5 w! L  P! G6 ~; q+ g. P5 }
  13.             }
    0 D7 D1 [6 Y; X( o& |
  14.             catch
    ( L- j+ N5 }0 A, G' [" h! x  n
  15.             {
    * w* e7 J( a) n$ _! S% R
  16.                 MessageBox.Show("请检查串口1是否打开");
    & Q) Q1 `. \2 a9 @% d/ g
  17.             }/ T1 ~1 E. t3 k) X, x5 e9 s9 m
  18.         }
复制代码
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
  1.        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) //串口接收中断
    6 q4 x" Y' P. G6 \( l  D. c
  2.         {6 x) J# {! l* U, J& q# Y
  3.             try4 S5 E7 ^2 z6 y  T- o
  4.             {; i$ C9 [/ K, h0 ]
  5.                 serialPort1.Read(revcmd, 0, 3); // 将接收缓冲区输入revcmd1 {. l% X9 L* Q7 X
  6. 1 n) y" N- t/ I
  7.             }
    ) _' `' {* p' ~; c
  8.             catch2 }' k- k6 t! ~' }- o" t
  9.             {
    : d7 V! U& a5 A, s0 j
  10.                 MessageBox.Show("请检查串口1是否打开");
    / `6 _$ p0 g1 i
  11.             }& ^7 s4 e" x4 z* A* {9 u% C
  12.             this.Invoke(new EventHandler(ComService)); //调用事件处理函数
    : G% Q; B! k" v- H2 U0 @
  13.         }
复制代码
: z8 ?) d& q2 k' {

9 i$ t, S8 J$ ?, E2 X15.串口接收数据处理函数如下:7 R- a  D* N) o) Z
  1.         private void ComService(object sender, EventArgs e)+ s: s: L# S# P: b% l
  2.         {
    0 {" h! H5 n  B. Y- Q5 o
  3.             if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x01) & (revcmd[2] == 0xA5))
    / m7 B8 p& A' |# t0 Q. y, K) ?
  4.             {0 j. u# L% t: L0 V6 M. h
  5.                 button5.Text = "灯开了";; D# A% W1 a6 V/ t( }8 \
  6.                 button5.BackColor = Color.FromArgb(255, 0, 0); //设置控件颜色为红色+ O: W4 B6 z' g* Y# q% o4 b
  7.                // button5.BackColor = Color.FromKnownColor(KnownColor.LightSeaGreen);; //设置控件颜色为
    ! k5 ^" ^9 Z3 B. j3 \

  8. * a! c1 I% f, k  }' F; @
  9.             }
    ) f' S& @9 `& W5 I9 v0 F
  10.             if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x00) & (revcmd[2] == 0xA5))$ s2 K2 K0 ]; D# o  V5 j8 }
  11.             {9 o) I" X: M9 Q
  12.                 button5.Text = "灯关了";& G- g4 d9 A, ]7 ]3 b
  13.                 button5.BackColor = Color.FromArgb(224, 224, 224);//灰色' l2 c1 p: R0 O$ ^
  14.             }
    ' D4 h- z: e. P9 \# w
  15.         }
复制代码
" \' 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
  1. void USART1_IRQHandler(void)//串口1中断服务程序* |) s8 C5 [* J  c4 C! I9 w2 e
  2. {           
    1 P* O6 [9 B" y2 O5 O+ q
  3.         u8 res;        , e9 N5 E1 }1 W8 q
  4.                 USART1_StartFlag=1;        
    7 ~3 y  W: ^! O' p0 J& Y
  5.         if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)& D. _9 @2 ~, @  @+ K: P/ {
  6.         {. g* e1 {; `+ k# e" O
  7.                 res=USART_ReceiveData(USART1); //读接收到的字节,同时相关标志自动清除               
    # j' U3 n% @4 l% S
  8.                 if(USART1_RX_CNT<100)
    ' h1 A7 k! H3 p! G' ?/ X) M% H
  9.                 {
    - y+ A4 f7 k( K$ B- \2 o
  10.                         USART1_RX_BUFF[USART1_RX_CNT]=res;$ d) {) ?8 b, Q. A$ A& f$ Y
  11.                         USART1_RX_CNT++;( q9 n4 s" q6 m  _8 p% ^1 V

  12. - @% J8 x: h8 C6 v% D! J
  13.                         TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除定时器溢出中断$ [$ W2 V1 |, t
  14.                         TIM_SetCounter(TIM7,0);//当接收到一个新的字节,将定时器7复位为0,重新计时(相当于喂狗)4 l) ]2 _" s' ~" F  ~9 X2 a
  15.                         TIM_Cmd(TIM7,ENABLE);//开始计时: z3 X& V' O9 G1 G) k
  16.                 }! M9 S6 E4 U+ A4 U7 W% g
  17.         }+ c; ^* |# d  n+ P6 D+ F% a
  18. }
    9 q/ W0 w5 u  w+ L' m& Q

  19. 7 D* c0 J' i* l0 a" g. i
  20. /        
    $ U. L6 N% T5 T5 b
  21. //串口服务函数
    1 S* ], u5 p7 h7 Z7 G7 J# b
  22. void USART1RX_Service(void)- t5 d1 o+ d6 V9 h% _( G) d6 G% B
  23. {
    ) u, p: I, J2 f# W6 g* ~, `9 @, }
  24.                 if(USART1_FrameFlag==1), X7 X8 y5 w# c
  25.                 {) d8 q' R, p- h* H; y3 j5 f
  26.                                 USART1_StartFlag=0;
    * o; P7 _3 n0 [) N; ]" i5 M
  27.                             USART1_FrameFlag=0;        //复位帧结束标志
    3 s# e6 T) N# }6 F
  28.                                 USART1_RX_CNT=0;//接收计数器清零
    ) e. V7 C7 R% c
  29.                                 if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x00)&&(USART1_RX_BUFF[2]==0xA5))  //通讯测试  5A  00  A5
    ; @2 b+ L4 S: ^/ i
  30.                                 {
    " b! O. @4 E% a3 f, f, U) U, J
  31.                                                 SendBUF[0]=0x5A;
    ( o3 {7 w/ w0 a( ~+ P% Y
  32.                                             SendBUF[1]=0x00;
    / q4 p% k. ?) H! T7 p- _+ w- E
  33.                                             SendBUF[2]=0xA5;! o- i; S  h+ l: Q/ O0 W$ T2 w7 Y
  34.                                             LED0=1;
    3 `* P+ `' }2 z* D% s- W
  35.                                             USART1_SendData(SendBUF,3);
    & i8 t  R1 |' ]' N
  36.                                        $ H4 e3 L0 K% Y# w, I) b. ~
  37.                                 }- x" M- f' m8 E+ O, ~
  38.                                 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
  39.                                 {
    " a) i6 K, ^8 a7 C
  40.                                                 SendBUF[0]=0x5A;) F+ T2 Q/ R& u3 D
  41.                                             SendBUF[1]=0x01;
    & L* D0 ^8 L5 E& w& P
  42.                                             SendBUF[2]=0xA5;0 [# Z4 h+ x- G7 t0 ^6 K2 y
  43.                                             LED0=0;
    + d& K* }  z) j& w7 e
  44.                                             USART1_SendData(SendBUF,3);' U, g) B0 z; r+ I
  45.                                        
    0 C7 L4 m  n9 P- E$ t6 J
  46.                                 }
    0 G! `+ d; J9 X' U! O( S
  47.                                 * r) F( ^1 _" A
  48.                 }
    + h8 u. r( ?, N5 s$ Z4 Y
  49. }
复制代码
, 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
收藏 评论0 发布时间:2022-12-11 15:29

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版