NI-VISA MessageBasedSession发送命令字符串后跟二进制数据的方法

时间:2017-05-18 17:00:50

标签: c# visa

我尝试使用c#.Net中的NI-VISA将数据发送到数字存储示波器。首先使用以下方式从DSO收到数据:

            MessageBasedSession mbSession;
            MessageBasedSessionWriter writer = new MessageBasedSessionWriter(mbSession);
            MessageBasedSessionReader reader = new MessageBasedSessionReader(mbSession);
            reader.BinaryEncoding = BinaryEncoding.RawLittleEndian;
            writer.BinaryEncoding = BinaryEncoding.RawLittleEndian;
            string loadCommand = ":SYSTem:SETup?";
            mbSession.WriteLine(loadCommand);//edited from .Write() to .WriteLine
            byte[] setupData = reader.ReadBytes(2826);

到目前为止一切顺利,setupData中的字节是正确的。 问题是将数据发送回DSO。我能看到的唯一方法是使用两种写入方法:

            loadCommand = ":SYSTem:SETup ";
            mbSession.Write(loadCommand);
            writer.WriteBinary( setupData);

问题是看起来必须连续发送loadCommand和setupData,至少在文档中看起来是这样的: Setup Commands for DSO 此外,在试用和错误不成功的过程中,我唯一能够从DSO得到回复的时间是打印文件时无法识别'在DSO屏幕上。这是我试过的时候:

      mbSession.Write(loadCommand + strMBRSess);//get 'failed to read file' from DSO

其中strMBRSess是将setupData转换为ASCII字符串。尝试使用两个写命令发送相同的数据没有得到DSO的响应:

            mbSession.Write(loadCommand);
            mbSession.Write(strMBRSess);

我不确定MessageBasedSession可以做到这一点,并且很乐意: 1 - 当然是一种解决方案。 2 - 明确知道无法完成。 我在NI-VISA论坛上发帖,但没有得到任何回复。

汤姆回答后尝试了一些事情,

        writer.WriteBinary(Encoding.ASCII.GetBytes(":SYSTem:SETup ")); 
        writer.WriteBinary(setupData);//fails-no response

        writer.Write(":SYSTem:SETup ");
        writer.WriteBinary(setupData);//fails-no response      

        writer.WriteLine(":SYSTem:SETup ");
        writer.WriteBinary(setupData);//fails-no response 

        byte[] loadCommandBytes = Encoding.ASCII.GetBytes(":SYSTem:SETup ");//or....
        byte[] loadCommandBytes = Encoding.ASCII.GetBytes(":SYSTem:SETup " + Char.MinValue);

        byte[] CombinedCommandData = new byte[loadCommandBytes.Length + setupData.Length];
        Buffer.BlockCopy(loadCommandBytes, 0, CombinedCommandData, 0, loadCommandBytes.Length);
        Buffer.BlockCopy(setupData, 0, CombinedCommandData, loadCommandBytes.Length, setupData.Length);
        writer.WriteBinary(CombinedCommandData);//fails-no response

在同一方法中传递命令和数据都不会编译:

         writer.WriteBinary(Encoding.ASCII.GetBytes(":SYSTem:SETup ") + setupData); //operator + cannot be applied to operands of type 'byte[]' and 'byte[]'

找到一个帖子,显示这个有效。不幸的是,它不是.Net:Solution for Linux

1 个答案:

答案 0 :(得分:0)

我怀疑mbSession.Write(loadCommand)正在发送一个行终结符,而你不应该这样做。 VisaNS文档不会说,但是根据我对SCPI的理解,您的查询必须终止并且您已经说过有效,所以我得出结论Write(String)发送一个行终止符。

提示:请关注仪器前面板上的错误消息(如果有)。有时它们在调试期间比以编程方式检索的错误消息更好,更及时和更容易看到。

无论如何,这种方式应该有效:

writer.WriteBinary(Encoding.ASCII.GetBytes(":SYSTem:SETup "));
writer.WriteBinary(setupData);

而且,这可能:

writer.Write(":SYSTem:SETup ");
writer.WriteBinary(setupData);

我认为如果你创建一个方法,你应该使用MessageBasedSessionWriter中的WriteBinary,Write和WriteLine等方法。看起来MessageBasedSession中的方法是为了方便您在不需要MessageBasedSessionWriter来编写二进制文件时使用。