完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友

|
如题,在labview 串口通讯中,write.vi返回成功并不代表数据已经发送完毕(write.vi 返回成功只是说明把数据写到数据缓冲区了,但没有真正发送完毕),有没有办法可以知道发送缓冲区中的数据已经发送完毕了?谢谢了!
本帖被以下淘专辑推荐:
|
|
相关推荐
20个回答
|
|
|
|
|
|
|
|
|
可参考VISA写入函数帮助中关于同步传输的描述:
依据不同的平台,数据传输可为同步或异步。右键单击节点,在快捷菜单中选择同步I/O模式»同步,可同步写入数据。 硬件设备同步传输数据时,调用线程在数据传输期间处于锁定状态。依据传输的速度,该操作可阻止其他需要调用线程的进程。但是,如应用程序需尽可能快地传输数据,同步执行操作可独占调用线程。 注: 在大多数应用程序中,与不多于4台仪器进行通行时使用同步调用可以获取更快的速度。与不少于5台仪器进行通信时,异步操作可使应用程序的速度显著提高。LabVIEW默认为异步I/O。 如果用异步传输模式,需要对VISA 写入缓冲区进行管理。可以用RS232的回环接线方式,测试你的发送和接收程序,如果有条件的话,可以用示波器观察。 如果想对windows下串口通信机制深入了解,可以参考如下资料:windows原理+serial driver 源码+16550d芯片资料(美国国家半导体公司) 可以用硬件流控或软件流控,解决发送数据覆盖或丢失的问题。 |
|
|
|
|
|
谢谢fantek的回复,我试过了在write.vi里选择I/O同步或异步,但好像没有什么效果似的,结果都一样。其实我要知道write.vi的数据缓冲区发完数据的时间点(或返回状态),是因为我现在有一个任务,就是要用RS232与下位机通讯,发数据时,我要把DTR脚位电平置低,然后,在发完数据后,我要把DTR脚位电平置高,等待接收下位机的回复(我需要的是同步,即DTR=低电平时,在发送数据,DTR=高电平时,在接收数据),现在的问题是,我用示波器观察,发现我把数据写完后(问题就在这里,写完数据不等于发完数据),也把DTR脚位电平置高了(置高原因是接下来我要去接收数据了),后发现,我把DTR脚电平置高时,串口还一直在发送数据,而且,发现在我把DTR脚电平置低时,会延时一两个ms串口才开始发送数据,也就是说,它们是不同步的。我不知道你是否明白我的描述。 因此,我现在就想知道怎么样才能知道发送缓冲区发完数据了,这样,我就可以才把DTR的电平置高,这样也才不会出错,才会同步。 |
|
|
|
|
|
本帖最后由 fantek 于 2013-12-31 21:12 编辑
把Txd和Rxd短接,发送数据后再读取。判断发送和接收的数据或长度是否相等。如果相等,再发送下一条命令。如果同时接收到发送数据和下位机回传数据,对数据包拆分后再判断。如果上位机有两个串口,可以用一个发送命令,另一个监测。visa write函数有个返回字节数,可以与发送命令缓冲长度比较。 很少这样做,但方法应该可行,你实验一下。 比较简单的方法是发送后延时一定时间。 评分 |
|
|
|
|
|
我的试验的程序框图如下:
目的就是把DTR置低后,发送数据,然后把DTR置高,接收数据。(这是根据下位机要求而做) 我能在结果中看到我写的数据与write后返回的长度是一致的,说明当返回wirte时,全部数据已经写到发送缓冲区去了,可当程序跑到DTR置高时,在示波器上测得Txd还一直在发送数据(此时在示波器上检测DTR已经是高电平了,而因为此时DTR已是高电平,所以下位机也收不到数据了),所以,这就与我的出发点不一致了,它们也不同步。 PS:我的下位机是半双工的485,当它检测到DTR是低电平时,它就会接收数据,然后根据数据命令返回数据给我,当它返回数据给我时,DTR电平必须为高(也就是我必须把DTR置高,我才能收到返回的数据,否则我收不到数据,简单说就是相当于下位机是发了数据,但因DTR不等于高,所以数据发不出来,给丢掉了。我的下位机不会去设置DTR的任务状态,全靠我这方去设置) 不能用延时的方法,因为这时间点确实很难掌控,当下位机收到命令时会马上返回数据,而它返回的时候,DTR必须为高我才能收到。 |
|
|
|
|
|
本帖最后由 fantek 于 2013-12-29 23:54 编辑 在串口配置下的流控制模式设置为DTR/DSR,在VISA Write函数之前加延时,VISA Write设置为同步模式。如果还不行,能否发一下你的端口连线图。
|
|
|
|
|
|
谢谢版主,我用你的方法去试,可连数据都发不出去,有错误发生。我现在给你说说我所做的: 假如我程序框图如下:
(write的I/O设为同步,read的也设为同步) 前面版:
在示波器上看到的是:
放大它看是:
从示波器上看到,1线(即黄色线)是DTR的检测线,2线(即天蓝色线)是Txd的检测线,它们并不同步,在DTR线变为高电平时,Txd线还一直发送数据。 如果把流控制模式设置为DTR/DSR,也把write的I/O设为同步,如下图
则会出现错误:
以上接示波器的方式都是:RS232的第四脚DTR接示波器的第1线CH1,RS232的第三脚Txd接示波器的CH2,它们的地共接RS232的第五脚(共地)。 |
|
|
|
|
|
|
|
|
|
|
|
本帖最后由 fantek 于 2013-12-31 15:03 编辑 1.串口硬件流控握手过程 串口输出信号共有Txd,DTR,RTS, 下面资料中的图3是硬件握手示意图。
Understanding Power Requirements in RS-232 Applications.pdf
(325.53 KB, 下载次数: 105
)
1.1.RTS-CTS流控接线方式
1.2.DTR-DSR DCD流控接线方式
1.3.串口回环模式接线方式
2.通过RTS线作为收发控制的串口通信实验 2.1上位机串口的接线方式 (1)RTS与CTS短接,同时RTS接到下位机。 (2)DTR-与DSR,DCD短接,同时DTR接到下位机。 问题是目前上位机如何通过RS485与下位机连接的,也就是DTR如何和下位机接线的。Txd和Rxd通过RS232到RS485转换器以半双式方式与下位机连接,那么DTR是用另一个转换器与下位机连接吗? 调试时,(1)和(2)可以同时或分别连接。 2.2上位机软件串口配置及程序设计 (1)串口配置为RTS/CTS硬件流控模式, 异步或同步读写收发。发送不同长度的字符串(0x55),用示波器观察RTS与Txd的同步关系,如果有滞后长度是否是固定的还是变化的。 (2)串口配置为DTR/DSR硬件流控模式,异步或同步读写收发。发送不同长度的字符串(0x55),用示波器观察DTR与Txd的同步关系,如果有滞后长度是否是固定的还是变化的。 (3)程序中需要置位或复位RTS、DTR状态。如果RTS、DTR与Txd的同步滞后时间几乎是固定的,这个时间可以用示波器测量出来。在写入串口之后和DTR-RTS置高之前在程序中加入延时,不断调整,达到完全同步状态。 这种用法比较新颖,实验比较繁琐,希望楼主成功! |
|
|
|
|
|
非常感谢fantek的帮助,我会参照你说的方法去试试, |
|
|
|
|
|
该法撒法的撒法撒大方三分
|
|
|
|
|
fantek 发表于 2013-12-29 15:37 好好爱好啊哈奥好啊好啊好懊悔 |
|
|
|
|
|
好东西,顶上
|
|
|
|
|
|
不是有设置VISA缓冲区的控件吗?把它设置为0试试。
|
|
|
|
|
|
缓冲器控件说明:如在未指定缓冲区大小的情况下调用该函数,函数可设置缓冲区大小为4096字节。如未调用该函数,缓冲区大小取决于VISA和操作系统的设置。
|
|
|
|
|
|
经过多次试验,找到了判断缓存数据是否空的办法,这些实现起来太复杂,仔细想想就会明白
|
|
|
|
|
|
|
|
|
|
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
211 浏览 0 评论
请教大神,在labview里面对实时扫描资源中的C系列模块NI9234进行配置发生非预期错误
1709 浏览 0 评论
1585 浏览 0 评论
LABVIEW 2023 Q1调用python后一直报错1671
1960 浏览 2 评论
5207 浏览 3 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 04:51 , Processed in 1.772982 second(s), Total 118, Slave 98 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
2520