1.问题描述
我在qt中写了一个程序,在v3s中读取gps数据并对其进行处理。我在qt上已经搭建好了交叉编译环境以及目标板配置。并且之前测试了几个小程序,都可以点击运行并且在qt的输出栏中查看程序输出。
但是这个程序有所区别,我在qt中执行会出现如下现象
然后我用普通ssh软件登录进去之后,执行该程序,是这个结果是
现在发现问题是检测打开的文件是否是串口时发生错误。
接下来我找到了出错的代码段:
int UART_Open(int fd,char* port)
{
fd = open( port, O_RDWR|O_NOCTTY|O_NDELAY);//非阻塞,读写,无流控
if (FALSE == fd)
{
perror("Can't Open Serial Port");
return(FALSE);
}
//恢复串口为阻塞状态
if(fcntl(fd, F_SETFL, 0) < 0)
{
printf("fcntl failed!\n");
return(FALSE);
}
else
{
printf("fcntl=%d\n",fcntl(fd, F_SETFL,0));
}
//测试是否为终端设备
if(0 == isatty(STDIN_FILENO))//**********此处为出错代码段**************
{
printf("standard input is not a terminal device\n");
return(FALSE);
}
else
{
printf("isatty success!\n");
}
printf("fd->open=%d\n",fd);
return fd;
}
目前我的程序就是主程序进入后立即打开串口,我实在想不通为何用qt启动和别的ssh软件登录启动会导致isatty函数返回值出现不同?请大家不吝赐教。
以下是我的qt远程主机配置
离线
找到了某个版本 QtCreator的代码, sshremoteprocess.cpp
Objects are created via SshConnection::createRemoteProcess.
The process is started via the start() member function.
If the process needs a pseudo terminal, you can request one
via requestTerminal() before calling start().
Note that this class does not support QIODevice's waitFor*() functions, i.e. it has
no synchronous mode.对象通过SshConnection :: createRemoteProcess创建。
该过程通过start()成员函数启动。
如果进程需要伪终端,则可以请求一个
通过调用start()之前的requestTerminal()。
我感觉 start() 之前没调用 requestTerminal(), 导致并没有伪终端.
离线
离线
离线
离线
再看下这个 sshkeydeployer.cpp
d->deployProcess.run(command, sshParams);
remotelinuxpackageinstaller.cpp
d->installer->run(cmdLine.toUtf8(), deviceConfig->sshParameters());
d->killProcess->run(cancelInstallationCommandLine().toUtf8(), d->deviceConfig->sshParameters());
remotelinuxcustomcommanddeployservice.cpp
d->runner->run(d->commandLine.toUtf8(), deviceConfiguration()->sshParameters());
从上面看均是调用 sshremoteprocessrunner.cpp
run() 而不是 runInTerminal(),
所以我觉得QtCreator这个软件ssh调试有可能根本没有开虚拟终端。
离线
好的,谢谢晕哥的解答。我再去找找是否有其他可配置的选项。
离线