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

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

[复制链接]
STMCU小助手 发布时间:2022-12-11 15:29
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' i9 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 D
8 R! s: W2 K* s2 W; `% E
10.好的现在基本界面与模块添加完成,开始写程序,添加程序各种变量:
) ?8 b8 w4 q, w4 P' D
  1.        //串口通讯命令+ K& o* E5 v5 P; ?, N$ p
  2.         public static byte[] SendOrder = new byte[3] { 0x5A,0x00, 0xA5 }; //中间为命令,头尾为校验  00 关灯 01开灯 02关蜂鸣器 03开蜂鸣器6 u, h4 g2 L& v* H
  3.         // 串口接收
    ! n; j3 v5 a0 `; U5 l& n" A
  4.         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
  1.         private void button1_Click(object sender, EventArgs e)  //开灯LED0% z& e- R: n$ [& i. n, p9 D8 Q3 G7 }
  2.         {
    0 q6 I0 E) K% d" _9 L- }
  3.             try
    ' D0 q- H8 B. w) x
  4.             {
    + Y* p3 Y3 t/ G# q9 J! v0 d
  5.                 if (serialPort1.IsOpen)
    9 M) i* I. Z- f& U4 ^' b% [
  6.                 {
    " P0 H7 Y6 H* ?: d/ G7 ]8 H# {% a
  7.                     serialPort1.Close();/ Z) m. J1 s& h
  8.                 }
    - t4 x; U5 w7 d% f3 m+ u( l
  9.                 serialPort1.Open();  //打开串口
    , D: Z# g6 @1 L0 E1 T9 t
  10.                 serialPort1.DiscardInBuffer();//清空缓冲区数据' Z! ~# o( D* Y# G2 Q8 G
  11.                 SendOrder[1] = 0x01;//发送开灯命令
    8 Z  |. W2 S0 w% H$ I
  12.                 serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区$ d- W% @. c, r
  13.             }
    $ _, @3 w+ |' j( o8 m# I5 \
  14.             catch
    0 u4 X5 J" Y. b/ G: y5 g0 D
  15.             {* y4 @9 R6 _  ^, e
  16.                 MessageBox.Show("请检查串口1是否打开");
    8 }0 k) k, c  p; P# k% |
  17.             }
    & P$ }, w9 W: E* C% m! `
  18.         }
复制代码
; J' u% G( a9 N+ A
12.关灯LED0程序如下:
% W/ r9 ?1 t  ]
  1.         private void button2_Click(object sender, EventArgs e)( A, A% C, e1 r$ S
  2.         {+ B, F+ j! w2 z( b; l1 S  J. i
  3.             try0 y# F3 E+ v$ v% e3 o9 h
  4.             {' S. U" H4 i5 Z5 r' J
  5.                 if (serialPort1.IsOpen)% ~6 e  e6 v! N7 u6 e6 t2 x
  6.                 {( O8 z8 i- S% b* P9 U
  7.                     serialPort1.Close();
    ( \" E$ T  Y; ]; d/ ?' G
  8.                 }
      S# V: ~/ F8 s/ j* [
  9.                 serialPort1.Open();  //打开串口
    " _; Y6 j& \/ B: Z# n# z: M
  10.                 serialPort1.DiscardInBuffer();//清空缓冲区数据) J1 R+ y" u3 N9 c
  11.                 SendOrder[1] = 0x00;//发送开灯命令
    5 }% ?" V) X  z; j& c0 B5 E
  12.                 serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区
    5 \) ?6 A* J% B; I$ k7 L: s
  13.             }0 D2 e4 Q* r: C
  14.             catch
    1 \* e" b, Z$ o! m3 ~
  15.             {
    + g( L$ E( L% U  X4 a% Q; t
  16.                 MessageBox.Show("请检查串口1是否打开");
    + ^  T. p6 B4 r" _0 N
  17.             }
    " [% q+ g( C' [* x1 K$ b9 M# W
  18.         }
复制代码
! 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
  1.        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) //串口接收中断
    : G7 b8 R1 q/ f" w3 a
  2.         {
    . ~) @# j/ s( A3 B% h! ^. E
  3.             try
    # t8 ]  P- }  n5 B
  4.             {
    ) V5 A* ~' r4 I+ k/ Z
  5.                 serialPort1.Read(revcmd, 0, 3); // 将接收缓冲区输入revcmd$ x2 l& h( P$ o
  6. # |0 b3 a# S, u9 J# ]
  7.             }. I: B2 ?- a' V6 d* @4 _- R, `
  8.             catch
    . x! d& Q" J! D* Y
  9.             {
    2 Q& j( f7 A. i
  10.                 MessageBox.Show("请检查串口1是否打开");
    ! Y2 o8 m& `- C
  11.             }& b- ?5 x" T3 S- w7 u
  12.             this.Invoke(new EventHandler(ComService)); //调用事件处理函数
      Q/ E: L+ X/ \0 l. x3 z, n" H7 K
  13.         }
复制代码
7 @9 ~0 G! G( L
. I) x. I. A  ]
15.串口接收数据处理函数如下:+ w9 _1 c5 g( R. ^( k
  1.         private void ComService(object sender, EventArgs e)
    0 N$ J" |6 K8 u2 _9 ?$ J
  2.         {
    : \; p5 I$ v' J7 m6 \3 `1 i$ M" {
  3.             if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x01) & (revcmd[2] == 0xA5))* O2 Q9 g, @5 |" H( O0 X; S
  4.             {* s+ `6 ?# |! l* ]" V! _
  5.                 button5.Text = "灯开了";
    % l: ~# e" K4 b2 |0 p" Y/ V
  6.                 button5.BackColor = Color.FromArgb(255, 0, 0); //设置控件颜色为红色6 i9 F9 l) _+ S; e
  7.                // button5.BackColor = Color.FromKnownColor(KnownColor.LightSeaGreen);; //设置控件颜色为
    8 `& X- Y2 e" N% I
  8. % @' K- e* C+ |" \! \8 g$ L& j2 i- z
  9.             }
    . y# N1 k( q$ J) ]
  10.             if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x00) & (revcmd[2] == 0xA5)), ^' |' L/ J3 Q
  11.             {" f2 Q2 ]0 m' X8 ]
  12.                 button5.Text = "灯关了";; V$ t1 X7 g8 I4 T
  13.                 button5.BackColor = Color.FromArgb(224, 224, 224);//灰色
    9 h4 G0 \: Y# n3 S6 O( ^( c
  14.             }
    ) Y$ T5 y: o: F
  15.         }
复制代码
% 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
  1. void USART1_IRQHandler(void)//串口1中断服务程序) h( h; {5 J: p! M/ _) b3 ^1 W
  2. {           0 Q9 c. _$ k5 [9 g2 O, J3 W
  3.         u8 res;        
    / z% h( T* p6 N' h% a8 t
  4.                 USART1_StartFlag=1;        ! o. X5 q# A4 ?; W& B) b6 L' t7 \
  5.         if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
    ) f! b, s2 i& P. @3 C( z0 _
  6.         {( |' C/ m+ T* y/ \
  7.                 res=USART_ReceiveData(USART1); //读接收到的字节,同时相关标志自动清除               
    6 ]: x5 C" \! ]8 q( A+ S& S
  8.                 if(USART1_RX_CNT<100)
    6 e# Y# e/ u& \7 J
  9.                 {' S# H8 {* t1 b$ i; C. v9 L9 o
  10.                         USART1_RX_BUFF[USART1_RX_CNT]=res;$ k/ K) {( U9 u! l' ?! r
  11.                         USART1_RX_CNT++;3 U# B, ]. H. ]+ Z$ f( w

  12. 2 O- \6 z% B  v
  13.                         TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除定时器溢出中断0 ^3 B+ [" Z! W8 t+ m
  14.                         TIM_SetCounter(TIM7,0);//当接收到一个新的字节,将定时器7复位为0,重新计时(相当于喂狗)3 M+ Q  W0 d& f
  15.                         TIM_Cmd(TIM7,ENABLE);//开始计时5 n& T) ]$ g7 \- \( D: X" U
  16.                 }
    1 E3 J9 ]" Q! o
  17.         }
    , r" B  B! q+ n5 F% Y  n: n' k7 O
  18. }
    / p% M( X8 {+ g. R
  19. * F7 N: x( `: A- u- Z, ?( ~
  20. /        0 k5 Z, m0 P& ]* _6 b0 k+ A9 y3 u6 N
  21. //串口服务函数
    ; q- I  A0 c+ f7 n, Y
  22. void USART1RX_Service(void)7 k. M! J3 q3 a; G' n* q- z7 J
  23. {
    ; w0 z& U& M. N
  24.                 if(USART1_FrameFlag==1)8 e4 V) m1 i# V' l6 Z1 }* L
  25.                 {$ m( k: U& }& Z+ a1 n# H
  26.                                 USART1_StartFlag=0;
    1 l5 M% ^/ v$ F
  27.                             USART1_FrameFlag=0;        //复位帧结束标志
    " r5 I1 e; W. \
  28.                                 USART1_RX_CNT=0;//接收计数器清零
    3 |) d& m# |. F% p5 a$ X. v
  29.                                 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 _
  30.                                 {% W" C$ ^1 n8 {! M- ]- {
  31.                                                 SendBUF[0]=0x5A;& I' ~! I9 h7 D& u( s1 G3 Q
  32.                                             SendBUF[1]=0x00;
    1 y* f/ w& o9 p2 r2 r! b
  33.                                             SendBUF[2]=0xA5;
    . |4 s9 g8 K; e; Y+ ]5 _0 E  F5 B
  34.                                             LED0=1;% L' k8 i) c/ T) p' t2 A6 E( a& F1 g
  35.                                             USART1_SendData(SendBUF,3);# F% o: n6 O+ S/ o- E9 ]5 W+ ]* A! i3 s
  36.                                        
    4 w6 u4 F8 [0 R: l6 G3 P- u3 m
  37.                                 }7 W, K2 Z3 d4 R; m% Z$ R  W/ |# v" V. F
  38.                                 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
  39.                                 {+ ]0 K# f- a( _* |4 ?
  40.                                                 SendBUF[0]=0x5A;2 a6 O8 _/ y0 F6 J9 e* P
  41.                                             SendBUF[1]=0x01;
    2 ^1 B, M5 i; Z8 d2 `9 ^
  42.                                             SendBUF[2]=0xA5;" f% G3 B3 Y0 L0 D9 S" ^
  43.                                             LED0=0;
    # H0 M5 @6 i4 F/ A8 f, k
  44.                                             USART1_SendData(SendBUF,3);. g/ I, F  S& ?. Z4 y! h
  45.                                        
    8 `/ p! ~1 |9 g& q! O
  46.                                 }" F! R6 ?, ?" N+ H9 Z# U( j% ?$ `: b
  47.                                 % E. W- L" ?, K1 v- o( u
  48.                 }$ V' F# x3 g% z; \4 K6 D
  49. }
复制代码
; 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
赞 收藏 评论0 发布时间:2022-12-11 15:29

举报

0个回答

所属标签

相似技术帖

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版