• 6505阅读
  • 2回复

有关combobox,messagebox,串口,多线程结合的一个问题 [复制链接]

上一主题 下一主题
离线butcherty
 

只看楼主 倒序阅读 楼主  发表于: 2010-05-17
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
多线程中通过串口通信,i的值为combobox的返回值,根据选项执行相应操作,在为加入combobox时串口正常通信,无异常情况,加入messagebox之后在combobox选择几次后就会出现段错误而异常退出,求助下是什么原因导致的这种情况

void SerialThread::run()
{
    extern int i;
    
    if(0 == i)
    {
      QMessageBox msgBox0;
      msgBox0.setText(QString::fromLocal8Bit("请选择要测试的板卡型号!"));
      //      msgBox.setIconPixmap(QPixmap("./456.jpg"));
      msgBox0.setStandardButtons(QMessageBox::Ok);
      msgBox0.setDefaultButton(QMessageBox::Ok);
      int ret0 = msgBox0.exec();
      
      switch(ret0)
    {
    case QMessageBox::Ok:
      break;
    default:
      break;
    }
      return;
    }  

    else if(1 == i)
    {
      int fd,nwrite;    
      char buf[2] = {0x01,0x01};
      unsigned int buf1[8];
      struct termios oldtio;

      QMessageBox msgBox1;
      msgBox1.setText(tr("MAKE SURE"));
      msgBox1.setIconPixmap(QPixmap("./456.jpg"));
      msgBox1.setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel);
      msgBox1.setDefaultButton(QMessageBox::Ok);
      int ret1 = msgBox1.exec();

      
      fd = open(DEVICE, O_RDWR | O_NOCTTY );  
      printf("open serial succes!\nfd =%d\n",fd);

      if (fd <0)
    {
      perror(DEVICE);  
      exit(1);
    }    
  
      tcgetattr(fd,&oldtio);
      set_nc_mode(fd);
      printf("Changed to nc mode\n");
      
      if(ret1 == QMessageBox::Ok)
      {

      nwrite = write(fd, buf, sizeof(buf));
      bzero(buf, sizeof(buf));
    
      bzero(buf1, sizeof(buf1));
      if(read(fd, buf1, sizeof(buf1)));
          printf("receive %x from the serial\n", *buf1);
  
      close(fd);
      printf("close serial port\n");
    
    }
    }
    if(2 == i)
    {
      int fd, nwrite;
      char buf[2] = {0x02,0x02};
      unsigned int buf1[8];

      struct termios oldtio;
  
      QMessageBox msgBox2;
      msgBox2.setText(tr("MAKE SURE"));
      msgBox2.setIconPixmap(QPixmap("./456.jpg"));
      msgBox2.setStandardButtons(QMessageBox::Ok|QMessageBox::Cancel);
      msgBox2.setDefaultButton(QMessageBox::Ok);
      int ret2 = msgBox2.exec();

      fd = open(DEVICE, O_RDWR | O_NOCTTY);
      printf("open serial success!\nfd = %d\n",fd);

      if(fd < 0)
    {
      perror(DEVICE);
      exit(1);
    }
      tcgetattr(fd, &oldtio);
      set_nc_mode(fd);
      printf("Change to nc mode\n");
    
      if(ret2 == QMessageBox::Ok)
      {

      nwrite = write(fd, buf, sizeof(buf));
      bzero(buf, sizeof(buf));

      bzero(buf1, sizeof(buf1));      
      if(read(fd, buf1, sizeof(buf1)));
      printf("receive %x from the serial\n", *buf1);
      
      close(fd);
      printf("close serial port\n");

      }
    }
离线butcherty

只看该作者 1楼 发表于: 2010-05-18
晕,又没人来
离线xtfllbl

只看该作者 2楼 发表于: 2010-05-18
程序没仔细看,但是看到很多开空间和数组什么的,一般断错误都是对这些东西操作错误所导致的。
既然你提到要操作几次才出错,那有可能是空间没clear或者是越界了
出现断错误这种东西请先自己调试。
上海欢迎您
快速回复
限100 字节
 
上一个 下一个