关于超时退出循环的一个疑问

发表在 Kernel2019-11-19 18:51 [复制链接] 6 132

这是我的一个uart串口通信实验,是利于信号来实现的,我的想法是如果超过100ms 串口没有接收到数据的话就退出循环,这是我的源代码,但是没有实现我想要的效果,请大神看一下
  1.    
    : T7 l; n/ y+ Z7 J' q1 i! n- o' G1 g+ V
  2.     sem = rt_sem_create(gst_juart.uart_param[1].sem_name, 1, RT_IPC_FLAG_FIFO);! {6 q5 S' Y  b6 z! O
  3.     if (RT_NULL == sem)+ ]/ q- i3 L8 q4 `! Z
  4.     {
    % i& W: G) m/ z/ B
  5.         rt_kprintf("JUSONBP_UART: fail to create rx_sem\n");: F4 Q. x9 s/ W9 S5 f3 Y
  6.         return;
    ( w0 q9 f" K+ p- K- s
  7.     }
    * @1 ~3 B6 T- I( s& H# ~
  8.     gst_juart.uart_param[1].rx_sem = sem;
    1 T8 l3 b) Z: Z0 R/ _% \9 Z2 s
  9.    
复制代码

- ^$ A4 Q. {' t; g0 q  `0 ?! J4 V. E8 h
  1.     while (1) {
    5 M+ Q2 B* \' B0 d  D/ ~+ x  m3 X
  2.         err = rt_sem_take(sem, 100);+ n- y" Y3 |# C$ {$ @: W6 c* C% s; U4 f' V
  3.         if (-RT_ETIMEOUT == err)
    $ h3 T6 X6 l0 M6 D
  4.                                         {
    $ B- D* n) _  _( J; s2 c, @
  5.                                                           
    2 x8 a6 J5 C- o: u. X# c+ N
  6. //                                        sem = rt_sem_create(gst_juart.uart_param[1].sem_name, 1, RT_IPC_FLAG_FIFO);
    # u, M' V% D9 _: T5 \/ K4 [# \
  7. //                                        if (RT_NULL == sem)
    ; t8 i4 w. ]0 s
  8. //                                        {" s4 E; j8 Z( R  i
  9. //                                                rt_kprintf("JUSONBP_UART: fail to create rx_sem\n");' N/ G7 A! U+ _1 f( t  ]! Q3 ~
  10. //      //  return;* G0 j5 b9 Y: @: {
  11. //                                        }
    ( u  E* o$ `8 r) D3 ]0 }
  12. //                                                gst_juart.uart_param[1].rx_sem = sem;+ {# X0 ?! ^6 Z8 a9 O/ |5 i
  13. //    / u8 o2 O9 L0 N" ?
  14.                                                          resp_len = snprintf(resp_buf  ,resp_buf_len ,"<CMD_ERR>");
    & Y  r" z; V% l0 w: h9 ~$ G% y* h# L5 _* o
  15.                              / t+ c; S- J# y, p
  16.             bpl_kprintf(BP_DEBUG_LEVEL_UART, "UART: sem is timeout\n");
    + z* d0 ?, Y" g, p$ |1 c" s
  17.             break;  B/ @, t5 z" R, y/ I/ U1 v( H
  18.         }
    2 E& O- \# q! o" Y! w" U8 J
  19.         
    1 |: g8 _  h% _2 o& L. ^
  20.         memset(read_buf, 0, sizeof(read_buf));$ K) D3 F' z% U4 t3 a
  21.         rt_device_read(dev, 0, read_buf, sizeof(read_buf));  
    - w; {8 a  b* @7 L
  22.         if ('>' == read_buf[0]) {
    3 G6 W" A3 O" d& X1 Y: A
  23.                                                  resp_len += snprintf(resp_buf  + resp_len, resp_buf_len - resp_len,7 L4 [5 l( ^3 [; M& l! s
  24.                              "%c", '>');$ F* j- l4 }: a2 _) N# q
  25.             bpl_kprintf(BP_DEBUG_LEVEL_UART, "UART: read finished.\n");) H, j2 y& l  {7 i
  26.             break;
    : z9 ~3 m" I; V+ U- z3 j
  27.         } else {
    * N6 U, T9 E, q- y
  28.             bpl_kprintf(BP_DEBUG_LEVEL_UART, "UART: read: %s\n", read_buf);7 @" \5 q9 L! l  P5 D' t  h' {
  29.         }
    ! ]; m7 m2 t: T: L& |2 ^
  30.         
    8 j5 S: K5 U4 ]& V
  31.         resp_len += snprintf(resp_buf  + resp_len, resp_buf_len - resp_len,
    2 }: P/ Y6 j. I
  32.                              "%s", read_buf);& m: y/ j$ w* |
  33. //                                rt_kprintf("%d\n",i++);
    0 q  G9 J! f- k$ T% L
  34. //        rt_thread_delay(1);
    1 @6 I; }! `3 z9 @( Z6 s& u4 K3 f
  35.         }
复制代码

3 B( E  b( H6 l: y$ ~2 K# A& O3 _/ E' _
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-11-19 18:57:24 | 显示全部楼层
我的想法是如果超过100ms 串口没有接收到数据的话就退出循环

. H9 P, U5 L) K* l# T7 a: L4 C0 N2 I+ N
是没退出还是怎么地
使用道具 举报 回复
发表于 2019-11-19 19:09:52 | 显示全部楼层
本帖最后由 aozima 于 2019-11-19 19:10 编辑   E3 ~. t5 C* A

; s% Q9 e9 C, x, n3 H预期什么样?实际什么样?可以在需要关注的点下调试断点。- D# J+ ~$ {9 M
1 z! S/ o. O$ C5 s3 z, n9 [
另外楼主的代码没有判断总长度,有可能会写穿溢出。9 P8 o  R3 s# {5 ~  D
4 N4 l. r1 o/ k+ B( L) B
使用道具 举报 回复
发表于 2019-11-19 19:34:01 | 显示全部楼层
yangjie 发表于 2019-11-19 18:57# U9 ^- n* g( |8 ?
是没退出还是怎么地

8 `! |' A/ c( h) B7 }* |) {是退出太早了,有些指令需要那边机器处理的时间有点久,这边没有接收完整就退出了
使用道具 举报 回复
发表于 2019-11-19 19:35:44 | 显示全部楼层
aozima 发表于 2019-11-19 19:09( v, v) l" i* l$ B: K* x
预期什么样?实际什么样?可以在需要关注的点下调试断点。
6 @9 A- `5 k! }0 @2 O- F! j( O; f' `' x. T7 n. ]
另外楼主的代码没有判断总长度,有可能会写穿溢 ...

" B, Z3 k" h$ U7 Q. A4 Z! e预期是在接收串口数据时,如果接收到“>”就退出,如果时间超过100ms也退出,现在是接收到">"可以退出,根据现象来看,并没有等到100ms它就退出了
使用道具 举报 回复
发表于 2019-11-20 09:19:35 | 显示全部楼层
不到100ms怎么测量的?
使用道具 举报 回复
发表于 2019-11-29 17:05:04 | 显示全部楼层
aozima 发表于 2019-11-20 09:193 m" [' i3 Y6 o1 d4 v
不到100ms怎么测量的?

; i# a1 Y! E. E, S; f' N示波器
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|RT-Thread开发者社区 ( 沪ICP备13014002号-1

有害信息举报电话:021-31165890 手机:18930558079

© 2006-2019 上海睿赛德电子科技有限公司

Powered by RT-Thread

快速回复 返回顶部 返回列表