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

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

这是我的一个uart串口通信实验,是利于信号来实现的,我的想法是如果超过100ms 串口没有接收到数据的话就退出循环,这是我的源代码,但是没有实现我想要的效果,请大神看一下
  1.    
    9 o! `( \; B; I# Q
  2.     sem = rt_sem_create(gst_juart.uart_param[1].sem_name, 1, RT_IPC_FLAG_FIFO);& e. F( Z! M. V" N
  3.     if (RT_NULL == sem)
    ( n' B; @: V& o8 V/ c
  4.     {
    " f, b1 b: P7 a/ |# F) |) e. z
  5.         rt_kprintf("JUSONBP_UART: fail to create rx_sem\n");% Q( g, E$ t9 k  C  m1 `
  6.         return;% Q: h& {0 w' q9 Y8 R: F1 B
  7.     }
    8 u2 k. {" u- P! x# P! Z
  8.     gst_juart.uart_param[1].rx_sem = sem;& u* [( |) X+ z6 M
  9.    
复制代码

% e0 [. }" X: n& f1 J6 Y6 k$ B$ Z2 v: e  [! E4 E6 a% _
  1.     while (1) {1 b& {% g* j% t. p! g
  2.         err = rt_sem_take(sem, 100);
    1 f, t" |' u* ?
  3.         if (-RT_ETIMEOUT == err)
    0 S3 P! O  f$ P
  4.                                         {2 D0 F2 i3 o% i8 X# m, K6 ^
  5.                                                           
    0 X8 X( Q' z  Y0 v: w5 m0 X# e
  6. //                                        sem = rt_sem_create(gst_juart.uart_param[1].sem_name, 1, RT_IPC_FLAG_FIFO);
    . d; v% _* N; Q
  7. //                                        if (RT_NULL == sem)0 `7 a+ q( U$ B7 O" M3 Z
  8. //                                        {2 O( p- B( J1 d: ~" `/ d
  9. //                                                rt_kprintf("JUSONBP_UART: fail to create rx_sem\n");0 g2 @0 K% A6 ?2 F3 ]! O" W' m! ~" Y
  10. //      //  return;' I# b) u" I, L' y% k
  11. //                                        }
    * m- Y2 o4 x) V+ Z' }
  12. //                                                gst_juart.uart_param[1].rx_sem = sem;
    9 w( u! K2 H3 Y0 \' ^
  13. //   
    6 b. b$ a# a7 c4 P/ W1 m
  14.                                                          resp_len = snprintf(resp_buf  ,resp_buf_len ,"<CMD_ERR>");- O* ^# p# f( x9 D; P. u
  15.                              ! \8 g& j+ o) Z3 s3 _' M7 y1 I
  16.             bpl_kprintf(BP_DEBUG_LEVEL_UART, "UART: sem is timeout\n");: b: M0 D& x. I0 M+ I, t
  17.             break;
    8 S4 `/ H: b# M! c7 Y5 A- y
  18.         }. x# {/ }8 L4 X6 j9 K1 S: H" m
  19.         : f+ ?! v, ^; }& R
  20.         memset(read_buf, 0, sizeof(read_buf));
    ' U! K7 Z( Y# u' g! k9 c
  21.         rt_device_read(dev, 0, read_buf, sizeof(read_buf));  & p: n$ P9 J1 t" v8 r/ d
  22.         if ('>' == read_buf[0]) {* s% {. k! v1 ~6 x
  23.                                                  resp_len += snprintf(resp_buf  + resp_len, resp_buf_len - resp_len,
    2 ]! j7 Y) n) B* g
  24.                              "%c", '>');5 v& G& T# G. }% t4 o3 v
  25.             bpl_kprintf(BP_DEBUG_LEVEL_UART, "UART: read finished.\n");9 E  O0 B6 Y1 C' c
  26.             break;8 ~9 {1 ^/ }. n" @
  27.         } else {
    1 a4 ?! S! N! P9 x( ~
  28.             bpl_kprintf(BP_DEBUG_LEVEL_UART, "UART: read: %s\n", read_buf);$ N: F0 ~. D3 k9 m/ W9 `* s1 w
  29.         }
    6 z4 m; E0 ~5 _! ?% F+ _- b
  30.         ! Q. R9 p1 T0 R3 h
  31.         resp_len += snprintf(resp_buf  + resp_len, resp_buf_len - resp_len,# A" P" z$ A% j' `6 J/ F
  32.                              "%s", read_buf);1 N* `) ?9 U1 f
  33. //                                rt_kprintf("%d\n",i++);
    ; d8 l6 P, i" h  [. G
  34. //        rt_thread_delay(1);9 J' `+ A) x( k; j! K4 o
  35.         }
复制代码
- m& m9 ]+ g% r3 w

4 F0 n. W. V+ Z
使用道具 举报 显示全部楼层 回复
最新评论 | 正序浏览
显示全部楼层 |楼层直达:
发表于 2019-11-19 18:57:24 | 显示全部楼层
我的想法是如果超过100ms 串口没有接收到数据的话就退出循环
/ B4 L/ H  L2 S$ U, R7 N6 e6 J
: z; b; ~$ m# H* m
是没退出还是怎么地
使用道具 举报 回复
发表于 2019-11-19 19:09:52 | 显示全部楼层
本帖最后由 aozima 于 2019-11-19 19:10 编辑 9 g* T: q* S# v' A" @& z% U
( ~: Z$ I5 Z1 W4 Z$ s/ x" F
预期什么样?实际什么样?可以在需要关注的点下调试断点。' ~( K0 h4 p/ P
9 b( S7 `8 O; C( d9 t
另外楼主的代码没有判断总长度,有可能会写穿溢出。7 s1 \% k- b& J% u2 N

  m0 a& H7 X) b) q, d. }
使用道具 举报 回复
发表于 2019-11-19 19:34:01 | 显示全部楼层
yangjie 发表于 2019-11-19 18:57
# H( ?& m3 F  ^是没退出还是怎么地

7 k% R9 k  h5 V6 Y8 M1 X是退出太早了,有些指令需要那边机器处理的时间有点久,这边没有接收完整就退出了
使用道具 举报 回复
发表于 2019-11-19 19:35:44 | 显示全部楼层
aozima 发表于 2019-11-19 19:09
' u8 i9 ]1 k1 d7 ~# Q& C预期什么样?实际什么样?可以在需要关注的点下调试断点。, i( {; \+ Z, Z: l; m' S. C

, e% e! y4 q7 h2 d5 d+ W2 V另外楼主的代码没有判断总长度,有可能会写穿溢 ...

  i( p9 ^4 F+ e, N预期是在接收串口数据时,如果接收到“>”就退出,如果时间超过100ms也退出,现在是接收到">"可以退出,根据现象来看,并没有等到100ms它就退出了
使用道具 举报 回复
发表于 2019-11-20 09:19:35 | 显示全部楼层
不到100ms怎么测量的?
使用道具 举报 回复
发表于 2019-11-29 17:05:04 | 显示全部楼层
aozima 发表于 2019-11-20 09:193 {- j+ q& B& H, |* T6 q+ E; N4 j
不到100ms怎么测量的?

, W% Y  T( j/ L% w示波器
使用道具 举报 回复
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

Powered by RT-Thread

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