LabVIEW串口通信解析 本文关键词:串口,解析,通信,LabVIEW
LabVIEW串口通信解析 本文简介:LabVIEW串口通信详解0@(m.I,a8oQ7H0X!x“r)~(o0R4W+Y8`串口可以说是我们最容易见到,也最容易接触到的一种总线,台式机上一般都有二个,而现在很多下位机、仪器等很多都还是使用串口通2|%t,S0`9Z+U;B5}%n“B4M-}@-I%V;I3R(W串口的朋友建议先看一下
LabVIEW串口通信解析 本文内容:
LabVIEW串口通信详解
0
@(
m.
I,a8
o
Q7
H0
X
!
x“r)
~(
o0
R4
W+
Y8
`
串口可以说是我们最容易见到,也最容易接触到的一种总线,台式机上一般都有二个,而现在很多下位机、仪器等很多都还是使用串口通2
|%
t,S0
`9
Z+
U;
B5
}%
n“B
4
M-
}
@-
I%
V;
I3
R(
W
串口的朋友建议先看一下上一个贴子先。上一个贴子中提到过的内容这里不再进行补充。+
D;
W6
I.
g
t2
e0
C!
Z
v/
h
b!
o4
Q
(
u0
r0
}-
F
L(
s“?0
K7
R7
@)
s,g
j,f)
`#
x
1,串口扩展的问题
“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;
b
1
?*
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
B(
p%
O
$
k
N
J4
B4
p:
m
g
在使用串口之前,最好先确认一下串口是否正常,特别是使用转换接或扩展卡的。检查的方法很简单,就是将串口的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
~
y7
I#
X0
U-
J!
l,A
收的数据就是发送的数据。稍微要注意一下的是有些电脑的COM1和COM2的位置是反过来的,所以要确定好串口调试助手左上角的串口上选4
a1
q
F,t:
w;
~)
i#
|
?
/
M8
?4
v3,串口线的检查2
n!
h,P“{7
W9
H5
Z
7
|6
v$
R#
]9
D!
N!
D7
h
检查好串口后,一般也要注意一下使用的串口线,标准的串口线是9根线都是用上的,但有一些是只使用了三根线的:2、3、5。第3个脚
-
~/
N3
b;
}-
D2
n-
e2
S#
Q#
B8
R
m.
z$
A/
k
x
管是发送,第2个管脚接收,另一个5是地线,这里叫它简化的串口线,简化的串口线能用上的地方,标准的串口线也肯定能用上,因为标准
!
G!
q“n!
a%
O%
?%
f-
G.
b
6
T6
j6
b
H#
y7
o线的9根线已经包括了简化串口线中的3根线,但标准串口线能用上的地方,简化串口线就不一定能用上,所以在使用串口线之间一定要确定
8
e3
F-
x2
l4
E1
O
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
A.
D0
T!
a1
C:
L4
p/
K
)
L
p
e9
p7
Z+
R8
x;
@
`
x
1
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
G
q:
C8
F7
o%
p0
b
在LabVIEW中使用串口时,有几个参数比较重要,需要先说明一下的。
:
v)
q3
z
~8
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
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*
V
5
|8
d$
p5
K“~
经到了所有数据的未端了,从而停止接收,不管后面还有没有数据。终止符是10,表示在接收数据时,遇到ASCII码为10的字符(即换行7
|8
j;
D*
U5
x0
O
g!
v
D
t6
d%
o2
S!
f5
L6
l符)时就停止接收数据。
`3
t
x%
J%
U)
].
F*
Z2
m3
`
%
h
s,@(
I*
{/
l1
A
f+
f8
i8
r
可以做一个很简单的试验,先短接串口2、3脚,然后将终止符设置为“0x33”,0x33是字符“3”的ASCII码,然后发送字符串
0
?*
q-
A7
l*
u-
R1
e
R3
N7
N1
l;
z1
c
“123456”,可以看到接收回来的数据中只有“12”,即“3”被认为是字符串的未端了,它后面的数据就不再接收了。很多朋友就是因为
%
d0
R#
t7
~)
m1
S7
x
P:
r9
n1
uterminator?)”这一端输入为False即可。
%
A7
F7
u/
a)
P6
u-
|$
}*
E
L“j
p+
w:
@
C.
]*
V100个数据的话,程序就会报“Time
out”的错误,如果超时时间设置得太长,有可能导致程序很长时间停止在VISA
READ这个节点上。解3
q5
T;
/*
K/
A9
}%
X
A
2
I)
J0
s/
G:
p5
V“y#
c-
f)
f4
j*
H决的办法是使用“Bytes
at
Port”这个串口的属性节点,在VISA>>Serial>>advance下,也可以在VISA资源线上右键>>创建>>属性+
v9
~/
G2
e8
r$
e(
`#
a
“{:
l)
~0
?0
X7
U.
o0
F
W1
J9
[
节点>>串口设置>>Bytes
at
Port,如下图:2
B-
|%
m6
G
c4
D1
w%
y,H
X
)
C1
j+
^8
{%
s8
j
Q
+
]9
w
C9
x%
_-
C-
m6
?
-
K
L-
^
E!
j6
g
!
x,p;
X%
l/
@5
h
图
3
Bytes
at
Port
6
e
J1
T
:
n“w8
D.
v1
^:
r
U-
]多少个字节就读回多少个,不会有任何等待。
;
j7
}
c1
}.
O9
E2
V
W.
@
H.
i.
F8
R6
v
7
p
g:
P,v
M0
n,u0
E+
x-
J“l$
@
图
4
使用Bytes
at
Port
1
}-
B9
y8
C5
c#
/.
^
]:
N
X.
|
I
?4
n#
h/
u#
z*
[
#
`
C%
v“v2
t
二种类型的串口通信在处理上会不太一样。
“C)
_(
V6
|6
r#
[6
?6
y6
Z;
w;
e,k$
[+
J:
B
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
q
3
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
Y“v2
l$
p/
Y
T)
g/
T(
h(
`7
w:
j
u!
W
5.2被动接收类型
0
n6
`
d)
|9
P7
G7
_*
?,p#
Y
9
`)
H0
H)
j,F!
o.
I5
C
被动接收形的串口通信稍微麻烦一点,由于上位机是被动接收的,上位机不知道什么时候开始下位机就已经有数据上来了,很有可能下
-
?:
N
x7
G
i0
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
校验方式由用户定义,非常灵活。
@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
{*
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$
E
D8
O
o
位机出错,为0时表示功能正常。
9
j5
g*
i.
T
T#
X0
?.
a$
o)
c#
d
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
K
6、7个字节,以程序来实现的话就是先查找第一个帧头,使用“搜索字符串”,如果找到则判断它下一个字节是否是第二个帧头,如果是,7
A/
}/
k.
R8
f
{$
f
U
2
s4
Y7
]-
Z-
^表明已经找到帧头,输出帧头的位置;如果它下一个字节不是第二个帧头,说明这里不是真正的帧头,继续查找下一个帧头,直到找到帧头或
~-
q(
i3
b*
V
5
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
`
q(
x5
l+
g+
s)
w6
M
6
k#
J!
B)
v
Y
一般情况下,如果是用三个字节表示一个数据的话,那么这三个字节分别表示为一个数据的高中低字节,即高字节要乘以25536再加上中
+
v+
v
f1
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
X
i2
n
另外帧格式中定义了最后一个字节为状态标志位,所以提取数据前还要检查一下这个标志位是否正常,不正常时要进行相应的处理,这里.
v0
~,X%
J;
d3
]:
B,q:
l
1
}#
u9
?!
K#
W.
F
^:
_不再详细描述。
Z(
C
_3
b)
C!
a6
x!
N
至此完成一次数据帧的提取。$
m4
c,Q(
{$
_
l3
M
“m8
@3
D4
L4
{3
_#
]3
A#
S
D
头。这里只给出一个流程,不再给出具体的程序。
N/
O(
R
i2
k+
b*
P“r
-
I#
o0
I.
h+
[(
l/
a#
N
C
另外有可能接收的数据长度比较长,可能就不止包含了一帧的数据在里面,所以在程序中也要判断一下剩下的数据还够不够一帧的数据长
6
h2
/
n)
J8
~4
k%
r/
E
Y7
x;
l%
l6
?
度,如果够则可以根据上一次查找的帧头位置+数据帧长度来确定下一个数据帧的帧头位置了,不需要使用搜索的方法。也可能存在处理完一5
d
o+
E(
Y;
P8
T
帧数据后,剩下的数据不够一个帧的,这时可以将这些剩下的数据保留起来,将它添加到下一次接收到的数据前面,组成新的数据再进行处8
M2
I
G“e“D
V
d%
W0
a-
X%
v
F
理。去掉已经处理的数据可以使用“删除数组元素”这个函数来实现。这里也不再给出具体的程序。
_
d4
A/
n9
k“R
u+
?%
J*
m#
^)
}2
c-
P;
C;
R
/
v
c8
]+
a*
c6,串口数据类型的转换
!
T4
r9
A#
q
Q5
G5
h-
`!
d/
Q“[$
`6
}
符串,导致在刚开始接触的时候会有一点困惑。
!
N8
H0
V)
u
n0
e;
R!
p
e5
V7
Q7
^-
`
j$
S7
m
M0
Z也是二进制数据,只是到LabVIEW后被转换为字符串格式了。还是以例子进行解释。
6
A)
L!
g
C5
O8
y
#
a$
P2
h(
/,l-
h
假设LabVIEW从串口接收到的数据为“1234”(正常显示模式下),那么这个数据在串口底层的时候其实是这样的二进制数据:
7
K/
[.
y6
u2
w.
M
6
`+
H(
v*
K
W$
H
}/
x)
Z1
p1
P$
e
串“1,2,3,4”。所以这几个数据在LabVIEW中就显示为字符串的1,2,3,4了。+
v
d.
l:
X%
i-
w1
d-
O
2
p,f,D-
V-
]1
o2
l
P
!
o!
x6
a-
R;
}52”。LabVIEW中将字符串转换为对应的ASCII值的函数是“字符串至字节数组转换”这个函数:1
V9
x3
A5
G*
i6
C
6
m*
y
I,{
]/
E#
R(
G.
J$
d5
|(
_#
C
A+
n
]4
c
e!
M/
S9
L“L%
A“~
4
s,F(
A)
|$
})
W8
A!
z
由于在LabVIEW中字符串直接有十六进制的显示方式,所以发送十六进制的数据比较方便,比如要发送十六进制数值类型的“0xAF”,
8
/8
v:
g*
W:
{
y
需要对数据进行转换一下,这个转换过程描述起来就是:将字符串A转换为字符串B,使得正常显示的字符串A跟十六进制显示的字符串B是一-
}+
D.
u/
D
h(
y(
x:
D
d)
|8
J9
F,B5
~,^0
L)
b8
a这个转换过程首先将字符串转换为十六进制数值型,然后再通过将这个十六进制数值创建为一个数组,最后再使用“字节数组至字符串转
;
N-
T
o
k
4
Q5
t(
j8
^3
I6
?“j0
_2
`5
C2
H
图
10
正常显示字符串转换为相同的十六进制显示的字符串
4
J:
U,k
I!
h#
`2
w+
B5
o
需要注意一下的是如果正常显示的字符串并不是2的整数倍,那么上图的转换程序就会少转换一个字符,可以用程序动态判断一下这个字符*
R5
s,l-
H*
Z-
V.
Y(
m
$
M/
d+
w.
R4
L串的长度,如果是奇数的话在它最左边补一个“0”再使用上面的程序就正常了。
:
l
u
G*
y9
t$
Q-
{
}串口问题汇总:
w4
G4
~+
l$
B
1
O!
_-
L!
B%
[.
]6
z1,串口资源被占用。-
r*
K9
_-
A6
B(
V
t!
/
——这时候在LabVIEW会报错,提示串口号存在,但当前不能对其进行操作,同时打开MAX时也可以在对应的串口号下看到同样的错误,这表示这个串口已经被其它程序占用了,比如有时候打开了串口调试助手来调试串口,然后又想在LabVIEW里面试一下,这时就会报这个错,因为串口已经被串口调试助手调用了,
它不能被二个程序同时使用,解决的方法是关掉其它程序即可,串口调试助手里也可以关闭这个串口。还有一种情况是调试OK后生成EXE,运行EXE也出现这个问题,这时是因为串口被原来的LabVIEW程序打开,再用EXE打开时就会报错,解决办法是关掉原来的LabVIEW程序。最好是关掉LabVIEW.
!
?+
a“w4
Q/
{在使用串口的过程中一定要关闭串口(使用VISA
CLOSE),否则程序在退出的时候会报错说数据丢失。
7
x,],K
~!
[