非常好LabVIEW串口通信详解

上传人:z****2 文档编号:170987888 上传时间:2022-11-23 格式:DOCX 页数:13 大小:86.86KB
返回 下载 相关 举报
非常好LabVIEW串口通信详解_第1页
第1页 / 共13页
非常好LabVIEW串口通信详解_第2页
第2页 / 共13页
非常好LabVIEW串口通信详解_第3页
第3页 / 共13页
点击查看更多>>
资源描述
LabVIEW 串口通信详解串口可以说是我们最容易见到,也最容易接触到的一种总线,台式机上 一般都有二个,而现在很多下位机、仪器等很多都还是使用串口通信的。论 坛上很多朋友都经常会使用到串口,并遇到一些问题,这里有必要做一个详 细的说明,以方便广大会员朋友,文章请勿转载到其它地方,谢谢。论坛上早先发布过一个贴子,叫串口 WORD资料里面有一些中英文 的串口的资料,这个文章是对那个资料的补充,如果是初接触串口的朋友建 议先看一下上一个贴子先。上一个贴子中提到过的内容这里不再进行补充。首先补充一个比较重要的问题,就是在LabVIEW中使用串口的话一定要 先安装VISA这个驱动,然后生成的EXE运行时也需要在目标机上安装VISA Run time Engine,可以在打包时一起打包。VISA的驱动可以在NI网站上下载到:1. 串口扩展的问题:先说一下串口的扩展问题,一般的台式机或工控机上都至少有二个串口, 一般都是够用的,但是现在市场上已经很难找到带串口的笔记本了,而有时 候在外出调试时需要在笔记本中使用到串口的,这时一般是使用 USB-RS232 的转接线,价格从十几到一百多都有,很多朋友反应在使用价格低的转接线 时会出现乱七八糟的问题,而贵一点的线就很少听说有其它问题的,所以大 家在使用便宜的USB-RS232转接线时要特别注意线的质量,遇到一些奇怪的 问题时先考虑换一根好一点的线。PCI-RS232扩展卡也同理,便宜的卡也容 易出问题,尽量买好一点的,以免因小失大。PCI-RS232 一般至少能扩展2 个串口,有些BT 点的可以扩展到8-16个,一堆线和接头。转接线和扩展 卡一般是要装驱动的。2. 串口功能的确认:在使用串口之前,最好先确认一下串口是否正常,特别是使用转换接或 扩展卡的。检查的方法很简单,就是将串口的2、3脚短接起来,3脚是发送 数据,2 脚接收数据,就是这个串口自发自收。电脑上的串口软件一般是用 串口调试助手,很出名的,也好用。如下图所示: 图1 串口调试助手打开软件,选择已经短接好的串口号,点击“手动发送”,如果串口是 好的,2、3脚又短接起来了,马上就可以在上面的接收框里看到接 收的数 据就是发送的数据。稍微要注意一下的是有些电脑的C0M1和COM2的位置是 反过来的,所以要确定好串口调试助手左上角的串口上择的是已经短接的那 一个,如果COM1没接收到,可以再先COM2再发一次看一下。3. 串口线的检查:检查好串口后,一般也要注意一下使用的串口线,标准的串口线是9根 线都是用上的,但有一些是只使用了三根线的:2、3、5。第3个脚管是发送, 第2个管脚接收,另一个5是地线,这里叫它简化的串口线,简化的串口线 能用上的地方,标准的串口线也肯定能用上,因为标准线的9根线已经包括 了简化串口线中的3根线,但标准串口线能用上的地方,简化串口线就不一 定能用上,所以在使用串口线之间一定要确定好串口线的类型,一般买的串 口线都是标准线,但自制的串口线因为应用场合不同就要先确定一下。G串口线还有一个地方需要注意一下的,就是2、3脚的接法,标准接法 中是2、3脚交叉的,即这边的2接另一边的3,这边的3接另一边的2,扭 了一下,所以叫交叉线,因为正常使用时,这边第二脚是发送数据,另一边 第三脚是接收数据,所以要将这二个管脚连接起来,这样才能正常使用。但 是有些情况下,2、3是直连的,即这边的第2脚连接另一边的第2脚,第3 脚连接第3脚,这种叫直连线,这种线一般是用于延长串口的,比如需要将 工控机的串口接头引到机柜表面上时,就使用这种线,这样机柜表面的串口线的定义还是跟电脑接出来的一样,外面的那一根串口线再使用交叉线。从 电脑主板上将串口引到主机后面板上的线就是这样的直连线。购买串口线的 时候一般也会问你买直连的还是交叉的,要区别对待。串口线还有一个要稍微注意一下的就是DB头,因为电脑上接出来的一般 是公头(针)要跟电脑接的话要母头(孔)一般仪器的串口也是公头,所 以二边都是母头的串口线比较常见。串口的接头一般是DB9的,也有DB25 的,但比较少用,有些比较BT的仪器厂家居然用RJ11 (水晶头那种)作为 串口头,让人不爽!总之,使用串口前一定要先确定好硬件没问题,不然很浪费时间的。4串口参数设置:在LabVIEW中使用串口时,有几个参数比较重要,需要先说明一下的。 一个是串口初始化这个节点的“终止符”和“禁用终止符? ”这二个输入 端,这二个输入端是相互作用的,“终止符”默认值为10,它的十六进制是 “OxOA”,这是一个ASCII码,是一个换行符,可以从LabVIEW中的字符串 的不同显示形式看出来,如下图:fformal Di Ejiliy Hei Hi spl tiy Co des H i splay|卽|丄|Enable TerminitionChar IrinHO图2串口消息终止符十八;七制再SERIAL左边是字符串的正常显示,中间是十六进制显示,右边是“代码显示”,这三个字符串的值都是一样的。终止符是10,表示在接收数据时,遇到ASCII 码为10的字符(即换行符)时就停止接收数据,后面会有例子进行说明。而“禁用终止符? ”的默认值是FALSE,即启用终止符,启用终止符会有什么效果呢?终止符的意思就是当程序接收到这个字符时,就认为已经到 了所有数据的未端了,从而停止接收,不管后面还有没有数据。终止符是10, 表示在接收数据时,遇到ASCII码为10的字符(即换行符)时就停止接收数 据。可以做一个很简单的试验,先短接串口 2、3 脚,然后将终止符设置为 “0x33”,0x33是字符“3”的ASCII码,然后发送字符串可以看到接收回 来的数据中只有“12”,即“3”被认为是字符串的未端了,它后面的数据就 不再接收了。很多朋友就是因为这里设置错误,导致接收数据时有时候只收 到一半就没有了,特别是在连续接收数据时,但又不是每次都只能收到一半, 有时候也能接收齐全的,就是因为发送的数据中可能包含了终止符而使串口 认为到了最后一个字符了。一般是将这个终止符禁用掉,即将“启用终止符? (Enable terminator?) ” 这一端输入为 False 即可。另外还有一个比较重要的设置,就是VISA READ的“读取字节数”这个 输入,由于在串口通信中,如果指定读取100个串口缓冲区的字节数,如果 当前缓冲区的数据量不足100个时,程序会一直停在VISA READ这个节点上, 如果在超时的时间(默认是10秒)内还没有凑足100个数据的话,程序就会 报“Time out”的错误,如果超时时间设置得太长,有可能导致程序很长时 间停止在VISA READ这个节点上。解决的办法是使用“Bytes at Port”这个 串口的属性节点,在VISASerialadvance下,也可以在VISA资源线上右 键创建属性节点串口设置By tes at Por t,如下图:KBVisible Iteri5XelpEkSeEdriptidn uid Tip.ntSeri el r alEti eVI開 Pale! LtCresteCunst antCon.tr q!Lndi c7.XTBytwz a.L PQtrt3 barch. I卜 PrOCTMTFlilli Ifldas-ur ahmiL I/O IltEtriJlbDl I/D2 nriSelect Type Keliik To Sot H Sub71 Hodc Setup .Call Setup .Jiiid KEL Inzt imcQEptn. frontpen. roljnoirThic VI Shorr VI Hi erarchyJ Viiii k-i. Ico口Trpflrti xFroperty for Lnstr 匚lassII*: iha il far Lasir Cla.32tw 让.ConfLcnre.:Gai u* 41 SettingsInterf-ace Inforiii-a.I.LcaLVer 5: on Inforin-a-l icnGnnral ScttinEIIIqeSittings ( RegLster Eueii 5亡ttin口 p GFIB StiIIFH/FCr rrr/iF 弘tiin沪U5I Stt图 3 Bytesat Port这个属性节点读取当前串口缓冲区有字节数,然后将它的输出连接到VISA READ的“读取字节数”这个输入端上即可,这样当前缓冲区中有多少个字节就读回多少个,不会有任何等待。图 4 使用 Bytes at Port5.在LabVIEW中使用串口目前串口的应用一般有二种类型的(以我接触到的来分类,不严格),种是仪器控制类型的,般是上位机发送一个指令,然后下位机作出响应,返回数据给上位机,上位机再读取出来,完成一次通信,即一问一答;另一类是被动接收形的,即下位机会一直发送数据上来。这二种类型的串口通信在处理上会不太一样。5.1仪器控制类型由于在仪器控制时一般都是这种一问一答的方式,所以叫它仪器控制类型。以仪器控制为例来说一下需要注意的事项。首先是要确认仪器选择的通信模式是串口通信模式。现在的仪器一般都 至少有二种通信模式,一种是RS232, 种是GPIB,如果仪器是设置为GPIB 通信的话,RS232是不可能通信上的,所以要先确认一下,方法一般是在仪 器面板上选择设置远程控制GPIB/RS232,各个仪器稍微不同,可以查仪 器手册看一下。然后就是确认串口的通信参数的配置,包括波特率、数据长度、校验方 法等,有些仪器的某些参数是固定的,比如校验方法固定为奇校验,不能修 改,只能在电脑上跟仪器设置为一样的。波特率一般是可以修改的。这些参 数的配置一定要根据仪器手册上的来设置。如果参数设置不正确,也能收到 一些数据,但一般是乱码,如果收到的数据都是乱码的话,就要先检查一下 串口参数设置是否正确了。只有电脑和仪器边的串口参数完全一致时才能收 到正确的数据。接着是要注意发送指令和读回数据之间要有一定的延时,即VISA WRITE 和VISA READ之间要有一定的延时,一般200毫秒即可,因为串口是底层硬 件,数据从软件到串口上要一点点时间,然后仪器对指令作出响应也要一点 点时间,这些时间加起来肯定比软件运行二个节点的时间要短,所以延时是 一定要加的。在调试时如果发现正常运行时不能收到数据,但高亮运行就能 收到数据,就很有可能是没有加延时的原因!或者是发一个查询指令,但返回的是上一条查询指令的结果,也可能是 因为没有延时或延时不够。5.2被动接收类型被动接收形的串口通信稍微麻烦一点,由于上位机是被动接收的,上位 机不知道什么时候开始下位机就已经有数据上来了,很有可能下位机发送到 一半时,上位机刚好开始接收数据,这时只能接收到后面一半的数据了,所 以对于这种通信,一般是采用数据帧的方式进行通信。这种数据帧的通信方式至少由三部分数据组成:帧头、数据、帧尾(如 果数据是固定长度的话,似乎帧尾也可以省掉)。帧头是为了告诉上位机:从这以后的数据就是有用的数据了,相当于约 定好的暗号,一般帧头至少会用二个以上字节,如果只用一个字节的话,万 一数据中的数据跟这个帧头一样了就会误以为这个数据是帧头从而导致解析 数据出错,帧尾的作用也差不多,告诉上位机从这之前的数据才是有用的数 据。但实际上一般的数据帧远不止这几个部分,还会加上一些校验字节、时 间信息、帧计数器之类的东东在上面。其中校验字节是为了检查数据在传输过程中有没有出错的,跟串口的校 验位要区分清楚,校验位也是检查数据传输时有没有出错的,但由底层硬件 来实现,校验方法由标准规定好,但有几种可以选择,只有一个位Bit,只 能是0或1)。校验字节是由软件层来实现的,至少有一个字节(Byte,有8个位),而 且校验方式由用户定义,非常灵活。由于被动方式中串口的缓冲区中一直会有数据在,为了保持数据的 连续性,在读取数据时跟第一种仪器控制类型不一样。而是采取将读取的所 有的串口数据都保存在移位寄存器中,在软件上处理完这些数据后再将它们 从移位寄存器中删除。由于VISA READ的输出是字符串,所以一般使用“连接字符串”这个函 数将它们连接起来,然后接到循环结构中的移位寄存器中进行保存,当移位 寄存器中的数据量达到一定时或满足数据处理的条件时,才停止这个循环输 出读取到的数据。一般如下图所示:图 5 被动接收类型中的数据接收在接收下位机发送的帧数据时,一定要先了解帧格式,这样才能正确解析出帧里面的数据来。下面以例子来说明数据帧格式的通信。设定通信数据帧每7个字节为一帧数据,其中以OxAC、0x96二个字节作 为数据帧头,第三、四个帧头为帧计数器,最大值为0xFFFF,到达最大值后 重新从0开始计数,第4、5、6三个字节是数据信息,分别代表数据的高中 低位,第7位为状态标志字节,它的第一位为1时表示下位机出错,为0时 表示功能正常。由于LabVIEW中接收到的数据都是以字符串的形式显示出来的,所以需 要将字符串转换为ASCII码,一般可以直接使用“转换为U8数组”这个函数, 如下图所示:图5字符串转换为U8字节转换为U8字节后,得到的是所传输字符的ASCII码,我们就很容易进行 数据帧的判断了,现收到以下的字符串数据:,图 6 实际接收到的字符串上图中下半部分显示的数组是使用“字符串转换为 U8 数组”的函数转 换之后得到的数组,一个是十六进制显示,另一个为十进制显示。对照定义 的数据帧格式,就很容易得到我们需要的数据了。首先是要看从哪里开始才是完整的第一帧,从上面十六进制显示的数组 中我们可以看到,并不是第一个字节就是我们需要的帧头,因为下位机是一 直处于发送数据的状态,很可能在串口发送一帧数据的过程中串口就被初始 化或者被清空了一次缓冲区,那么这一帧数据的前面部分数据可能就会丢失, 只留下后面一部分数据。以上图为例子,第一二个字节为0x32、0x22,显示不是我们要的帧头, 我们要的帧头是在第6、7个字节,以程序来实现的话就是先查找第一个帧头,使用“搜索字符串”,如果找到则判断它下一个字节是否是第二个帧头,如 果是,表明已经找到帧头,输出帧头的位置;如果它下一个字节不是第二个 帧头,说明这里不是真正的帧头,继续查找下一个帧头,直到找到帧头或搜 索完整个字符串都找不到帧头。这是一个程序的算法问题,具体实现的程序如下图所示:图7帧头查找程序帧头查找到以后,再找数据就容易了,根据之前的定义,第4、5、6个 字节是才是我们要的数据,所以直接使用索引号进行索引输出即可。us数蛆 帳头位骨+巨幻数据图8获取实际数据一般情况下,如果是用三个字节表示一个数据的话,那么这三个字节分 别表示为一个数据的高中低字节,即高字节要乘以25536再加上中字节乘以 256再加上低字节的,这样定义后可表示的数据的范围就会扩大很多,但这 里为了说明问题,直接认为三个字节的数据相加就是我们要的实际数据,在 实际使用过程中应该根据帧格式的字义来解析这个数据。另外帧格式中定义了最后一个字节为状态标志位,所以提取数据前还要 检查一下这个标志位是否正常,不正常时要进行相应的处理,这里不再详细 描述。至此完成一次数据帧的提取。如果是没什么特殊的要求的话,这里应该也算到一段落了,有一些对测 试时间有要求的地方,就会要求在最短的时间内得到最多的信息。图6中我 们可以看到,接收到的数据帧中,除了中间一个完整的帧之外,头尾还有一 些无用的数据,其实这些数据中也包含了有用的信息的!比如我们可以从OxAC、0x96这二个帧的位置中推断中它前面的0x22、0x2A、0x38这三个字节也是我们想要的数据字节,但是由于没有接收到它的 帧头,所以程序没能提取出来,但我们可以从后一帧的帧头推算出前面那一 帧的数据字节是哪些,即使没收到前面那一帧的帧这里只给出一个流程,不 再给出具体的程序。另外有可能接收的数据长度比较长,可能就不止包含了一帧的数据在里 面,所以在程序中也要判断一下剩下的数据还够不够一帧的数据长度,如果 够则可以根据上一次查找的帧头位置+数据帧长度来确定下一个数据帧的帧 头位置了,不需要使用搜索的方法。也可能存在处理完一帧数据后,剩下的 数据不够一个帧的,这时可以将这些剩下的数据保留起来,将它添加到下一 次接收到的数据前面,组成新的数据再进行处理。去掉已经处理的数据可以 使用“删除数组元素”这个函数来实现。这里也不再给出具体的程序。 6串口数据类型的转换由于LabVIEW中VISA Read/Write这二个函数都是只能读取/写入字符串 类型的数据的,而有时候需要接收/写入的数据类型不一定是字符串,导致在 刚开始接触的时候会有一点困惑。在进行数据转换时,只要记住计算机中所有数据都是以二进制保存这个 原则就容易解决问题了。串口线上传输的也是高低,串口接收到的也是二进 制数据,只是到LabVIEW后被转换为字符串格式了。还是以例子进行解释。 6.1 LabVIEW从串口接收数据假设LabVIEW从串口接收到的数据为“1234”(正常显示模式下),那 么这个数据在串口底层的时候其实是这样的二进制数 据:00110001 00110010 00110011 00110100只是在LabVIEW中,这些二进制数据是以字符串形式显示出来的,它们的实质还是二进制数据,这几个二进制数据转换为十进制数据分别是“49,50, 51, 52”,由于字符串都是以ASCII码形式保存在计算机中的,那么49,50, 51,52这几个数在ASCII表中就表示是字符串“1, 2,3,4”。所以这 几个数据在LabVIEW中就显示为字符串的1, 2, 3, 4 了。如果明白这里面的转换关系,那么要进行数据转换时就很容易了,比如 上面的例子中,如果LabVIEW中接收到的是字符串“1234”,而原本下位机 传送的是数值型数据,只需要将“1234”字符串转换为对应的ASCII值就是 实际上下位机传上来的数据了,就是“49, 50, 51,LabVIEW中将字符串转换为对应的ASCII值的函数是“字符串至字节数组转换”这个函数:3 L V3:Lr11 J ut Opar 7qd1 K V LndEn*TMTlL Swrer lc Cowers: anns7a fxtaidt. . To Dauhle . . Id Esnclt . . To f Liced.-?. . To Qub.d In.inHDTiiRiLroii In. . To Vord In . I Byte Lel . To IJnsLcne. . To Vnsi pie-.Tuasl& L輕iciLtdTi Font 亍 ,口 7(i ITtielgjxa. . To ITuEignM . Ta ExtalJa . To Voublw . . To SliijLa .Jlrrb -二tVirsK .图9字符串转换为字节数组上面说的是下位机发送的是数值类型的数据的,使用“字符串至字节数 组转换”这个函数.如果是下位面发送的是字符串类型的数据,那么LabVIEW已经直接转 换好了。个人总结:无论下位机发送的是何种类型的数据,LABVIE从串口接收的 时候,总是将每8位二进制数,作为字符的ASCII码解读。6.2使用LabVIEW发送数据还有一个问题是使用LabVIEW发送数据的问题 如果下位机接收的是字符串数据类型的话,直接用VISA写入对应的字 符串就行了,现在的仪器一般都是接收字符串的,所以可以直接使用 VISA 发送而不需要转换。 如果下位机接收的是数值型数据的话,就需要转换一下,其中数值型 又是十进制和十六进制二种用得比较多,这二种数据间相互转换一下就行了, 其实是一样的。由于在LabVIEW中字符串直接有十六进制的显示方式,所以发送十六进 制的数据比较方便,比如要发送十六进制数值类型的“OxAF”,那么在VISA Write 的写入缓冲区字符串常量上右键十六进制显示,如图 1,直接输入 “AF”即可,那么下位机接收到的就是正确的数据(十六进制数值类型)了。但实际使用过程中,一般都是需要将某个子VI输出一个动态的字符串通 过VISAWrite发送到下位机的,这时候就需要对数据进行转换一下,这个转 换过程描述起来就是:将字符串A转换为字符串B,使得正常显示的字符串A 跟十六进制显示的字符串B是一样的。由于转换目标(十六进制显示的字符串)的数据类型是十六进制,要想 十六进制显示的字符串跟正常显示的字符串一样,这个正常显示的字符串必 须都是十六进制的字符,即只能由0-9,A-F这十六个字母中的字母组合而成。 否则就没办法使二种显示方式的字符串一致了。这个转换过程首先将字符串转换为十六进制数值型,然后再通过将这个 十六进制数值创建为一个数组,最后再使用“字节数组至字符串转换”这个 函数转换为字符串即可,实际上就是图5字符串转换为U8字节的反向操作, 只不过是这个十六进制的值初始类型是十六进制,要先转换为数值类型。具 体程序如下图所示。图 10 正常显示字符串转换为相同的十六进制显示的字符串由于十六进制数据由二个字节构成,而字符只有一个字符,所以每二个 字符表示一个十六进制数据,如果字符多于二个的话要先进行截取,每二个 字符转换为一个十六进制数据。也可以用空格将正常显示的字符串每二个字 符用一个空格断开,然后先将这个字符串以空格为分隔符转换为一个字符串 数组,再转换为十六进制数值再转换为字符串。需要注意一下的是如果正常显示的字符串并不是2的整数倍,那么上图 的转换程序就会少转换一个字符,可以用程序动态判断一下这个字符串的长 度,如果是奇数的话在它最左边补一个“0”再使用上面的程序就正常了。 7.串口问题汇总: 7.1串口资源被占用:这时候在LabVIEW会报错,提示串口号存在,但当前不能对其进行操作, 同时打开MAX时也可以在对应的串口号下看到同样的错误,这表示这个串口 已经被其它程序占用了,比如有时候打开了串口调试助手来调试串口,然后 又想在LabVIEW里面试一下,这时就会报这个错,因为串口已经被串口调试 助手调用了, 它不能被二个程序同时使用。解决的方法是关掉其它程序即可,串口调试助手里也可以关闭这个串口。还有一种情况是调试0K后生成EXE,运行EXE也出现这个问题,这时是 因为串口被原来的LabVIEW程序打开,再用EXE打开时就会报错,解决办法 是关掉原来的LabVIEW程序。最好是关掉LabVIEW.在使用串口的过程中一定要关闭串口(使用VISA CLOSE),否则程序在 退出的时候会报错说数据丢失。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 建筑环境 > 建筑资料


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!