http://bbs.elecfans.com/jishu_467802_1_1.html
这一节是最重要的部分。懂串口通信的,可以绕过。 问题是:很多学 LabVIEW 的各种基础都没有,真让人捉摸不透,没学过 C 或者 C++,不懂数据结构,不过,如果你真的不懂懂,我还是讲一讲。 首先你要看说明书,保证物理连接正确。其次,找到你需要的协议。 假设你找到一个仪器模块的指令,如下。一般都会有输入命令,跟返回的。 首先,用串口助手测试下。先看自己需要的功能,一般仪器的功能都特别多。而自己一般需要测试输入通道或者输出即可。所以,先找到自己需要的功能。 上位机仪器的通信方式主要分为下面几种; ①,只发送指令,不接受指令。 ②,不用发送命令,就只用读取响应。 ③,发送一次指令,只读取一次响应。 ④,发送一次命令,就一直连续读取响应 很多人,如果自己写单片机的话,大多都一直发送命令出来,就是第②种。正常的仪器,是第①③④种居多。 所以,首先分清你的仪器的指令,有没有返回字符串等。 ![]() 如上图所示,如果是这个仪器,你就按后面的功能发送。注意那些 dd 和 nn 是格式说明符。上图的仪器,dd 指仪器的 ID 号,如果你仪器是 01,你要输入 ASCII 格式,就是输入 *01A。注意不要混淆了格式符。 下面看看 Keithley2000 的指令怎么用。 ![]() 如果是国外的仪器,说明手册里面,都会有个 Remote Operation.见上图,是 Keithley2000万用表的说明书。自己看相关章节指令。 如果我们要读取 Keithley2000 测量读数,就可以用下面的 SCPI 指令。 ![]() 在串口调试助手里或者 LabVIEW 发送一个 :READ?然后就会返回仪器读数。其他指令参照说明书即可。不过国外的一些仪器,有些指令可能有先后顺序,需要按一定顺序发送。具体看说明书。 -------------------------------------------- 如下是,另一个仪器的说明片段,差不多告诉了用户格式。 注意看我红框部分。每个仪器差不多都会有的。都有发送命令,和相应命令。然后发送的命令和相应的命令都是有格式的。按照说明书的格式来。这个,是发送一次指令,就返回一次响应的。后面会详细解释。 ![]() 这台仪器,还提供了例子,自己可以用这个例子测试一下仪器通不通。后面的接受数据部分,请看字符串那一节。 下面,我们把上图的例子部分,用 LabVIEW 写一下。 注意:命令串:$012B7(cr)中$012 是 ASCII 显示下的,而 B7 是十六进制显示下的。cr是回车符,即 16 进制的 OD。 由于显示不一样,所以我用连接字符串来组合。 ![]() 这样,最简单的收发式的仪器通信就完成了。 问:我看自带的范例,在 VISA 写之后,都有个延时,这个延时,起个什么作用? ![]() 这个延时,主要是因为编程人员用的是这种组合。前面已经讲过了,它读取串口缓冲区所有数据,当你发送一个数据,要等待仪器回送完响应数据,再读取才是完整的数据,所以,要等待仪器响应。这个时间,看自己摸索,最好刚好合适,毕竟一直等待也不是最好的方法。 如果是本例,由于回送的字符串是固定的,如下图,有 11 个,那你就可以不要用延时。直接用固定字符串,这样,程序自己会自动等待 11 个字符串接受完再执行下一个。 正常情况下,如果接受的字符串是固定的,推荐使用固定字符串个数,就是如下图的方式来编程,等待延时这种方式不推荐。 ![]() 注意:以上程序是发送一次指令,仪器回送一次响应的。有些仪器的指令,可能不需要返回指令。 下面举例一下: 比如某个仪器的开关接口,开关的命令如下,没有返回值; 输出允许:OUT1 禁止:OUT0 那么最简单的程序如下,控制开 ![]() 有些仪器,检测到串口连接或者打开电源就会往串口发送数据,利用如下组合就可以了。因为上位机只需要读串口,不需要写串口。 ![]() |