完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
目的:想要实现串口接收不定长数据,思路如下:一个串口接收线程,一个判断数据是否接收完成线程。
串口接收线程中:接收一个字节,令开始接收标志(rx_start=1)置1,同时将(rx_count=0),开启计时线程rt_thread_startup(timeout_thread)。 是否接收完成线程中:对rx_count++,如果rx_count到达某个值,说明串口接收完成,对数据进行处理同时将标志清零。 具体代码如下: void serial_thread_entry(void *parameter) { char buffer; while(1) { while(rt_device_read(u1_dev, 0, &buffer, 1) != 1)//从串口读一个字节数据,没有读到则等待接收信号量 { rt_sem_take(&uart1_rx_sem, RT_WAITING_FOREVER);//阻塞等待接收信号量,等待到信号量后再次读取数据 } temp_cmd[temp_len++] = buffer; //接受缓存中的数据 //计数归0,每次接收到一个数据都将该值置0,从而可以重新进行计时 rx_count = 0; if(rx_start == 0) { rt_thread_startup(timeout_thread); } rx_start = 1; } void timeout_thread_entry(void *parameter) { int i; if(rx_start == 1) { while(rx_count < 2) { rx_count ++; rt_thread_delay(1); } if (rx_count >= 2) { rx_count = 0; //处理收到的数据 rt_memset(temp_cmd, 0, temp_len); temp_len = 0; rx_start = 0; } } } rt_err_t rx_callback(rt_device_t dev, rt_size_t size) { rt_sem_release(&uart1_rx_sem);//串口接收到数据后产生中断,调用此回调函数,然后发送接收信号量 return RT_EOK; } int main(void) { rt_kprintf("========================打开串口,并创建串口线程===============================n"); rt_err_t ret = 0; u1_dev = rt_device_find("uart1"); if(u1_dev == RT_NULL) { rt_kprintf("rt_device_find uart1 failedn"); return -EINVAL; } ret = rt_device_open(u1_dev, RT_DEVICE_OFLAG_RDWR | RT_DEVICE_FLAG_INT_RX); //以读写及中断接收方式打开串口设备 if(ret < 0) { rt_kprintf("rt_device_open uart failedn"); return ret; } rt_device_set_rx_indicate(u1_dev, rx_callback); //设置接收回调函数 ret = rt_sem_init(&uart1_rx_sem, "u1_sem", 0, RT_IPC_FLAG_FIFO); //先进先出 if(ret != RT_EOK) { rt_kprintf("rt_sem_init failed...n"); return ret; } rt_thread_t u1_thread = rt_thread_create("u1_recv", serial_thread_entry, RT_NULL, 1024*8, 17, 5); if(u1_thread == RT_NULL) { return RT_ERROR; } rt_thread_startup(u1_thread); timeout_thread = rt_thread_create("timeout", timeout_thread_entry, RT_NULL, 1024, 18, 5); if(timeout_thread == RT_NULL) { return RT_ERROR; } return 0; } 出现的问题是:用串口助手发送第一包数据时可以正常处理,再发送一包数据(即便是1个字节),出现thread: stack overflow,定位到再第二次开启判断接收是否完成线程rt_thread_startup(timeout_thread)卡住了,各位大佬看看这个是什么造成的呢? |
|
相关推荐
2个回答
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
590 浏览 0 评论
AI模型部署边缘设备的奇妙之旅:如何在边缘端部署OpenCV
2241 浏览 0 评论
tms320280021 adc采样波形,为什么adc采样频率上来波形就不好了?
1233 浏览 0 评论
1788 浏览 0 评论
1464 浏览 0 评论
74803 浏览 21 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 20:43 , Processed in 1.060416 second(s), Total 70, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号