凌云志轩 2016-11-16 18:09 采纳率: 0%
浏览 3309
已采纳

qt 使用select监听串口时主线程被阻塞

在QT中,另起一个线程读串口,使用select监听的,可是为什么主线程也被阻塞了呢?
代码如下:

thread.h

  1. #ifndef DISTANCE_SERIAL_PORT_H
  2. #define DISTANCE_SERIAL_PORT_H
  3. #include <QtCore/QThread>
  4. class Distance_serial_port : public QThread
  5. {
  6. Q_OBJECT
  7. public:
  8. explicit Distance_serial_port(QObject *parent = 0);
  9. void run();
  10. void run_once();
  11. void setTermios(struct termios * pNewtio, int uBaudRate);
  12. void gps_uart_init(int ttyFd,struct termios *oldtio,struct termios *newtio);
  13. };
  14. #endif // DISTANCE_SERIAL_PORT_H

thread.cpp

  1. #include "distance_serial_port.h"
  2. #include <sys/time.h>
  3. #include <stdio.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <assert.h>
  8. #include <iostream>
  9. #include <termios.h>
  10. #define BUF_LENGTH 6
  11. #define DEV_NAME "/dev/tty"
  12. Distance_serial_port::Distance_serial_port(QObject *parent) :
  13. QThread()
  14. {}
  15. class CLASS_JULI{
  16. public:
  17. CLASS_JULI(int f = -1):fd(f){ }
  18. ~CLASS_JULI()
  19. {
  20. close(fd);
  21. }
  22. int fd;
  23. };
  24. CLASS_JULI dis_port_fds;
  25. void Distance_serial_port::run(){
  26. while(1)
  27. {
  28. try{
  29. run_once();
  30. }
  31. catch(...){
  32. std::cerr<<"distance serial port run throw exception!"<<std::endl;
  33. }
  34. sleep(1);
  35. }
  36. }
  37. void Distance_serial_port::run_once()
  38. {
  39. int ret = 0,i;
  40. unsigned char buf_read[BUF_LENGTH];
  41. fd_set readfd;
  42. struct timeval timeout;
  43. struct termios oldtio, newtio;
  44. dis_port_fds.fd= open(DEV_NAME,O_RDONLY | O_NONBLOCK);
  45. if ((dis_port_fds.fd = open(DEV_NAME, O_RDONLY | O_NONBLOCK)) <= 0) {
  46. std::cout<<" open "<<DEV_NAME<<" faurel!\n"<<std::endl;
  47. return ;
  48. }
  49. else
  50. {
  51. std::cout<<" open "<<DEV_NAME<<" faurel!\n"<<std::endl;
  52. }
  53. gps_uart_init(dis_port_fds.fd,&oldtio,&newtio);
  54. assert(dis_port_fds.fd>0);
  55. while(1)
  56. {
  57. timeout.tv_sec=1;
  58. timeout.tv_usec=0;
  59. FD_ZERO(&readfd);
  60. FD_SET(dis_port_fds.fd,&readfd);
  61. ///监控函数
  62. ret=select(dis_port_fds.fd+1,&readfd,NULL,NULL,&timeout);
  63. if(ret == -1) //错误情况
  64. {
  65. std::cout<<"error"<<std::endl ;
  66. }
  67. else if(ret>0) //返回值大于0 有数据到来
  68. {
  69. if(FD_ISSET(dis_port_fds.fd,&readfd))
  70. {
  71. i=read(dis_port_fds.fd,buf_read,BUF_LENGTH);
  72. std::cout<<"----------------------------------------"<<std::endl;
  73. int m = 0;
  74. for(m = 0; m < BUF_LENGTH ; m++)
  75. {
  76. std::cout<<buf_read[m]<<" "<<std::endl;
  77. }
  78. if(buf_read[0] == 'D')
  79. {
  80. char _buf = buf_read[1];
  81. //QBitArray ba(8);
  82. if( (_buf&0x80) == 1 )
  83. {
  84. }
  85. else
  86. {
  87. }
  88. }
  89. break;
  90. }
  91. else //超时情况
  92. {
  93. std::cout<<"time out"<<std::endl;
  94. continue;
  95. }
  96. }
  97. else
  98. {
  99. }
  100. }
  101. }
  102. void Distance_serial_port::setTermios(struct termios * pNewtio, int uBaudRate)
  103. {
  104. /*
  105. *clear struct for new port settings
  106. */
  107. bzero(pNewtio, sizeof(struct termios));
  108. //8N1
  109. pNewtio->c_cflag = uBaudRate | CS8 | CREAD | CLOCAL;
  110. pNewtio->c_iflag = IGNPAR;
  111. pNewtio->c_oflag = 0;
  112. pNewtio->c_lflag = 0; //non ICANON
  113. }
  114. /*
  115. *设置串口的波特率9600,并刷新使其立即生效
  116. */
  117. void Distance_serial_port::gps_uart_init(int ttyFd,struct termios *oldtio,struct termios *newtio)
  118. {
  119. tcgetattr(ttyFd, oldtio); /* save current serial port settings */
  120. setTermios(newtio, B115200);
  121. tcflush(ttyFd, TCIFLUSH);
  122. tcsetattr(ttyFd, TCSANOW, newtio);
  123. }

调用方法

  1. dis_serial_prot = new Distance_serial_port();
  2. dis_serial_prot->run();

为什么呢?难道在QT中不能使用select?

展开全部

  • 写回答

3条回答 默认 最新

  • devmiao 2016-11-16 22:55
    关注
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)
编辑
预览

报告相同问题?

悬赏问题

  • ¥15 matlab中频率调制法代码的解读
  • ¥15 ceph的对象、块、文件相关问题求解答
  • ¥50 如果使用python进行ERA5 10米风场预报检验
  • ¥15 navicat解析mysql密码
  • ¥15 SDAPI(关键词-table)
  • ¥15 unity安卓打包出现问题
  • ¥20 安装catkin时遇到了如下问题请问该如何解决呢
  • ¥15 VAE模型如何输出结果
  • ¥15 编译python程序为pyd文件报错:{"source code string cannot contain null bytes"
  • ¥20 关于#r语言#的问题:广义加行模型拟合曲线后如何求拐点
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部