怎么把定时器清零呢?rtt提供的只有write开始,control啥的。然后我不是一个字节一个字节算的,因为DMA接收会把数据断开,用定时器是为了把DMA接收断开的帧,再拼上。
我是在while里接收一部分数据,比如A0个字节,write定时器,这样有一个超时时间,设为100ms,如果超时了,说明100ms内,没有进while函数,说明一帧接收完成。
超时函数的回调函数给一个标志位,然后读取数据,stop定时器。
如果还没超时,又收到数据,那就再write,不知道可不可以在没stop的情况下write定时器,stop定时器,应该可以把定时器清空了吧。
现在单步调试的时候,每一帧都能分开,全速跑起来,就分不开了。
每两条数据的时间间隔好几s,绝对比100ms大。
代码如下:
void read_uart(void *parameter)
{
rt_uint32_t recv_cnt = 0, old_recv_cnt = 0;
rt_uint8_t recv_buff[4096] = {0};
rt_uint8_t *tmp_ptr= recv_buff;
rt_uint16_t cnt = 0;//统计一次接收读取几次,可以知道一帧数据被dma分成几次
rt_hwtimerval_t timeout_s; /* 定时器超时值 */
timeout_s.sec = 0; /* 秒 */
timeout_s.usec = 100000; /* 微秒 250ms */
hwtimer_sample();
while(1)
{
if (rt_sem_take(&env_rx,500) != RT_EOK)
{
continue;
}
//循环从串口读数据,放到tmpptr里,然后tmpptr每次增加接收的字符数,避免覆盖
while (recv_cnt = rt_device_read(dev, -1, tmp_ptr, 4096) )
{
rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) ;
cnt += recv_cnt;
tmp_ptr += recv_cnt;
old_recv_cnt = recv_cnt;
// rt_kprintf("第 %d 次",cnt);
}
//得到一帧数据,stop定时器,处理数据
if (timeout == 1 && old_recv_cnt != 0 && recv_cnt == 0)
{
timeout = 0;
old_recv_cnt = 0;
tmp_ptr = recv_buff;
rt_device_control(hw_dev, HWTIMER_CTRL_STOP, RT_NULL);
dump_hex(recv_buff, cnt);
cnt = 0;
}
rt_thread_delay(50);
}
}
/* 定时器超时回调函数 */
static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
{
// rt_kprintf("this is hwtimer timeout callback fucntion!n");
rt_kprintf("tick is :%d !n", rt_tick_get());
timeout = 1;
return 0;
}
07AA是结束符,没有区分开
怎么把定时器清零呢?rtt提供的只有write开始,control啥的。然后我不是一个字节一个字节算的,因为DMA接收会把数据断开,用定时器是为了把DMA接收断开的帧,再拼上。
我是在while里接收一部分数据,比如A0个字节,write定时器,这样有一个超时时间,设为100ms,如果超时了,说明100ms内,没有进while函数,说明一帧接收完成。
超时函数的回调函数给一个标志位,然后读取数据,stop定时器。
如果还没超时,又收到数据,那就再write,不知道可不可以在没stop的情况下write定时器,stop定时器,应该可以把定时器清空了吧。
现在单步调试的时候,每一帧都能分开,全速跑起来,就分不开了。
每两条数据的时间间隔好几s,绝对比100ms大。
代码如下:
void read_uart(void *parameter)
{
rt_uint32_t recv_cnt = 0, old_recv_cnt = 0;
rt_uint8_t recv_buff[4096] = {0};
rt_uint8_t *tmp_ptr= recv_buff;
rt_uint16_t cnt = 0;//统计一次接收读取几次,可以知道一帧数据被dma分成几次
rt_hwtimerval_t timeout_s; /* 定时器超时值 */
timeout_s.sec = 0; /* 秒 */
timeout_s.usec = 100000; /* 微秒 250ms */
hwtimer_sample();
while(1)
{
if (rt_sem_take(&env_rx,500) != RT_EOK)
{
continue;
}
//循环从串口读数据,放到tmpptr里,然后tmpptr每次增加接收的字符数,避免覆盖
while (recv_cnt = rt_device_read(dev, -1, tmp_ptr, 4096) )
{
rt_device_write(hw_dev, 0, &timeout_s, sizeof(timeout_s)) ;
cnt += recv_cnt;
tmp_ptr += recv_cnt;
old_recv_cnt = recv_cnt;
// rt_kprintf("第 %d 次",cnt);
}
//得到一帧数据,stop定时器,处理数据
if (timeout == 1 && old_recv_cnt != 0 && recv_cnt == 0)
{
timeout = 0;
old_recv_cnt = 0;
tmp_ptr = recv_buff;
rt_device_control(hw_dev, HWTIMER_CTRL_STOP, RT_NULL);
dump_hex(recv_buff, cnt);
cnt = 0;
}
rt_thread_delay(50);
}
}
/* 定时器超时回调函数 */
static rt_err_t timeout_cb(rt_device_t dev, rt_size_t size)
{
// rt_kprintf("this is hwtimer timeout callback fucntion!n");
rt_kprintf("tick is :%d !n", rt_tick_get());
timeout = 1;
return 0;
}
07AA是结束符,没有区分开
举报