免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3672 | 回复: 0
打印 上一主题 下一主题

请教一个在linux使用串口接收,并且新开线程处理数据的问题!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-26 14:17 |只看该作者 |倒序浏览
目前我要编一个关于串口的多线程程序,具体功能是这样的:
       1、专门开一个线程thread1用来read串口;
       2、主线程开完所有线程之后做自己的工作,同时线程thread3用来处理串口读到的数据;
       3、程序开始工作后,主线程进行自己的工作,线程thread3调用pthread_cond_wait(&isdata, &lock) 进入阻塞状态,等待线程thread1读完串口后通过pthread_cond_signal(&isdata)唤醒线程thread3,唤醒后通过标志位flag的改变,使主线程调用pthread_cond_wait(&nodata, &lock) 进入阻塞状态,线程thread3处理串口数据,处理完后唤醒主线程,继续主线程的工作,如此循环。
      4、检查收到串口数据后的处理情况,在收到数据后,通过j++计数收到几次数据,然后通过j--判断数据是否被处理,结果发现收两次数据只能处理一次,请教一下是逻辑上的问题还是函数本身的用法不对,麻烦给一点建议。如图1

       5、另外我发现我的gdb调试器不能调试多线程的程序,其他单线程的没有什么问题。请问一下知不知道是什么原因,报错如图2


代码如下:
  1. while(1)
  2. {
  3. for(i=0;i<50;i++)
  4.       rbuf[i]='\0';
  5.   rc=read(fd,rbuf,sizeof(rbuf));
  6. j++;
  7. printf("RcDate%d\n",j);
  8.   pthread_mutex_lock(&lock);
  9. if(flag==0)
  10. printf("Thread1-%d\n",j);
  11.                pthread_cond_signal(&isdata);//signal
  12.   pthread_mutex_unlock(&lock);
  13.   write(fd,wbuf,50);
  14.   if(rc>0)
  15.   {
  16.            printf("recieve:%s\n",rbuf);
  17.   }
  18.   else
  19.           printf("receive none\n");
  20.   
  21. }
  22. close(fd);   
  23. }
复制代码
  1. void thread3(void)
  2. {int i=0;
  3. while(1){
  4. //pthread_mutex_lock(&lock);
  5. while(flag==0){
  6. pthread_mutex_lock(&lock);
  7. pthread_cond_wait(&isdata, &lock) ;
  8. flag=1;
  9. i++;
  10. printf("isdata%d\n",i);
  11. pthread_mutex_unlock(&lock);
  12. j--;
  13. printf("Thread3-%d\n",j);
  14. }
  15. //pthread_cond_signal(&nodata);//signal
  16. //pthread_mutex_unlock(&lock);
  17. pthread_cond_signal(&nodata);//signal
  18. }
  19. }

  20. int main(void)
  21. {


  22. pthread_mutex_init(&lock,NULL);
  23. pthread_cond_init(&nodata,NULL);
  24. pthread_cond_init(&isdata,NULL);
  25. flag=1;

  26. pthread_t id,id2,id3;
  27. int i=0,ret,ret2,ret3;
  28. ret=pthread_create(&id,NULL,(void *) thread,NULL);
  29. //sleep(1);
  30. ret2=pthread_create(&id2,NULL,(void *) thread2,NULL);
  31. ret3=pthread_create(&id3,NULL,(void *) thread3,NULL);
  32. if(ret!=0){
  33.         printf ("Create pthread error!\n");
  34.         exit (1);
  35. }
  36. if(ret2!=0){
  37. printf ("Create pthread error!\n");
  38. exit (1);
  39. }
  40. if(ret3!=0){
  41. printf ("Create pthread error!\n");
  42. exit (1);
  43. }

  44. while(1){
  45. //pthread_mutex_lock(&lock);
  46. while(flag==1){
  47.         pthread_mutex_lock(&lock);
  48.         pthread_cond_wait(&nodata, &lock) ;
  49.         printf("nodata\n");
  50.         flag=0;
  51.         pthread_mutex_unlock(&lock);
  52. }
  53. //pthread_mutex_unlock(&lock);
  54. //pthread_mutex_unlock(&lock);
  55. }

  56. //for(i=0;i<3;i++)
  57. //printf("This is the main process.\n");
  58. pthread_join(id,NULL);
  59. pthread_join(id2,NULL);
  60. pthread_join(id3,NULL);
  61. return (0);
  62. }  
复制代码

图1.jpg (30.6 KB, 下载次数: 13)

图1.jpg
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP