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

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

[复制链接]
wuhong377 发布时间:2014-3-27 09:00
#include
$ ~" a  E% o- y, _3 q4 N0 K8 Y#include "hw_config.h"
, `; u* m, W2 G& ^u8 uart1_buf[5];! }( g6 f/ k# x. N$ E8 b8 h6 x! [4 M
int count1=0;
" h, V- Y" j* Y3 G+ ?. k: D- c9 w$ wint Flag=0;% E' i, |5 c% |
" e8 S: X' U2 Y
void Delay(void)
$ b" n+ E# a7 S9 |5 L" [$ i{
/ N1 A, |' ^6 \) P0 x" _int x,y;4 _8 H' q5 F' D. X4 B
for(x=1000;x>0;x--)7 f. Z* j* n4 D$ c! S0 m
for(y=1000;y>0;y--);' d4 h. O% u/ n# F& Z6 i; ~
}
& {# {, ^" H- B- G, Z: I7 s- o; J$ C5 g# C- U! S
int main(void)0 M( k+ p+ e+ O: r
{        
% M9 \3 I' g; {. \9 ^* Q- C8 o. R& _; B; n5 p/ N( M2 d) y) j2 ]
u8 table[5];( u9 u1 N( s7 b0 g" `5 l
u8 *p=table;. \$ K- X$ B4 D% F: X: J
% C7 k" n5 y: ^( l
SystemInit(); /*系统初始化*/
3 q" V6 \' p* \' ]LED_Configuration();% k& ?( [$ x4 Z9 Z: c7 p
USART_Configuration();$ q; @" z1 M/ A4 v. @+ C3 b1 F
ADC_Configuration();
4 m9 K7 v; r( K3 ewhile (1)
6 f+ K) F% I" b{9 B$ S3 |: J5 N) X1 y0 r  t. T( T6 @
LED1(1);3 a2 h* i/ t* y3 L7 k
Delay();
( H2 L, B0 B" P7 l0 s4 i; @LED1(0);, N) v, C- Y8 R* w* j
Delay();) [- `3 h5 P3 y& ]" G! C4 ~
if(Flag==1)//接收中断0 U! {4 G9 d) }/ _
{5 c. k- h6 r5 Q& C
, ~; y3 W" A$ L4 f+ q. Q
for(count1=0;count1 4)0 C( ], Y0 _% S6 M6 m
{# {4 e# ~8 u% }4 U* Y9 o
Flag = 1;% {5 W1 c$ {8 C6 q" Y) N1 B
count1 = 0;
2 g+ r- \0 P# _( i* A  n: |}
& O. h3 f* I) L% u3 W
8 a" u' a, p1 M}
9 ^" S$ G0 a, P5 b( _}, B. z1 l* Q! i( ~

6 R; o! U2 @) W$ \$ K( ?! n* ?我想让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发表:1 R$ C" q, P) W$ Y9 p
我不明白,为什么你int count1=0; 就用这个变量呢?你再申请一个好了,你在主函数里面if(Flag==1)//接收中断下,count1已经变成5了。。你说到中断函数里面怎么处理?
& }3 P0 I( k$ R$ w/ F0 k4 m 
5 s" G) b1 [8 @) [   d! T8 s- |3 T7 {/ G, E% ]
 9 X0 V. R- A: {0 Q# S; U
我接收了五个字节之后,count1==5之后 就重新将count1==0;  应该不会影响到吧。9 O0 Z, X/ n/ [" Q
 
有缘于你 回答时间:2014-3-27 15:44:32

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

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

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

回复第 5 楼 于2014-03-27 14:37:11发表:+ _) [8 L* H! [
回复第 4 楼 于2014-03-27 10:11:31发表:
. b2 z7 |. E, E  N* M- D我不明白,为什么你int count1=0; 就用这个变量呢?你再申请一个好了,你在主函数里面if(Flag==1)//接收中断下,count1已经变成5了。。你说到中断函数里面怎么处理?% r" H; z) V+ @) E
 . Y) `0 a: {$ L; y0 H
 
& F+ Q: Y2 g" E9 p- A' F; T - w9 ~/ `* Y: I, `
我接收了五个字节之后,count1==5之后 就重新将count1==0;  应该不会影响到吧。
$ U' z+ Y# @7 t2 ?, _  ^8 A * E# k" B1 H. J. h
 6 Y- U" p: n$ m6 E
你是不是想搞个入队出队呢,,你发出去5个数据,你得让你的头地址减掉呀。
  d- O. L: Z+ S
! }3 k% ?0 ]2 R 
wuhong377 回答时间:2014-3-27 17:36:12

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

回复第 6 楼 于2014-03-27 15:44:32发表:3 O0 {: j) F7 f9 ?2 W
stm32 收到的数据一直是正确的么?还是也是错位的) S( l' W1 G7 ^& R6 E% {3 t
 " m9 m3 [/ t6 p' L9 k, g
 ) d0 Z0 P% T  ]  y7 ^
中断程序里面使用if(count1==5)的话。手动一次一次发送都是正确的。 如果自动循环发送,速度比较快的话,就可能会出现错位。, O" ^$ `% l* @2 c% {2 k
 0 P3 f- M9 n  `4 D
 
wuhong377 回答时间:2014-3-27 17:38:13

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

回复第 7 楼 于2014-03-27 16:03:43发表:
$ L$ B! z5 r: h1 w" h回复第 5 楼 于2014-03-27 14:37:11发表:, r6 t' q/ R( E
回复第 4 楼 于2014-03-27 10:11:31发表:4 V" b* f; ~& P* b- T; \, m: q
我不明白,为什么你int count1=0; 就用这个变量呢?你再申请一个好了,你在主函数里面if(Flag==1)//接收中断下,count1已经变成5了。。你说到中断函数里面怎么处理?4 u0 I' P0 p* \- [3 O& \
 / p! ~, g0 Z  Z$ Q/ ^
 
' u1 x0 T, ]  w; l 
' w  O6 U; m4 ^, b& X% G6 v/ v我接收了五个字节之后,count1==5之后 就重新将count1==0;  应该不会影响到吧。- u( y" H: R6 s# v8 F+ _( l
 ; d) D1 W6 ]8 Y( h$ B
 
- f# r7 I2 ~4 `# x& Z: ?" N你是不是想搞个入队出队呢,,你发出去5个数据,你得让你的头地址减掉呀。
# \( A  a. M) ~& d' u/ @ 
" f# @/ f3 ?6 ^ 
5 T9 E0 Y# g9 h因为我上位机每次就是发五个字节,所以我是想,stm32下位机进入中断后每次固定接收五个字节,然后进行判断再返回ADC采样的数值。
  Z* T! \* i5 s, H0 s+ S5 `. G4 J
. H7 J2 i$ {* m' w/ t. V& Z / {5 g5 |" W, h$ T, h+ \& x

7 Y0 M1 R5 h6 p# T( {3 F7 d1 M3 u 
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;">
/ b9 t+ @: ?7 F回复第 11 楼 于2014-03-27 21:41:44发表:* a; N* v* q7 N4 b6 _0 q
for(count1=0;count1
废鱼 回答时间:2014-3-28 16:17:04

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

1次只能接收1个数据。如果你发送的很快的话,数据会有丢失。可以在中断中处理。" G: _. ~. ~7 E+ ^4 y  I1 {0 P
if(count1 > 4)
( ?9 `! d2 i! x{
8 `& J8 D( k! t- Y) V! MUart1_PutString(p , 5);8 M" B& w9 g! ^9 n, E# _+ z5 A) N3 x
count1 = 0;
/ q4 j) x$ E) ^( i/ T1 X}
dzc2001 回答时间:2014-4-2 16:47:58

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

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

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版