LabVIEW串口通信解析.doc_第1页
LabVIEW串口通信解析.doc_第2页
LabVIEW串口通信解析.doc_第3页
LabVIEW串口通信解析.doc_第4页
LabVIEW串口通信解析.doc_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

LabVIEW串口通信详解0 ( m. I, a8 o Q7 H0 X! x r) ( o0 R4 W+ Y8 串口可以说是我们最容易见到,也最容易接触到的一种总线,台式机上一般都有二个,而现在很多下位机、仪器等很多都还是使用串口通2 |% t, S0 9 Z+ U; B5 % n B4 M- & M! P9 d信的。论坛上很多朋友都经常会使用到串口,并遇到一些问题,这里有必要做一个详细的说明,以方便广大会员朋友,文章请勿转载到其它地+ : 3 X) f0 W+ a5 9 F3 R8 z m- e. d8 e5 E方,谢谢。0 a) D, A9 n* . Y1 k5 W: S! C4 N4 c+ j, z! o& r$ L 论坛上早先发布过一个贴子,叫串口WORD资料,里面有一些中英文的串口的资料,这个文章是对那个资料的补充,如果是初接触, d2 z& a/ n3 V* D+ a6 6 V; - I% V; I3 R( W串口的朋友建议先看一下上一个贴子先。上一个贴子中提到过的内容这里不再进行补充。+ D; W6 I. g& _# n1 h6 S6 G* J9 d$ S/ ?. r2 v5 j y 首先补充一个比较重要的问题,就是在LabVIEW中使用串口的话一定要先安装VISA这个驱动,然后生成的EXE运行时也需要在目标机上安装VISA Runtime Engine,可以在打包时一起打包。- l% D% w) J5 H- rVISA的驱动可以在NI网站上下载到:7 E9 E l6 _( m! l, C& t! /nidu/cds/view/p/id/1605/lang/zhs4 l( ! f$ J; t2 e0 C! Z v/ h b! o4 Q( u0 r0 - F L( s ?0 K7 R7 ) s, gj, f) # x1,串口扩展的问题 R% X) D/ e7 i9 k- z5 P) : C! J2 u; g6 q$ L3 V先说一下串口的扩展问题,一般的台式机或工控机上都至少有二个串口,一般都是够用的,但是现在市场上已经很难找到带串口的笔记本7 ) q2 % a5 G$ q5 J9 r: P% G- Z5 F) t% r3 v- y8 c了,而有时候在外出调试时需要在笔记本中使用到串口的,这时一般是使用USB-RS232的转接线,价格从十几到一百多都有,很多朋友反应# Y+ i9 j% S/ T; b1 ?* l! ; P- t8 ? o- L Y4 d9 a在使用价格低的转接线时会出现乱七八糟的问题,而贵一点的线就很少听说有其它问题的,所以大家在使用便宜的USB-RS232转接线时要特# K: X( C( D. s: X4 _$ M4 h! W! 9 w8 h# n2 l5 J+ t; p别注意线的质量,遇到一些奇怪的问题时先考虑换一根好一点的线。PCI-RS232扩展卡也同理,便宜的卡也容易出问题,尽量买好一7 P4 w P1 i# W) D$ A% W9 S0 P; p- |; n点的,以免因小失大。PCI-RS232一般至少能扩展2个串口,有些BT一点的可以扩展到8-16个,一堆线和接头。转接线和扩展卡一般是要装! T: 6 C) N6 A! L# D. 8 5 Y3 x4 ?* _$ m9 F# Q. V驱动的。8 T! K$ O. n: ( K& 5 e+ L% x9 q) & # J2,串口功能的确认( g+ S. u; B( p% O$ kNJ4 B4 p: mg在使用串口之前,最好先确认一下串口是否正常,特别是使用转换接或扩展卡的。检查的方法很简单,就是将串口的2、3脚短接起来,; i9 h8 P8 a3 7 t6 g+ n1 V2 z5 v7 k3 v! D- H脚是发送数据,2脚接收数据,就是这个串口自发自收。电脑上的串口软件一般是用串口调试助手,很出名的,也好用。如下图所示:2 c( M # K! Y: c7 J! W: b( 4 q! t, h! , # P+ M4 & eZ3 r# $ z8 f1 t/ N0 PS. u3 h$ P C 图1 串口调试助手一打开软件,选择已经短接好的串口号,点击“手动发送”,如果串口是好的,2、3脚又短接起来了,马上就可以在上面的接收框里看到接. B D2 1 O( N+ u3 r- s, z; y7 I# X0 U- J! l, A收的数据就是发送的数据。稍微要注意一下的是有些电脑的COM1和COM2的位置是反过来的,所以要确定好串口调试助手左上角的串口上选4 a1 q F, t: w; ) i# |& V2 A X X, e: ?5 w择的是已经短接的那一个,如果COM1没接收到,可以再先COM2再发一次看一下。3 W3 + |# u6 4 j# z+ 8 W; ? M8 ?4 v3,串口线的检查2 n! h, P 7 W9 H5 Z7 |6 v$ R# 9 D! N! D7 h检查好串口后,一般也要注意一下使用的串口线,标准的串口线是9根线都是用上的,但有一些是只使用了三根线的:2、3、5。第3个脚- / N3 b; - D2 n- e2 S# Q# B8 R& p; m. z$ A/ k x管是发送,第2个管脚接收,另一个5是地线,这里叫它简化的串口线,简化的串口线能用上的地方,标准的串口线也肯定能用上,因为标准! G! q n! a% O% ?% f- G. b6 T6 j6 b H# y7 o线的9根线已经包括了简化串口线中的3根线,但标准串口线能用上的地方,简化串口线就不一定能用上,所以在使用串口线之间一定要确定8 e3 F- x2 l4 E1 O& t, b) Z& B. l0 _; q5 ?2 f好串口线的类型,一般买的串口线都是标准线,但自制的串口线因为应用场合不同就要先确定一下。: J9 H# C/ A F/ w Q3 # f5 l, _X0 b) L串口线还有一个地方需要注意一下的,就是2、3脚的接法,标准接法中是2、3脚交叉的,即这边的2接另一边的3,这边的3接另一边的2,扭6 ) f U2 e v0 v7 x* U- $ M9 |0 c5 X. L |/ Z c- y! Q E了一下,所以叫交叉线,因为正常使用时,这边第二脚是发送数据,另一边第三脚是接收数据,所以要将这二个管脚连接起来,这样才能正常( 4 x% o& A0 g+ h) h4 ( e K e# r fW+ t: 6 使用。但是有些情况下,2、3是直连的,即这边的第2脚连接另一边的第2脚,第3脚连接第3脚,这种叫直连线,这种线一般是用于延长串口% L; A. D0 T! a1 C: L4 p/ K) L pe9 p7 Z+ R8 x; & _的,比如需要将工控机的串口接头引到机柜表面上时,就使用这种线,这样机柜表面的串口线的定义还是跟电脑接出来的一样,外面的那一根4 ?( I% a( U# $ Q- - D/ X% j. J8 H% l$ t, Af$ k7 M. p串口线再使用交叉线。从电脑主板上将串口引到主机后面板上的线就是这样的直连线。# F a- r+ a( n, e+ 0 ji$ E5 # Y4 U q+ b+ : Z购买串口线的时候一般也会问你买直连的还是交叉的,要区别对待。6 l5 s6 % U3 4 : g- h i+ l/ J/ M1 串口线还有一个要稍微注意一下的就是DB头,因为电脑上接出来的一般是公头(针),要跟电脑接的话要母头(孔),一般仪器的串口也是9 Z ?! V! J0 h3 hj7 3 r# b! ! - e公头,所以二边都是母头的串口线比较常见。* X5 e( 6 G6 A9 ( X. c- ?; x1 p, c5 A c1 C串口的接头一般是DB9的,也有DB25的,但比较少用,有些比较BT的仪器厂家居然用RJ11(水晶头那种)作为串口头,让人不爽!, J9 k# * o( n$ z w7 r) d; c4 n* 0 I* i : D% Z7 e! e/ c7 m3 v总之,使用串口前一定要先确定好硬件没问题,不然很浪费时间的。. M, g0 B + q4 T# G8 C ?: u# t* N4,串口参数设置) n% Y( q! H) Y R/ Q- n6 Gq: C8 F7 o% p0 b在LabVIEW中使用串口时,有几个参数比较重要,需要先说明一下的。: v) q3 z8 t; P7 y: z v( g1 R$ f9 r 一个是串口初始化这个节点的“终止符”和“禁用终止符?”这二个输入端,这二个输入端是相互作用的,“终止符”默认值为10,它* k) Z( a# t x( z3 A9 f* D x( i的十六进制是“0x0A”,这是一个ASCII码,是一个换行符,可以从LabVIEW中的字符串的不同显示形式看出来,如下图:; Q0 H) |2 m( U D! - x; H# N! V. u- k& J x 图2 串口消息终止符5 , a, u& r+ u1 I: a) * T. a3 W q 左边是字符串的正常显示,中间是十六进制显示,右边是“代码显示”,这三个字符串的值都是一样的。终止符是10,表示在接收数据1 . J5 y& K4 ?9 ) j# 7 0 p( C$ G; t : T1 c2 A$ D+ j# 时,遇到ASCII码为10的字符(即换行符)时就停止接收数据,后面会有例子进行说明。, z1 z6 |% n) C$ N: H0 D# Q+ N$ B; V3 s8 v$ Z r, f- . L8 k( ?而“禁用终止符?”的默认值是FALSE,即启用终止符,启用终止符会有什么效果呢?终止符的意思就是当程序接收到这个字符时,就认为已! e% G# c4 J1 i) O: g- a1 w* V5 |8 d$ p5 K 经到了所有数据的未端了,从而停止接收,不管后面还有没有数据。终止符是10,表示在接收数据时,遇到ASCII码为10的字符(即换行7 |8 j; D* U5 x0 Og! vDt6 d% o2 S! f5 L6 l符)时就停止接收数据。3 t x% J% U) . F* Z2 m3 % hs, ( I* / l1 Af+ f8 i8 r 可以做一个很简单的试验,先短接串口2、3脚,然后将终止符设置为“0x33”,0x33是字符“3”的ASCII码,然后发送字符串0 ?* q- A7 l* u- R1 eR3 N7 N1 l; z1 c“123456”,可以看到接收回来的数据中只有“12”,即“3”被认为是字符串的未端了,它后面的数据就不再接收了。很多朋友就是因为% d0 R# t7 ) m1 S7 x& U. / A- q( 这里设置错误,导致接收数据时有时候只收到一半就没有了,特别是在连续接收数据时,但又不是每次都只能收到一半,有时候也能接收齐全: v1 U0 K4 s- l2 2 G! Y: H) * X0 i! u+ t8 i$ i的,就是因为发送的数据中可能包含了终止符而使串口认为到了最后一个字符了。一般是将这个终止符禁用掉,即将“启用终止符?(Enable7 t1 ! S2 |5 , Y& Z% A9 z% B; P: r9 n1 uterminator?)”这一端输入为False即可。% A7 F7 u/ a) P6 u- |$ * EL j p+ w: & M( JH4 : k# L # L6 b( I9 D9 N* c 另外还有一个比较重要的设置,就是VISA READ的“读取字节数”这个输入,由于在串口通信中,如果指定读取100个串口缓冲区的字6 s _ R# o- m& U# v: s. C% 0 f- f& I节数,如果当前缓冲区的数据量不足100个时,程序会一直停在VISA READ这个节点上,如果在超时的时间(默认是10秒)内还没有凑足$ B2 h4 q* t3 . G6 G+ Y, O* H+ E1 ; C. * V100个数据的话,程序就会报“Time out”的错误,如果超时时间设置得太长,有可能导致程序很长时间停止在VISA READ这个节点上。解3 q5 T; * K/ A9 % XA2 I) J0 s/ G: p5 V y# c- f) f4 j* H决的办法是使用“Bytes at Port”这个串口的属性节点,在VISASerialadvance下,也可以在VISA资源线上右键创建属性+ v9 / G2 e8 r$ e( # a : l) 0 ?0 X7 U. o0 F W1 J9 节点串口设置Bytes at Port,如下图:2 B- |% m6 Gc4 D1 w% y, HX) C1 j+ 8 % s8 j Q+ 9 w C9 x% _- C- m6 ? - K& v6 2 F5 e ; L- E! j6 g ! x, p; X% l/ 5 h图 3 Bytes at Port6 e& K! R- D, h$ I* V- r) _0 O0 S) E w N5 U2 m6 o( z, z这个属性节点读取当前串口缓冲区有字节数,然后将它的输出连接到VISA READ的“读取字节数”这个输入端上即可,这样当前缓冲区中有1 f! B) j; J1 T: n w8 D. v1 : r U- 多少个字节就读回多少个,不会有任何等待。; j7 c1 . O9 E2 V W. H. i. F8 R6 v7 pg: P, vM0 n , u0 E+ x- J l$ 图 4 使用Bytes at Port1 - B9 y8 C5 c# . : N& T5,在LabVIEW中使用串口4 A8 P . N$ ; X. |I& Ku$ % $ z Z) Z目前串口的应用一般有二种类型的(以我接触到的来分类,不严格),一种是仪器控制类型的,一般是上位机发送一个指令,然后下位机* Y4 + i+ S/ l0 p* S- X/ p- o! z8 p?. m y作出响应,返回数据给上位机,上位机再读取出来,完成一次通信,即一问一答;另一类是被动接收形的,即下位机会一直发送数据上来。这; ?4 n# h/ u# z* # C% v v2 t二种类型的串口通信在处理上会不太一样。 C) _( V6 |6 r# 6 ?6 y6 Z; w; e, k$ + J: B& 2 z! Z& b1 5.1 仪器控制类型t3 e( p3 i1 Q0 8 N. i2 B8 v! q2 W+ t& A2 H 由于在仪器控制时一般都是这种一问一答的方式,所以叫它仪器控制类型。以仪器控制为例来说一下需要注意的事项。6 z9 b, 3 W) W8 , , 2 7 J% K- P: e$ K4 e 首先是要确认仪器选择的通信模式是串口通信模式。现在的仪器一般都至少有二种通信模式,一种是RS232,一种是GPIB,如果仪器是9 R+ l- _ J. O7 g. k4 V l8 0 n6 d+ R , F7 s M7 设置为GPIB通信的话,RS232是不可能通信上的,所以要先确认一下,方法一般是在仪器面板上选择设置远程控制GPIB/RS232,各 S c/ S) G/ |# 7 |% M3 u* D5 g- k+ G1 g( j9 |个仪器稍微不同,可以查仪器手册看一下。J& & e2 r+ S* Y! f- v3 r % x! J0 u/ E 然后就是确认串口的通信参数的配置,包括波特率、数据长度、校验方法等,有些仪器的某些参数是固定的,比如校验方法固定为奇校) f) Y# T; h5 B4 e* , V $ v o1 r( C验,不能修改,只能在电脑上跟仪器设置为一样的。波特率一般是可以修改的。这些参数的配置一定要根据仪器手册上的来设置。如果参数设7 i3 e% V! D6 N/ q, F- , V3 , V( D2 o置不正确,也能收到一些数据,但一般是乱码,如果收到的数据都是乱码的话,就要先检查一下串口参数设置是否正确了。只有电脑和仪器二 J! x8 V0 r L* u1 q3 w4 ( s+ J7 Q! Y* u边的串口参数完全一致时才能收到正确的数据。9 L, Q l# S; w1 s; j. T/ ) U! w* E 接着是要注意发送指令和读回数据之间要有一定的延时,即VISA WRITE和VISA READ之间要有一定的延时,一般200毫秒即可,因为. V4 3 p, k. A& J- D4 c# x& l3 V/ X- q2 O% b串口是底层硬件,数据从软件到串口上要一点点时间,然后仪器对指令作出响应也要一点点时间,这些时间加起来肯定比软件运行二个节点的9 u: b/ * . J8 I! b) + h3 Y7 w9 g4 p* H时间要短,所以延时是一定要加的。在调试时如果发现正常运行时不能收到数据,但高亮运行就能收到数据,就很有可能是没有加延时的原0 Q$ d/ J( E* i4 U# J, v% P2 z% : 6 k! E J因,或者是发一个查询指令,但返回的是上一条查询指令的结果,也可能是因为没有延时或延时不够。+ d- ? g2 A c+ y8 j1 k) j, q+ Q, H% ( C: N. D; Y v2 l$ p/ Y T) g/ T( h( 7 w: ju! W5.2被动接收类型0 n6 d) |9 P7 G7 _* ?, p# Y9 ) H0 H) j, F! o. I5 C 被动接收形的串口通信稍微麻烦一点,由于上位机是被动接收的,上位机不知道什么时候开始下位机就已经有数据上来了,很有可能下- ?: N& I/ Z4 v. V! V% P% y& X) ?, v位机发送到一半时,上位机刚好开始接收数据,这时只能接收到后面一半的数据了,所以对于这种通信,一般是采用数据帧的方式进行通信。) C, j1 u) y. S5 E8 n6 |# 5 N5 K+ x- Z6 o9 7 T9 C( o) t, F/ 3 I6 l 这种数据帧的通信方式至少由三部分数据组成:帧头、数据、帧尾(如果数据是固定长度的话,似乎帧尾也可以省掉)。帧头是为了告诉( e$ c- U) w. S. + C8 L5 eW2 X* T9 i上位机:从这以后的数据就是有用的数据了,相当于约定好的暗号,一般帧头至少会用二个以上字节,如果只用一个字节的话,万一数据中的& ( h0 j& # p+ 4 I4 p8 x3 f* y6 H/ f( L# a* Y3 l7 p8 P2 I数据跟这个帧头一样了就会误以为这个数据是帧头从而导致解析数据出错,帧尾的作用也差不多,告诉上位机从这之前的数据才是有用的数: - L/ N3 a6 P: j5 C6 p1 y, & k& n% f0 l! Tu) T3 b据。但实际上一般的数据帧远不止这几个部分,还会加上一些校验字节、时间信息、帧计数器之类的东东在上面。其中校验字节是为了检查数) z$ I1 # S 9 m; x7 Gi0 O5 . b V$ m o% w7 _+ P; ?据在传输过程中有没有出错的,跟串口的校验位要区分清楚,校验位也是检查数据传输时有没有出错的,但由底层硬件来实现,校验方法由标 I: P! r. . J* Q% D7 l) G% |; D2 x- j3 b3 C6 K0 f F9 z: D) 准规定好,但有几种可以选择,只有一个位(Bit,只能是0或1),校验字节是由软件层来实现的,至少有一个字节(Byte,有8个位),而且$ / p# A0 m7 E A# U. C# 5 U3 - 0 |K校验方式由用户定义,非常灵活。& Y: b# E z: E. M. N( J5 E( e9 l+ & C# c1 v 由于被动方式中串口的缓冲区中一直会有数据在,为了保持数据的连续性,在读取数据时跟第一种仪器控制类型不一样。而是采取将读取1 O5 V: m- M% b5 |7 Y8 F5 n5 ?# Z的所有的串口数据都保存在移位寄存器中,在软件上处理完这些数据后再将它们从移位寄存器中删除。由于VISA READ的输出是字符串,所I X3 Z( R7 x, P! _# AZ5 K0 + 0 2 E* D: z以一般使用“连接字符串”这个函数将它们连接起来,然后接到循环结构中的移位寄存器中进行保存,当移位寄存器中的数据量达到一定时或1 R: _7 b, f) t: t* c$ / K, y5 - i) q满足数据处理的条件时,才停止这个循环输出读取到的数据。一般如下图所示:% |: |8 y/ j) z1 _1 : W% q! n5 5 Bl; 5 * E2 Y; q图 5 被动接收类型中的数据接收4 ! n% 6 # % Q 在接收下位机发送的帧数据时,一定要先了解帧格式,这样才能正确解析出帧里面的数据来。* U1 O/ n) d, B8 o! T. A) _1 o7 7 F1 a, Z4 n 下面以例子来说明数据帧格式的通信。2 + ; Z1 m% E. p3 K. O; K- r7 s& / A! U 设定通信数据帧每7个字节为一帧数据,其中以0xAC、0x96二个字节作为数据帧头,第三、四个帧头为帧计数器,最大值为0xFFFF,到& ; * g; x5 w# O) k0 k3 |6 |, s+ ( : K+ U9 u: F达最大值后重新从0开始计数,第4、5、6三个字节是数据信息,分别代表数据的高中低位,第7位为状态标志字节,它的第一位为1时表示下: I a4 C5 v+ h4 q) j$ ED8 O& Z. r# L- S: 2 8 e. l; o位机出错,为0时表示功能正常。9 j5 g* i. T& K4 s6 |4 T3 I W b0 L+ c 由于LabVIEW中接收到的数据都是以字符串的形式显示出来的,所以需要将字符串转换为ASCII码,一般可以直接使用“转换为U8数6 f2 l# & A) # v0 j. z% t4 E. M6 E+ T( k. 3 u0 P$ h) CO3 组”这个函数,如下图所示:: W- X; T# X0 ?. a$ o) c# d& f w+ q j. v4 L: I+ O2 S- G$ L图 5 字符串转换为U8字节$ y1 c1 8 B1 u转换为U8字节后,得到的是所传输字符的ASCII码,我们就很容易进行数据帧的判断了,现收到以下的字符串数据: I& E! v+ j5 U. tL r6 z) p8 y8 c4 & e. T0 U1 H F2 e+ Z图 6 实际接收到的字符串8 x1 u$ T/ K8 I$ K. x* U$ c 上图中下半部分显示的数组是使用“字符串转换为U8数组”的函数转换之后得到的数组,一个是十六进制显示,另一个为十进制显示。- Y! T$ |# K: J, O( P( k1 G5 C+ ?4 _1 ?对照定义的数据帧格式,就很容易得到我们需要的数据了。* a) q+ o! G1 N. i# Y2 N0 L; B- 首先是要看从哪里开始才是完整的第一帧,从上面十六进制显示的数组中我们可以看到,并不是第一个字节就是我们需要的帧头,因为下2 T) l0 Y5 ( v; |( A- h9 |% g6 O9 B* m5 m. |$ b5 n位机是一直处于发送数据的状态,很可能在串口发送一帧数据的过程中串口就被初始化或者被清空了一次缓冲区,那么这一帧数据的前面部分* % v1 K3 I3 d; 3 o/ n/ Y. l# E1 i; 4 j l) 数据可能就会丢失,只留下后面一部分数据,以上图为例子,第一二个字节为0x32、0x22,显示不是我们要的帧头,我们要的帧头是在第* s4 * J. n1 ?) z) s7 o: U% A- H; P8 K6、7个字节,以程序来实现的话就是先查找第一个帧头,使用“搜索字符串”,如果找到则判断它下一个字节是否是第二个帧头,如果是,7 A/ / k. R8 f$ f U2 s4 Y7 - Z- 表明已经找到帧头,输出帧头的位置;如果它下一个字节不是第二个帧头,说明这里不是真正的帧头,继续查找下一个帧头,直到找到帧头或- q( i3 b* V5 r1 E5 r9 $ s% |) S: w7 . T2 u搜索完整个字符串都找不到帧头。这是一个程序的算法问题,具体实现的程序如下图所示:# r7 n: D$ L3 $ o9 J* X. t. W# d+ 9 1 S2 I a/ m6 3 & E4 d1 # 9 a?( i! j图 7 帧头查找程序9 e8 a1 8 D1 U% R# % a, k# + 帧头查找到以后,再找数据就容易了,根据之前的定义,第4、5、6个字节是才是我们要的数据,所以直接使用索引号进行索引输出即可。$ R; q( x5 l+ g+ s) w6 M6 k# J! B) v& u. y1 I) A4 D6 C: D7 J% X 图 8 获取实际数据+ ( Z+ G& e9 % ; Y 一般情况下,如果是用三个字节表示一个数据的话,那么这三个字节分别表示为一个数据的高中低字节,即高字节要乘以25536再加上中+ v+ vf1 v w) W p7 g$ s) U7 ?% # Y, z. 字节乘以256再加上低字节的,这样定义后可表示的数据的范围就会扩大很多,但这里为了说明问题,直接认为三个字节的数据相加就是我们6 4 x( F/ a; L! 1 W; 7 Y( y8 L# m要的实际数据,在实际使用过程中应该根据帧格式的字义来解析这个数据。/ , 3 ?3 g/ X+ E+ |- R$ E8 Xi2 n 另外帧格式中定义了最后一个字节为状态标志位,所以提取数据前还要检查一下这个标志位是否正常,不正常时要进行相应的处理,这里. v0 , X% J; d3 : B, q: l1 # u9 ?! K# W. F: _不再详细描述。& 5 b# y1 ?- r; Z( C_3 b) C! a6 x! N 至此完成一次数据帧的提取。$ m4 c, Q( $ _ l3 M m8 3 D4 L4 3 _# 3 A# S& S) i 如果是没什么特殊的要求的话,这里应该也算到一段落了,有一些对测试时间有要求的地方,就会要求在最短的时间内得到最多的信息, S* T1 Q/ D6 O8 4 B p! r) K: I2 W& y) q6 j X% E0 Z4 从图6中我们可以看到,接收到的数据帧中,除了中间一个完整的帧之外,头尾还有一些无用的数据,其实这些数据中也包含了有用的信息1 s) , E e2 k0 m, A5 Y: T7 P6 s8 q2 H0 2 m的,比如我们可以从0xAC、0x96这二个帧的位置中推断中它前面的0x22、0x2A、0x38这三个字节也是我们想要的数据字节,但是由于没, h- g: k. _- g) X+ V3 k( O% j U0 e- p+ U有接收到它的帧头,所以程序没能提取出来,但我们可以从后一帧的帧头推算出前面那一帧的数据字节是哪些,即使没收到前面那一帧的帧- a9 V1 o ?0 v1 k O, b1 Y: b ( n( a* D2 6 h; D头。这里只给出一个流程,不再给出具体的程序。N/ O( R i2 k+ b* P r- I# o0 I. h+ ( l/ a# NC 另外有可能接收的数据长度比较长,可能就不止包含了一帧的数据在里面,所以在程序中也要判断一下剩下的数据还够不够一帧的数据长6 h2 n) J8 4 k% r/ E Y7 x; l% l6 ?度,如果够则可以根据上一次查找的帧头位置+数据帧长度来确定下一个数据帧的帧头位置了,不需要使用搜索的方法。也可能存在处理完一5 d& w% m# k7 b$ p& N% Q$ * U& M$ u4 k/ ; o+ E( Y; P8 T帧数据后,剩下的数据不够一个帧的,这时可以将这些剩下的数据保留起来,将它添加到下一次接收到的数据前面,组成新的数据再进行处8 M2 I G e D& m6 P6 N4 T0 X1 m; Vd% W0 a- X% v F理。去掉已经处理的数据可以使用“删除数组元素”这个函数来实现。这里也不再给出具体的程序。* _ d4 A/ n9 k Ru+ ?% J* m# ) 2 c- P; C; R/ v c8 + a* c6,串口数据类型的转换! T4 r9 A# q& I5 i+ 7 I! qL) J) O 由于LabVIEW中VISA Read/Write这二个函数都是只能读取/写入字符串类型的数据的,而有时候需要接收/写入的数据类型不一定是字$ C6 6 . w$ x& q! W+ S5 0 G; Q5 G5 h- ! d/ Q $ 6 符串,导致在刚开始接触的时候会有一点困惑。! N8 H0 V) u n0 e; R! pe5 V7 Q7 - & k8 R 在进行数据转换时,只要记住计算机中所有数据都是以二进制保存这个原则就容易解决问题了。串口线上传输的也是高低,串口接收到的# ?: q _1 O7 A7 j1 L! : h7 D2 V p; j$ S7 mM0 Z也是二进制数据,只是到LabVIEW后被转换为字符串格式了。还是以例子进行解释。6 A) L! gC5 O8 y# a$ P2 h( , l- h 假设LabVIEW从串口接收到的数据为“1234”(正常显示模式下),那么这个数据在串口底层的时候其实是这样的二进制数据:7 K/ . y6 u2 w. M6 + H( v* K W$ H& | 0011000100110010 00110011 001101004 m6 p2 i) I$ v+ G% l. l- zR l. , S 只是在LabVIEW中,这些二进制数据是以字符串形式显示出来的,它们的实质还是二进制数据,这几个二进制数据转换为十进制数据分# j( k$ t7 S: y7 D% . F0 _7 ) 别是“49,50,51,52”,由于字符串都是以ASCII码形式保存在计算机中的,那么49,50,51,52这几个数在ASCII表中就表示是字符 l# Y. S7 S# m$ Q; / x) Z1 p1 P$ e串“1,2,3,4”。所以这几个数据在LabVIEW中就显示为字符串的1,2,3,4了。+ v& G4 x- X6 T) q* T. 2 q* f?, ?4 b5 g+ h7 - K 如果明白这里面的转换关系,那么要进行数据转换时就很容易了,比如上面的例子中,如果LabVIEW中接收到的是字符串“1234”,而) 4 R; d. l: X% i- w1 d- O2 p, f, D- V- 1 o2 l& C, ? X原本下位机传送的是数值型数据,只需要将“1234”字符串转换为对应的ASCII值就是实际上下位机传上来的数据了,就是“49,50,51,* F0 + # Z2 ( e2 M4 |; P! o! x6 a- R; 52”。LabVIEW中将字符串转换为对应的ASCII值的函数是“字符串至字节数组转换”这个函数:1 V9 x3 A5 G* i6 C6 m* y I, / E# R( G. J$ d5 |( _# CA+ n& X: g2 P$ R1 I( y% h& E/ _ 图 9 字符串转换为字节数组 R3 F3 US/ l! 2 k# w+ b, VE& D 上面说的是下位机发送的是数值类型的数据的,使用“字符串至字节数组转换”这个函数,如果是下位面发送的是字符串类型的数据,那N6 # x# x# T $ s8 D! C: A: F: d7 U+ X& j+ t么LabVIEW已经直接转换好了。7 f+ X3 9 E8 s4 M. x5 J, z/ z$ i% h |! G 还有一个问题是使用LabVIEW发送数据的问题,如果下位机接收的是字符串数据类型的话,直接用VISA写入对应的字符串就行了,现在( ) M. T! X, E7 n& D- ( d) Y3 # j8 B: n的仪器一般都是接收字符串的,所以可以直接使用VISA发送而不需要转换。 R. i8 l( U$ j! ak% - Q, Z0 C: p4 S0 k如果下位机接收的是数值型数据的话,就需要转换一下,其中数值型又是十进制和十六进制二种用得比较多,这二种数据间相互转换一下. * y1 O. 2 * F( b, v2 S/ K4 C8 s就行了,其实是一样的。; 4 c e! M/ S9 L L% A 4 s, F( A) |$ ) W8 A! z 由于在LabVIEW中字符串直接有十六进制的显示方式,所以发送十六进制的数据比较方便,比如要发送十六进制数值类型的“0xAF”,8 8 v: g* W: & L! d2 Y0 E: R, M& z1 5 k7 Yv3 t/ M那么在VISA Write的写入缓冲区字符串常量上右键十六进制显示,如图1,直接输入“AF”即可,那么下位机接收到的就是正确的数据s: g7 G! b ? mC. O5 G% j R a2 y6 |+ l% B(十六进制数值类型)了。但实际使用过程中,一般都是需要将某个子VI输出一个动态的字符串通过VISA Write发送到下位机的,这时候就# c6 b4 P2 x1 w& G2 v+ ?% V6 O) / r; y需要对数据进行转换一下,这个转换过程描述起来就是:将字符串

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论