• 6462阅读
  • 4回复

在QT程序中使用pthread创建串口接收线程所出现的问题 [复制链接]

上一主题 下一主题
离线phenix_yw
 

只看楼主 倒序阅读 楼主  发表于: 2006-08-09
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
下面这个函数作为串口接收线程的执行函数(本程序用的是pthread线程库)
 
  1. 1   #define BUFFERSIZE 32,
  2. 2  
  3. 3   void *readPort_thread(void *classPtr)
  4. 4   {
  5. 5     commGUI *gui_ptr=(commGUI *)classPtr;
  6. 6     char rbuff[BUFFERSIZE];
  7. 7     int res;
  8. 8  
  9. 9     res=pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);    
  10. 10     if(res != 0){
  11. 11             perror("setcacelstate failed");
  12. 12             exit(EXIT_FAILURE);
  13. 13     }
  14. 14  
  15. 15     res=pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED,NULL);
  16. 16     if(res != 0){
  17. 17           perror("setcaceltype failed");
  18. 18           exit(EXIT_FAILURE);
  19. 19     }
  20. 20     while(true){
  21. 21           gui_ptr->recvBytes+=gui_ptr->port_instance->readPort(rbuff,BUFFERSIZE);
  22. 22           //显示接收字节数
  23. 23           gui_ptr->recv_lineEdit->setText(QString::number(gui_ptr->recvBytes));
  24. 24  
  25. 25           //在TextView控件里显示  
  26. 26           if(!gui_ptr->isDisplayStop)
  27. 27                   gui_ptr->recv_TextView->append(QString(rbuff));  
  28. 28           //在终端里显示
  29. 29           printf("%s",rbuff);
  30. 30           fflush(stdout);      
  31. 31     }
  32. 32   }


  将两台PC(主机A,主机B)通过串口相连,主机A系统是WindowsXP,使用一个串口调试程序配合本程序的调试,主机B即为运行本程序的linux机器
现在有以下两个问题:
  1.主机A以一秒的周期向主机B发送一个字符串,但主机B有时却并不是收到一个字符串就立即在终端和TextView里显示,要等会儿它才一下子显示多个字符串,且在等待的过程中,界面上的控件都不能响应鼠标,有时还会造成程序僵死.
  在终端上有时还出现类似这样的信息:
  Xlib: unexpected async reply (sequence 0x1167)!
但如果注释掉26,27行,即只让接收到的字符串在终端中显示,则接收显示正常,不会出现以上所说的问题.
  2.TextView类的append方法会把接收到的字符串去除换行符,而且每接受一个字符串它都会追加到下一行,这样并不适合用来显示串口接收的数据,要原版显示串口所收到的数据应该怎么办?
  请高人指点一下应该怎样解决以上问题呢?
[ 此贴被phenix_yw在2006-08-10 10:09重新编辑 ]
离线realwerw

只看该作者 1楼 发表于: 2006-08-10
这种问题我遇到过多次
1)第一个问题是因为串口有个缓冲区,接收到的数据会保存在里面。你如果直接read()串口时,他要达到
一定数量的数据满足时才会发给你(我记得默认为8吧).如果不够,read会被阻塞。
    解决办法:可以设置串口的寄存器属性里面有一项,
            stTm.c_cc[VTIME]= 1         //超时时间
            stTm.c_cc[VMIN]=MIN_NUMBER //你要read到多少个数据就返回
            tcsetattr(fd,TCSANOW,&stTm);
2)建议你用个strBuffer装着吧,然后setText
离线phenix_yw

只看该作者 2楼 发表于: 2006-08-10
谢谢realwerw的解答,不过程序中造成的接收显示延迟不是串口设置的问题,好像跟Xlib或者用来显示接收数据的TextView控件有关,如果我只让接收的数据在终端上显示(即直接printf),接收数据的数据是能实时显示的,但如果在TextView中显示就会出现上述的等待现象,并且终端中还时不时的冒出这样的信息:
Xlib: unexpected async reply (sequence 0x12e4)!

是Qt 库的问题吗?
离线phenix_yw

只看该作者 3楼 发表于: 2006-08-15
没高手帮忙呀??
都郁闷好几天了!救命呀!
离线ball
只看该作者 4楼 发表于: 2006-08-22
用 QThread 吧
用 Qt 不用 QThread 等於白用
快速回复
限100 字节
 
上一个 下一个