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

stm32 串口接收字符串 中断程序怎么写?

[复制链接]
wuhong377 发布时间:2014-3-27 09:00
#include 8 [0 ^8 K5 M5 \, w
#include "hw_config.h"
( G- ^: e# D  K7 o6 c- c& T- @( x- xu8 uart1_buf[5];
8 l0 Z4 f9 \2 e; ?int count1=0;( M6 T) _4 D/ F
int Flag=0;: |3 O2 s. P- q- o2 Q7 G  r

8 L: h- s/ c3 ~' |! h$ ^void Delay(void)
4 k/ t- B/ v- T5 l) Q- f# M) x{
- K4 D- r% }8 |4 `9 Eint x,y;
% u, c* O4 l3 M. O% V  ^for(x=1000;x>0;x--); U& H/ o! O. r* V3 a" d
for(y=1000;y>0;y--);
. N  @4 A- F; B- O; x4 G/ ^& `}. x- Z# y4 `& P' O
! @3 o* I7 p0 J5 T# H* N; P7 O
int main(void)
2 B0 p. g9 @+ d) q- N{        : T4 i2 O3 ^; H7 `# e4 \2 C
7 A# g% O5 B: @+ E
u8 table[5];6 r0 h2 y, I5 Z- W' I
u8 *p=table;
# ?! u$ A6 U" c
7 ^5 m. K0 K* F% r8 \1 o  u6 x) z. LSystemInit(); /*系统初始化*/
; L  g# X7 \! r: L9 G; SLED_Configuration();
0 w0 D9 s, U9 @" Z; U- ?8 XUSART_Configuration();8 ]0 \) g) ]$ L% E  K7 }
ADC_Configuration();
% Q5 \) l8 x$ T0 C1 E/ Q$ Dwhile (1)$ O$ e3 O  P; G4 z% M. |- z0 z
{5 F+ `9 l7 Z' Q% `6 O# x
LED1(1);
, ?5 ^! S5 _# Q# y- Y! k) b9 E; @Delay();* T+ a' i0 _/ p' L% C- _
LED1(0);, q. E6 ]. k  i) G+ a$ ~
Delay();3 L) D* m0 t  V6 G
if(Flag==1)//接收中断2 U" @0 ^% t8 O  E! `& I
{
  }, Q# J# I4 t' ]3 D' {
3 T& a* p7 i4 s' F2 e7 Nfor(count1=0;count1 4), u4 F, r: ^# _
{
4 k. X2 x5 C; q6 z# E5 GFlag = 1;! n6 }$ E5 u3 E# l0 X
count1 = 0;
: _9 ^5 S" R" S; p' M. v; l+ i1 k}
3 u; B0 @; L: m1 P; j* d8 E% b4 G. t6 y( H6 I" V
}
3 ?; m- ^* [8 m8 q6 K# P' Z}
0 k$ Z9 `3 S8 D4 `8 _
1 l- u- J0 H& `8 _( H% j4 N/ r0 k- G' F我想让stm32实现接收由串口助手发过来的五个字节的数,然后再由stm32返回给串口助手,我这样子写的程序,第一次可以正确的返回发送的五个数,第二次开始就可能会出错。 请问这边的中断程序怎么写,能够让stm32稳定的每次接收五个字节呢?
赞 收藏 评论15 发布时间:2014-3-27 09:00

举报

15个回答
wuhong377 回答时间:2014-3-27 09:21:57

RE:stm32 串口接收字符串 中断程序怎么写?

如果改为if(count1==5)的话 ,那么在发送数据的速度比较慢的时候, 如串口助手手动发送的时候,返回的数据正确,但是发送速度快的时候,数据也将会出现偏移了一位的情况。
废鱼 回答时间:2014-3-27 10:10:51

RE:stm32 串口接收字符串 中断程序怎么写?

一般用一个比较大的缓冲区,比如1K空间,然后用一个存指针和一个读指针,当判断到有缓冲中有数据的时候,就接着上传读指针的位置继续读取,直到读取到存指针的位置。
那片清茶 回答时间:2014-3-27 10:11:31

RE:stm32 串口接收字符串 中断程序怎么写?

我不明白,为什么你int count1=0; 就用这个变量呢?你再申请一个好了,你在主函数里面if(Flag==1)//接收中断下,count1已经变成5了。。你说到中断函数里面怎么处理?
wuhong377 回答时间:2014-3-27 14:37:11

回复:stm32 串口接收字符串 中断程序怎么写?

回复第 4 楼 于2014-03-27 10:11:31发表:
) t8 I/ ?8 s0 I( M! ]我不明白,为什么你int count1=0; 就用这个变量呢?你再申请一个好了,你在主函数里面if(Flag==1)//接收中断下,count1已经变成5了。。你说到中断函数里面怎么处理?9 c2 J; X; C# `/ B  h4 r, |
 
7 h+ J+ Q; {: L+ _ " |- u6 q! F: h* Z$ |9 S4 j! m: x  }
 % c9 ?8 z# {: G  V, G) t
我接收了五个字节之后,count1==5之后 就重新将count1==0;  应该不会影响到吧。; X0 ]' W) K* G; v- V
 
有缘于你 回答时间:2014-3-27 15:44:32

RE:stm32 串口接收字符串 中断程序怎么写?

stm32 收到的数据一直是正确的么?还是也是错位的
那片清茶 回答时间:2014-3-27 16:03:43

回复:stm32 串口接收字符串 中断程序怎么写?

回复第 5 楼 于2014-03-27 14:37:11发表:- D+ M0 U. Q: n7 m: g
回复第 4 楼 于2014-03-27 10:11:31发表:' h* b3 P! J6 D' |
我不明白,为什么你int count1=0; 就用这个变量呢?你再申请一个好了,你在主函数里面if(Flag==1)//接收中断下,count1已经变成5了。。你说到中断函数里面怎么处理?2 T7 ^/ Z/ y5 _% Z1 c  Q
 
! ^+ n0 Q4 u; q2 V1 }7 y, g 9 U" U0 P7 [9 S: |1 J( o# @
 ' c1 X% m: Z& i
我接收了五个字节之后,count1==5之后 就重新将count1==0;  应该不会影响到吧。9 V% p( L8 @- r- }9 V$ S
 
, Z3 R- c4 n' S: Q+ R 
7 r3 \0 K' r! b) E$ v你是不是想搞个入队出队呢,,你发出去5个数据,你得让你的头地址减掉呀。- Z0 n! m7 h  D! r% c& `# [4 ]

% o. ?- N5 P5 S 
wuhong377 回答时间:2014-3-27 17:36:12

回复:stm32 串口接收字符串 中断程序怎么写?

回复第 6 楼 于2014-03-27 15:44:32发表:# V( r* j: p' a+ u
stm32 收到的数据一直是正确的么?还是也是错位的; w' ?5 a& X! H2 D* g9 k" Z
 ) ~" @5 x' ?/ z3 g' m/ f0 ~
 
( }( |3 E0 m3 }/ a3 n3 S6 v中断程序里面使用if(count1==5)的话。手动一次一次发送都是正确的。 如果自动循环发送,速度比较快的话,就可能会出现错位。# A+ F3 R# v' B8 V+ ?% J
 2 [. e8 h2 I5 r5 o! _
 
wuhong377 回答时间:2014-3-27 17:38:13

回复:stm32 串口接收字符串 中断程序怎么写?

回复第 7 楼 于2014-03-27 16:03:43发表:5 |3 w3 t" o2 t9 A0 e$ ^
回复第 5 楼 于2014-03-27 14:37:11发表:
  U# l# e& {7 L7 c回复第 4 楼 于2014-03-27 10:11:31发表:
4 [. h  z, {# }# a我不明白,为什么你int count1=0; 就用这个变量呢?你再申请一个好了,你在主函数里面if(Flag==1)//接收中断下,count1已经变成5了。。你说到中断函数里面怎么处理?: B, b: _, a+ q9 t7 x& ^
 . B- a8 P; @( }  m
 
4 W0 O0 P: j+ ]6 W. D% B  _6 f' \ 
% P$ \* i+ B4 W7 R我接收了五个字节之后,count1==5之后 就重新将count1==0;  应该不会影响到吧。
& g) @8 E2 Y. X! Q# U7 q- R 
7 T$ f2 x6 c4 K3 ^. w- ? 
. _' I( u5 ^. V* P' m你是不是想搞个入队出队呢,,你发出去5个数据,你得让你的头地址减掉呀。
1 O6 Q5 G7 ]+ F. |0 w9 @6 H* Y 
$ k  r" ~0 J7 q5 e 
* V8 b3 q* y7 Y" v1 w8 T/ m6 S因为我上位机每次就是发五个字节,所以我是想,stm32下位机进入中断后每次固定接收五个字节,然后进行判断再返回ADC采样的数值。$ }& @, Z& T, }6 D) H

/ t2 i! L1 g, B9 Q1 e1 } * L4 J" {; v7 R: g+ s: B

/ b  P7 _+ E- x3 R- o' m3 ` 
fengye5340 回答时间:2014-3-27 20:41:10

RE:stm32 串口接收字符串 中断程序怎么写?

接受字符串,需要用数组和指针来实现,你接受N个字符,就定义一个容量为N的字符串,指针移动接收字符,当指针达到尾部,自动清理数组,开始一轮接受
wkuang 回答时间:2014-3-27 21:41:44

RE:stm32 串口接收字符串 中断程序怎么写?

for(count1=0;count1
dlyt03 回答时间:2014-3-28 10:45:37

RE:stm32 串口接收字符串 中断程序怎么写?

定义一个数组,接收时把发送的字符赋给相应的数组,返回的时候再依次读取,完毕后把数组清零,进行下一次赋值
wuhong377 回答时间:2014-3-28 14:58:53

回复:stm32 串口接收字符串 中断程序怎么写?

<div style="padding:5px;border:1px dashed #ccc;">
, z" K8 @9 F, ~$ R  G3 j: S+ N回复第 11 楼 于2014-03-27 21:41:44发表:
7 a6 l' b7 {1 v" O, m9 H* ^/ {9 ~for(count1=0;count1
废鱼 回答时间:2014-3-28 16:17:04

RE:stm32 串口接收字符串 中断程序怎么写?

1次只能接收1个数据。如果你发送的很快的话,数据会有丢失。可以在中断中处理。
% o# `3 K6 {' U/ f& N$ {if(count1 > 4)7 f; U6 T' a+ ?# H; J9 \6 x3 Z
{
5 O8 }# p0 k3 r1 t/ J* j/ PUart1_PutString(p , 5);
; P- {* c& o( P9 E& @count1 = 0;
/ ?) A; E9 E: ~( c}
dzc2001 回答时间:2014-4-2 16:47:58

RE:stm32 串口接收字符串 中断程序怎么写?

看看固件库的例程。里面有现成的代码。

所属标签

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