Labview如何判断RS232发送缓冲区中的数据已经发送完毕?

2019-07-17 18:16发布

如题,在labview 串口通讯中,write.vi返回成功并不代表数据已经发送完毕(write.vi 返回成功只是说明把数据写到数据缓冲区了,但没有真正发送完毕),有没有办法可以知道发送缓冲区中的数据已经发送完毕了?谢谢了!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
馨雨
1楼-- · 2019-07-17 18:56
顶上去
fantek
2楼-- · 2019-07-17 23:26
可参考VISA写入函数帮助中关于同步传输的描述:
依据不同的平台,数据传输可为同步或异步。右键单击节点,在快捷菜单中选择同步I/O模式»同步,可同步写入数据。
硬件设备同步传输数据时,调用线程在数据传输期间处于锁定状态。依据传输的速度,该操作可阻止其他需要调用线程的进程。但是,如应用程序需尽可能快地传输数据,同步执行操作可独占调用线程。
注:  在大多数应用程序中,与不多于4台仪器进行通行时使用同步调用可以获取更快的速度。与不少于5台仪器进行通信时,异步操作可使应用程序的速度显著提高。LabVIEW默认为异步I/O。

如果用异步传输模式,需要对VISA 写入缓冲区进行管理。可以用RS232的回环接线方式,测试你的发送和接收程序,如果有条件的话,可以用示波器观察。
如果想对windows下串口通信机制深入了解,可以参考如下资料:windows原理+serial driver 源码+16550d芯片资料(美国国家半导体公司)
可以用硬件流控或软件流控,解决发送数据覆盖或丢失的问题。
utdhome
3楼-- · 2019-07-17 23:34
fantek 发表于 2013-12-29 12:35
可参考VISA写入函数帮助中关于同步传输的描述:
依据不同的平台,数据传输可为同步或异步。右键单击节点, ...

    谢谢fantek的回复,我试过了在write.vi里选择I/O同步或异步,但好像没有什么效果似的,结果都一样。其实我要知道write.vi的数据缓冲区发完数据的时间点(或返回状态),是因为我现在有一个任务,就是要用RS232与下位机通讯,发数据时,我要把DTR脚位电平置低,然后,在发完数据后,我要把DTR脚位电平置高,等待接收下位机的回复(我需要的是同步,即DTR=低电平时,在发送数据,DTR=高电平时,在接收数据),现在的问题是,我用示波器观察,发现我把数据写完后(问题就在这里,写完数据不等于发完数据),也把DTR脚位电平置高了(置高原因是接下来我要去接收数据了),后发现,我把DTR脚电平置高时,串口还一直在发送数据,而且,发现在我把DTR脚电平置低时,会延时一两个ms串口才开始发送数据,也就是说,它们是不同步的。我不知道你是否明白我的描述。
    因此,我现在就想知道怎么样才能知道发送缓冲区发完数据了,这样,我就可以才把DTR的电平置高,这样也才不会出错,才会同步。
fantek
4楼-- · 2019-07-18 01:59
本帖最后由 fantek 于 2013-12-31 21:12 编辑

把Txd和Rxd短接,发送数据后再读取。判断发送和接收的数据或长度是否相等。如果相等,再发送下一条命令。如果同时接收到发送数据和下位机回传数据,对数据包拆分后再判断。如果上位机有两个串口,可以用一个发送命令,另一个监测。visa write函数有个返回字节数,可以与发送命令缓冲长度比较。
很少这样做,但方法应该可行,你实验一下。

比较简单的方法是发送后延时一定时间。

评分

参与人数 1威望 +5 +5 积分 +5 收起 理由 A670521546 + 5 + 5 + 5 您的帖子很精彩,期待您分享的下一个帖子!.

查看全部评分

utdhome
5楼-- · 2019-07-18 03:14
fantek 发表于 2013-12-29 18:55
把Txd和Rxd短接,发送数据后再读取。判断发送和接收的数据或长度是否相等。如果相等,再发送下一条命令。如 ...

我的试验的程序框图如下:
DTR.JPG
目的就是把DTR置低后,发送数据,然后把DTR置高,接收数据。(这是根据下位机要求而做)
我能在结果中看到我写的数据与write后返回的长度是一致的,说明当返回wirte时,全部数据已经写到发送缓冲区去了,可当程序跑到DTR置高时,在示波器上测得Txd还一直在发送数据(此时在示波器上检测DTR已经是高电平了,而因为此时DTR已是高电平,所以下位机也收不到数据了),所以,这就与我的出发点不一致了,它们也不同步。
PS:我的下位机是半双工的485,当它检测到DTR是低电平时,它就会接收数据,然后根据数据命令返回数据给我,当它返回数据给我时,DTR电平必须为高(也就是我必须把DTR置高,我才能收到返回的数据,否则我收不到数据,简单说就是相当于下位机是发了数据,但因DTR不等于高,所以数据发不出来,给丢掉了。我的下位机不会去设置DTR的任务状态,全靠我这方去设置)

不能用延时的方法,因为这时间点确实很难掌控,当下位机收到命令时会马上返回数据,而它返回的时候,DTR必须为高我才能收到。
fantek
6楼-- · 2019-07-18 06:35
 精彩回答 2  元偷偷看……

一周热门 更多>