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

发布于 2019-11-19 18:51:41
这是我的一个uart串口通信实验,是利于信号来实现的,我的想法是如果超过100ms 串口没有接收到数据的话就退出循环,这是我的源代码,但是没有实现我想要的效果,请大神看一下
    
sem = rt_sem_create(gst_juart.uart_param[1].sem_name, 1, RT_IPC_FLAG_FIFO);
if (RT_NULL == sem)
{
rt_kprintf("JUSONBP_UART: fail to create rx_sem\n");
return;
}
gst_juart.uart_param[1].rx_sem = sem;


    while (1) {
err = rt_sem_take(sem, 100);
if (-RT_ETIMEOUT == err)
{

// sem = rt_sem_create(gst_juart.uart_param[1].sem_name, 1, RT_IPC_FLAG_FIFO);
// if (RT_NULL == sem)
// {
// rt_kprintf("JUSONBP_UART: fail to create rx_sem\n");
// // return;
// }
// gst_juart.uart_param[1].rx_sem = sem;
//
resp_len = snprintf(resp_buf ,resp_buf_len ,"");

bpl_kprintf(BP_DEBUG_LEVEL_UART, "UART: sem is timeout\n");
break;
}

memset(read_buf, 0, sizeof(read_buf));
rt_device_read(dev, 0, read_buf, sizeof(read_buf));
if ('>' == read_buf[0]) {
resp_len += snprintf(resp_buf + resp_len, resp_buf_len - resp_len,
"%c", '>');
bpl_kprintf(BP_DEBUG_LEVEL_UART, "UART: read finished.\n");
break;
} else {
bpl_kprintf(BP_DEBUG_LEVEL_UART, "UART: read: %s\n", read_buf);
}

resp_len += snprintf(resp_buf + resp_len, resp_buf_len - resp_len,
"%s", read_buf);
// rt_kprintf("%d\n",i++);
// rt_thread_delay(1);
}


查看更多

关注者
0
被浏览
346
6 个回答
aozima
aozima 2019-11-19
    本帖最后由 aozima 于 2019-11-19 19:10 编辑


预期什么样?实际什么样?可以在需要关注的点下调试断点。

另外楼主的代码没有判断总长度,有可能会写穿溢出。

kuailedeluojie
kuailedeluojie 2019-11-19
yangjie 发表于 2019-11-19 18:57
是没退出还是怎么地


是退出太早了,有些指令需要那边机器处理的时间有点久,这边没有接收完整就退出了
kuailedeluojie
kuailedeluojie 2019-11-19
aozima 发表于 2019-11-19 19:09
预期什么样?实际什么样?可以在需要关注的点下调试断点。

另外楼主的代码没有判断总长度,有可能会写穿溢 ...


预期是在接收串口数据时,如果接收到“>”就退出,如果时间超过100ms也退出,现在是接收到">"可以退出,根据现象来看,并没有等到100ms它就退出了
aozima
aozima 2019-11-20
不到100ms怎么测量的?

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友