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

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

[复制链接]
STMCU小助手 发布时间:2022-12-11 15:29
1.下载 免费版 Visual Studio 2019 并进行安装
4 K4 _7 K' e! _. Y! U8 S' D

5 U- _$ J- D9 q. Q, Q+ Z6 @7 \! o# f! l
) o  m" f% N8 w7 ?8 D
2.双击软件创建项目
5 X6 H7 t: k$ r2 v' t1 W# H& }" R* N+ P
: A( o1 z5 @: A+ \" U6 s) y3 S
, n( Q' [8 x/ ?4 O+ e

& v$ U( s1 \3 F- T, T
; ]4 }2 t# |. [7 O! G

$ F! }/ O( ?3 A3 Q# L3.选择Windows窗体应用程序(.NET Framework)创建项目。$ q9 u' P2 Z% \, g. X

* y% O8 C  k; F8 f8 h8 _; P" G
, j5 N. Z5 C* T/ W  ~

$ v7 I& k9 F8 N8 z; H% i! f) h2 A; K! I
/ v* ?7 ?- W/ y% `! `0 P# k4.项目创建完成,初始界面。% t% s6 x1 [# m- @" Y
; h5 _9 w+ e8 C, y) X' Z

: L3 E8 g1 h; s: A2 ^- z$ Z9 ?0 A/ [, d7 Y& S% z! \
5.选择左侧的工具栏,选择 组件,然后双击 串口组件将串口添加进入项目。
/ R# D% ^; \6 n3 G5 ]! t6 P2 S2 u( U" y0 o/ a
/ g" ]7 D4 s( G4 m% N
( l# h5 J# ^5 \& W6 n+ Y
6.开完会了继续编辑,(●'◡'●)
! ^! R% u6 ]5 c; U" v7.点击鼠标右键,修改串口模块的属性,包括 波特率等,本实验采用默认。
) G" r  {0 S* D+ f$ {
+ o3 j- Q+ A  y2 q$ i
3 n" @/ v3 Q4 K8 o2 k1 d2 Z- @5 ?

. N2 B' x* a/ N" J4 |" e6 o8.双击串口模块,添加数据接收中断函数
) u  z  M' M& u; A# N% v% O& O# s+ H- ]  k6 S1 L  I0 W% M
, s7 r* I2 z6 Y  F
  M. w4 f7 i# g) c
: X) G; Y/ ^1 J) r% E$ O
9.添加按钮模块,控制STM32开发板LED灯的亮灭。5 K6 v5 c8 ~9 z$ L  l
% y4 p: a6 C% [: R

) }  H2 l$ T/ q
( t+ h( |' j" f8 d
* |, @& K! D/ r& n8 M) K. \' @: J0 j- E1 ?
10.好的现在基本界面与模块添加完成,开始写程序,添加程序各种变量:
' s5 m! P8 N  R' c
  1.        //串口通讯命令
    7 i  e) D. }5 b8 E& u, b4 N
  2.         public static byte[] SendOrder = new byte[3] { 0x5A,0x00, 0xA5 }; //中间为命令,头尾为校验  00 关灯 01开灯 02关蜂鸣器 03开蜂鸣器+ i8 ~6 o4 b, f* E) t' f* @
  3.         // 串口接收* B2 w- z* j" {1 u. h& s4 D8 v
  4.         public static byte[] revcmd = new byte[3];
复制代码

' H: ]0 O3 o2 {1 y11. 开灯LED0程序如下:% t! }3 X6 W& |" |8 w* n7 N
  1.         private void button1_Click(object sender, EventArgs e)  //开灯LED0
    1 m' j+ l8 J4 [, R
  2.         {6 D* F- L# j5 t+ b7 h( b+ M
  3.             try7 a" L* e+ R+ V( q
  4.             {
    1 }& A5 L# L& C- M2 P/ [& k
  5.                 if (serialPort1.IsOpen)2 K/ \' o: v* V' t( i! T) h
  6.                 {$ A, e9 R% C* Q! w9 @3 T
  7.                     serialPort1.Close();& I  T8 B) f  C& A* W. }
  8.                 }, K2 ^" F1 G3 u" w' Q) @( U
  9.                 serialPort1.Open();  //打开串口6 C$ E5 S% n5 S) [8 t; F
  10.                 serialPort1.DiscardInBuffer();//清空缓冲区数据- B0 Y% n1 r3 L% T, t7 k2 I
  11.                 SendOrder[1] = 0x01;//发送开灯命令
    $ Z5 M) v! M. G% O* g; x
  12.                 serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区4 E  I7 K5 R" L9 ?
  13.             }9 v3 Y3 r/ `9 Q" j9 W. v, C$ C% o
  14.             catch
    1 Q3 ?- F( ^2 j, U( N: `5 p
  15.             {
    4 `7 H# ?3 a0 [- F; D; l: _
  16.                 MessageBox.Show("请检查串口1是否打开");, d6 z* P+ \( n
  17.             }
    % N- ^+ }+ I4 ]) ?2 J
  18.         }
复制代码

4 s4 V/ N* B) V12.关灯LED0程序如下:
, h( ?' E  S" @3 u  }9 B' J
  1.         private void button2_Click(object sender, EventArgs e)
    : z. [" {0 Y2 Z% i' f  p
  2.         {
    1 `: t0 f+ b( v, R" C! p" \
  3.             try
    " x9 h/ ]6 J9 G& ^, ~# i' t5 E
  4.             {
    + t. }' w4 X/ \
  5.                 if (serialPort1.IsOpen)
    3 }. B2 Z( U& o8 B: P( e/ s
  6.                 {4 Y! e. l+ C: z$ x, m
  7.                     serialPort1.Close();% V0 E/ V; z1 q* k6 w8 x7 H
  8.                 }6 R3 C/ F/ g# T/ M8 n: G
  9.                 serialPort1.Open();  //打开串口/ w% z  S0 M' H+ ~* G( g4 W
  10.                 serialPort1.DiscardInBuffer();//清空缓冲区数据& L5 k7 O) w* F9 K) Z( ]
  11.                 SendOrder[1] = 0x00;//发送开灯命令
    + t+ d: |  M2 g
  12.                 serialPort1.Write(SendOrder, 0, 3);//写入串口缓冲区
    8 G7 i! B. L" U* Q( `$ R) g
  13.             }3 x3 ?; M9 n" C' z
  14.             catch3 p$ R% [& J3 L0 g; h( x& ^
  15.             {7 c! a! ]+ j" P9 }# l
  16.                 MessageBox.Show("请检查串口1是否打开");
    ) f2 V/ o8 u5 ^( R
  17.             }
      w' y% t; \6 P
  18.         }
复制代码
& ^8 E5 N" ^. c0 v
13.蜂鸣器程序留给大家写,偷个懒(●'◡'●)$ @$ ^+ ?3 e( f; G
+ u% {1 W1 o! c$ T6 V; t2 Z
14.串口接收函数如下:  ^( q7 G% i: V9 W9 p) x1 f, t
  1.        private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) //串口接收中断
    6 Q- {  N' J! m8 C4 Q: Z9 ?
  2.         {
    ' T: a/ ]) c: X4 J# Y1 f( f. |
  3.             try
    , B+ s' z' l& w2 {$ L/ O9 o- k2 r
  4.             {8 ~9 `) _$ M# @" H
  5.                 serialPort1.Read(revcmd, 0, 3); // 将接收缓冲区输入revcmd, @6 X* N/ o# w8 L

  6. " K" h& _7 F% ^( u
  7.             }
    & n$ s" B- _# {  |2 v
  8.             catch+ Q% r3 Z* k1 t% v8 s2 _  k9 Z! o1 C
  9.             {
    # f/ a6 N+ J- F  M8 L, M
  10.                 MessageBox.Show("请检查串口1是否打开");$ C7 M& k" k! {
  11.             }
    7 x" ~  b8 h$ m& n! [
  12.             this.Invoke(new EventHandler(ComService)); //调用事件处理函数
    7 @* |7 }  `+ ^! z) }0 _9 n3 ^) @% b
  13.         }
复制代码

$ e: b- R& B* ~# d" i' l# Q' r1 W2 A# Q( D! T  w
15.串口接收数据处理函数如下:
1 q" a0 u" V4 c% ]/ Y0 h  B! n
  1.         private void ComService(object sender, EventArgs e)) n+ W% W/ E8 {1 J; ^4 Z7 f4 H) C
  2.         {
    6 ^$ u/ ~' _6 o' ^, e1 O6 |6 u: n! U% r
  3.             if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x01) & (revcmd[2] == 0xA5))
    0 ], A+ }2 @8 B' f, ?
  4.             {
    6 D, |% n/ j+ U8 o6 M
  5.                 button5.Text = "灯开了";
    , u  o9 ^! J* }6 [4 @# Z6 y! h& z2 T
  6.                 button5.BackColor = Color.FromArgb(255, 0, 0); //设置控件颜色为红色9 f' P) I$ M5 b
  7.                // button5.BackColor = Color.FromKnownColor(KnownColor.LightSeaGreen);; //设置控件颜色为- O1 x8 S( M8 y/ |0 x
  8. - a  H2 V, v$ l8 p; j
  9.             }, w2 f+ k. A- E  @% \
  10.             if ((revcmd[0] == 0x5A) & (revcmd[1] == 0x00) & (revcmd[2] == 0xA5))& }5 W' C0 z2 u( d: S, H; d& H
  11.             {8 V* F, Z6 d! C1 @; {6 m3 l8 h
  12.                 button5.Text = "灯关了";) \: C- e# D) @4 d2 {: F' ^
  13.                 button5.BackColor = Color.FromArgb(224, 224, 224);//灰色
    $ s, p( E7 ?( X0 q
  14.             }
    % }6 e6 b6 ?5 N$ F' f
  15.         }
复制代码

' s8 d. W/ C" U
; N9 z9 l! z( v  ^16.上位机程序编写完成。
& K8 O8 F7 R5 r; H4 N/ ~0 e( b4 q

" X- m7 N% }% p- }17.下面开始写STM32开发板程序,这个比较简单,大家应该都会吧。(●'◡'●)3 n5 i/ f0 q2 K. [2 A

1 R/ g( A+ ~' Y
  1. void USART1_IRQHandler(void)//串口1中断服务程序
    * X: S! Q, g0 {8 E1 |
  2. {           
    % g" T1 `9 w' d8 f0 O) I( {* b
  3.         u8 res;        ' @8 H- G; M- u2 Y& R" W# Q
  4.                 USART1_StartFlag=1;        ; C. r1 k& g; X$ I& s) n
  5.         if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET)
    ( f% F8 F! k* u4 S
  6.         {7 t* [- F+ l8 [2 V4 w/ j
  7.                 res=USART_ReceiveData(USART1); //读接收到的字节,同时相关标志自动清除               
    4 i' N7 L8 y2 O6 L
  8.                 if(USART1_RX_CNT<100)6 l* ?' t: l2 d3 ~& ~7 ]1 j
  9.                 {- S9 f& t' @( ^3 x# |
  10.                         USART1_RX_BUFF[USART1_RX_CNT]=res;
    0 d7 z, w0 g9 [" E2 W% }; `
  11.                         USART1_RX_CNT++;
    6 E/ \, A* s+ _7 \# [; f) E

  12. 7 S, T9 J# l+ I2 x4 x9 d/ B
  13.                         TIM_ClearITPendingBit(TIM7,TIM_IT_Update);//清除定时器溢出中断
    3 s3 m3 k$ D: E9 p6 v9 ?
  14.                         TIM_SetCounter(TIM7,0);//当接收到一个新的字节,将定时器7复位为0,重新计时(相当于喂狗)
    7 P7 _# q: Q0 ?* |5 U4 Z  E& y
  15.                         TIM_Cmd(TIM7,ENABLE);//开始计时
    7 U/ D- a% v# v5 {, @, x
  16.                 }
    # K. e- @0 M) |; C
  17.         }( Y9 w. L" V& d4 N' m
  18. }  y; v3 y# g2 C  ~% Z6 w
  19. 4 g+ d, s% x. q3 K
  20. /        / u3 a. ]: j" N
  21. //串口服务函数
    9 ]8 j, I" g  J$ T' y3 k
  22. void USART1RX_Service(void)
    ( _: e, \) E$ `9 a+ L
  23. {( P" h6 @7 [9 X7 W
  24.                 if(USART1_FrameFlag==1)( o2 L& F. [# c) a
  25.                 {% V, D9 J4 h+ l" N
  26.                                 USART1_StartFlag=0;
    ' V" }( B, P% A% [/ J* N3 R1 _
  27.                             USART1_FrameFlag=0;        //复位帧结束标志
    3 V; {. b: m1 }" k, `4 {- `
  28.                                 USART1_RX_CNT=0;//接收计数器清零
    3 m  Q9 D  @2 Y5 d4 K
  29.                                 if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x00)&&(USART1_RX_BUFF[2]==0xA5))  //通讯测试  5A  00  A5/ j6 K. L3 K2 y+ L9 s+ M# E5 c
  30.                                 {$ r+ j; e( D% E( u* ^% P# {+ {' t; ~
  31.                                                 SendBUF[0]=0x5A;
    ) y  K" Z) ^/ x0 ?' J5 T+ y
  32.                                             SendBUF[1]=0x00;2 h' ^( R% }+ C% d* o* J0 {, Q
  33.                                             SendBUF[2]=0xA5;; p% s) C+ M2 F  D/ H9 C
  34.                                             LED0=1;. j* y( f0 h- W* R8 K& E1 W
  35.                                             USART1_SendData(SendBUF,3);
    1 V% r* [3 S) x8 x7 \; q
  36.                                        . H. T9 q& i+ c; M( d! O" S+ f
  37.                                 }0 G2 _' m- V; ]7 L* m
  38.                                 if((USART1_RX_BUFF[0]==0x5A)&&(USART1_RX_BUFF[1]==0x01)&&(USART1_RX_BUFF[2]==0xA5))  //通讯测试  5A  00  A5
    ! g( L& g0 p( K/ d; n
  39.                                 {# p- M8 h6 G% \* S- a! j
  40.                                                 SendBUF[0]=0x5A;
    9 @  ?& ~" ?' w+ i" V
  41.                                             SendBUF[1]=0x01;3 H! {3 `$ S" }0 T3 Y. K, y
  42.                                             SendBUF[2]=0xA5;
    ) r' M5 i8 k0 H
  43.                                             LED0=0;$ p- \! x, \" k( Z; L  N
  44.                                             USART1_SendData(SendBUF,3);
    " I5 P* f: c$ n$ m: N( ]! `
  45.                                        
    - z7 r$ ]. K2 i9 h
  46.                                 }. S  E0 c6 K" w% F) a# b- i5 M+ w
  47.                                 ' w! F/ F: ?9 h  a
  48.                 }- k0 {3 b7 f$ g
  49. }
复制代码
4 h8 x; n. q; s( |! ^1 d% |' @
19.下面进行配置电脑,由于水平有限,本程序需要设置电脑的COM口且需要改为COM1如下图:
: M: q- V0 I2 r0 K1 n

) [5 b  b" ], r! ?
4 L# n/ n/ T* ]( v) x% O
或者更改VS2019中串口模块的属性,如下:- N/ c3 N' T6 @7 }( h1 c! H9 ~& C

* _( f! k# m) t- z; ~! u" J1 D# B& n0 z1 b
) f' l* e% Y7 X$ }; u& t0 _; e, @

9 r0 X7 W: v1 @2 G$ @" F5 E2 g---------------------1 Y; w7 Q: L5 R( A/ J
作者:刘东君
, n2 v$ d$ @2 Y. l: d5 s& _* ~( r2 ~/ `# t! x* k
1 z; i: [" L( x: }7 P+ U

. }& L9 n; _8 S' F
: t+ v8 E. v; Q( T
# A/ G" G3 L: }+ n
$ C+ Y) G9 O' o7 y5 Q& q" g& O/ B
赞 收藏 评论0 发布时间:2022-12-11 15:29

举报

0个回答

所属标签

相似技术帖

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