多线程中通过串口通信,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");
}
}