当前我在做的是这样一个功能,网页上点击一个按钮,然后调起一个unity项目管理器,说的管理器,也就是通过管理器打开unity程序,如果本地安装了unity程序,就直接打开,如果本地没有,或者更新了unity 程序,那么这个管理器还需要更新这个unity程序.流程大概是这样.那么遇到的问题是:unity程序里面有串口通讯的功能,既然有串口通讯,那么就肯定会有获取串口的功能,但是这个功能没有写在unity中,我是写了一个控制台程序,获取到串口号,再传给unity.
那么流程清晰了
网页点击打开按钮->调起unity管理器(根据网页的参数打开或下载对应的unity程序)->unity需要打开exe获取串口号.
但是在跑流程的时候遇到的问题是:如果直接双击打开unity程序,获取到串口号是没有问题的,上位机与下位机通讯都正常,但是如果在网页中通过按钮打开unity程序,就不会获取到串口号,也就是说unity没能打开它专用的获取串口号的exe程序
一开始,我以为是因为放在C盘的原因,因为C盘是禁止一些敏感操作的,后来放在D盘,发现还是这样.
分析问题:既然双击unity程序可以正常打开,那么就说明unity本身这块的程序是没有问题的.通过管理器打开失败,基本确定问题出在管理器.
那么先看看管理器是怎么打开unity程序的
Process.Start(Contant.AppPath + Contant.VirtualVision + @"\" + Contant.VirtualVision + ".exe");
这样调起exe是没有问题的,但是搜索到msdn上的解释:
也就是说通过System.Diagnostics.Process.Start()打开的程序是一个独立的exe文件
但是如果被System.Diagnostics.Process.Start()打开的这个程序还需要调用配置文件或者是其他的什么文件,则必须设置WorkingDirectory,将工作目录指向需要被调用的配置文件所在的目录。否则,这个通过System.Diagnostics.Process.Start()打开的程序将会找不到该配置文件。
所以要将以前的打开方式变化一下:
Process process = new Process();
process.StartInfo.FileName = Contant.AppPath + Contant.VirtualVision + @"\" + Contant.VirtualVision + ".exe";
//MessageBox.Show(process.StartInfo.FileName);
process.StartInfo.WorkingDirectory = Contant.AppPath + Contant.VirtualVision;
process.Start();
改成这样之后,通过网页打开unity程序后,unity自己能打开获取串口号的信息,软硬件结合的数据通讯问题到这就解决了.