基于组态的pc机串口通信程序设计内容摘要:
据时有时候只收到一半就没有了,特别是在连续接收数据时,但又不是每次都只能收到一半,有时候也能接收齐全的,就是因为发送的 数据中可能包含了终止符而使串口认为到了最后一个字符了。 一般是将这个终止符禁用掉,即将 “ 启用终止符。 (Enable terminator?)” 这一端 输入为 False即可。 另外还有一个比较重要的设置,就是 VISA READ 的 “ 读取字节数 ” 这个输入,由于在串口通信中,如果指定读取 100个串口缓冲区的字节数,如果当前缓冲区的数据量不足 100个时,程序会一直停在 VISA READ 这个节点上,如果在超时的时间(默认是10秒)内还没有凑足 100个数据的话,程序就会报 “Time out” 的错误,如果超时时间设置得太长,有可 能导致程序很长时间停止在 VISA READ 这个节点上。 解决的办法是使用“Bytes at Port” 这个串口的属性节点,在 VISASerialadvance 下,也可以在 VISA资源线上右键 创建 属性节点 串口设置 Bytes at Port,如下图: 图 3 Bytes at Port 这个属性节点读取当前串口缓冲区有字节数,然后将它的输出连接到 VISA READ 的 “ 读取字节数 ” 这个输入端上即可,这样当前缓冲区中有多少个字节就读回多少个,不会有任何等待。 基于组态的 PC 机串口通信程序设计 11 图 4 使用 Bytes at Port LabVIEW 中使用串口 目前串口的应用一般有二种类型的(以我接触到的来分类,不严格),一种是仪器控制类型的,一般是上位机发送一个指令,然后下位机作出响应,返回数据给上位机,上位机再读取出来,完成一次通信,即一问一答;另一类是被动接收形的,即下位机会一直发送数据上来。 这二种类型的串口通信在处理上会不太一样。 仪器控制类型 由于在仪器控制时一般都是这种一问一答的方式,所以叫它仪器控制类型。 以仪器控制为例来说一下需要注意的事项。 首先是要确认仪器选择的通信模式是串口通信 模式。 现在的仪器一般都至少有二种通信模式,一种是 RS232,一种是 GPIB,如果仪器是设置为 GPIB通信的话, RS232是不可能通信上的,所以要先确认一下,方法一般是在仪器面板上选择设置 远程控制的某些参数是固定的,比如校验方法固定为奇校验,不能修改,只能在电脑上跟仪器设置为一样的。 波特率一般是可以修改的。 这些参数的配置一定要根据仪器手册上的来设置。 如果参数设置不正确,也能收到一些数据,但一般是乱码,如果收到的数据都是乱码的话,就要先检查一下串口参数设置是否正确了。 只有电脑和仪器边的串口参数完全一致时才能 收到正确的数据。 接着是要注意发送指令和读回数据之间要有一定的延时,即 VISA WRITE 和 VISA READ之间要有一定的延时,一般 200毫秒即可,因为串口是底层硬件,数据从软件到串口上要一点点时间,然后仪器对指令作出响应也要一点点时间,这些时间加起来肯定比软件运行二个节点的时间要短,所以延时是一定要加的。 在调试时如果发现正常运行时不能收到数据,但高亮运行就能收到数据,就很有可能是没有加延时的原因 ! 或者是发一个查询指令,但返回的是上一条查询指令的结果,也可能是因为没有延时或延时不够。 被动接受 类型 被动接收形的串口通信稍微麻烦一点,由于上位机是被动接收的,上位机不知道什么时候开始下位机就已经有数据上来了,很有可能下位机发送到一半时,上位机刚好开始接收数据,这时只能接收到后面一半的数据了,所以对于这种通信,一般是采用数据帧的方式进行基于组态的 PC 机串口通信程序设计 12 通信。 这种数据帧的通信方式至少由三部分数据组成:帧头、数据、帧尾(如果数据是固定长度的话,似乎帧尾也可以省掉)。 帧头是为了告诉上位机:从这以后的数据就是有用的数据了,相当于约定好的暗号,一般帧头至少会用二个以上字节,如果只用一个字节的话,万一数据中的数据跟这个帧头一样了就会误以为这个数据是帧头从而导致解析数据出错,帧尾的作用也差不多,告诉上位机从这之前的数据才是有用的数据。 但实际上一般的数据帧远不止这几个部分,还会加上一些校验字节、时间信息、帧计数器之类的东东在上面。 其中校验字节是为了检查数据在传输过程中有没有出错的,跟串口的校验位要区分清楚,校验位也是检查数据传输时有没有出错的,但由底层硬件来实现,校验方法由标准规定好,但有几种可以选择,只有一个位( Bit,只能是 0或 1)。 校验字节是由软件层来实现的,至少有一个字节( Byte,有 8个位),而且校验方式由用户定义, 非常灵活。 由于被动方式中串口的缓冲区中一直会有数据在,为了保持数据的连续性,在读取数据时跟第一种仪器控制类型不一样。 而是采取将读取的所有的串口数据都保存在移位寄存器中,在软件上处理完这些数据后再将它们从移位寄存器中删除。 由于 VISA READ 的输出是字符串,所以一般使用 “ 连接字符串 ” 这个函数将它们连接起来,然后接到循环结构中的移位寄存器中进行保存,当移位寄存器中的数据量达到一定时或满足数据处理的条件时,才停止这个循环输出读取到的数据。 一般如下图所示: 图 5 被动接收类型中的数据接收 在接收 下位机发送的帧数据时,一定要先了解帧格式,这样才能正确解析出帧里面的数据来。 下面以例子来说明数据帧格式的通信。 设定通信数据帧每 7个字节为一帧数据,其中以 0xAC、 0x96二个字节作为数据帧头,第三、四个帧头为帧计数器,最大值为 0xFFFF,到达最大值后重新从 0开始计数,第 6三个字节是数据信息,分别代表数据的高中低位,第 7位为状态标志字节,它的第一位为 1时表示下位机出错,为 0时表示功能正常。 由于 LabVIEW 中接收到的数据都是以字符串的形式显示出来的,所以需要将字符串转换为基于组态的 PC 机串口通信程序设计 13 ASCII码,一般可以直接 使用 “ 转换为 U8数组 ” 这个函数,如下图所示: 图 5 字符串转换为 U8 字节 转换为 U8 字节后,得到的是所传输字符的 ASCII 码,我们就很容易进行数据帧的判断了,现收到以下的字符串数据: , 图 6 实际接收到的字符串 上图中下半部分显示的数组是使用 “ 字符串转换为 U8数组 ” 的函数转换之后得到的数组,一个是十六进制显示,另一个为十进制显示。 对照定义的数据帧格式,就很容易得到我们需要的数据了。 首先是要看从哪里开始才是完整的第一帧,从上面十六进制显示的数组中我们可以看到,并不是第一个字节就是我们需要的帧头 ,因为下位机是一直处于发送数据的状态,很可能在串口发送一帧数据的过程中串口就被初始化或者被清空了一次缓冲区,那么这一帧数据的前面部分数据可能就会丢失,只留下后面一部分数据。 以上图为例子,第一二个字节为 0x3 0x22,显示不是我们要的帧头,我们要的帧头基于组态的 PC 机串口通信程序设计 14 是在第 7 个字节,以程序来实现的话就是先查找第一个帧头,使用 “ 搜索字符串 ” ,如果找到则判断它下一个字节是否是第二个帧头,如果是,表明已经找到帧头,输出帧头的位置;如果它下一个字节不是第二个帧头,说明这里不是真正的帧头,继续查找下一个帧头,直到找到帧头或搜 索完整个字符串都找不到帧头。 这是一个程序的算法问题,具体实现的程序如下图所示: 图 7 帧头查找程序 帧头查找到以后,再找数据就容易了,根据之前的定义,第 6个字节是才是我们要的数据,所以直接使用索引号进行索引输出即可。 图 8 获取实际数据 一般情况下,如果是用三个字节表示一个数据的话,那么这三个字节分别表示为一个数据的高中低字节,即高字节要乘以 25536再加上中字节乘以 256再加上低字节的,这样定义后可表示的数据的范围就会扩大很多,但这里为了说明问题,直接认为三个字节的数据相加就是我们要 的实际数据,在实际使用过程中应该根据帧格式的字义来解析这个数据。 基于组态的 PC 机串口通信程序设计 15 另外帧格式中定义了最后一个字节为状态标志位,所以提取数据前还要检查一下这个标志位是否正常,不正常时要进行相应的处理,这里不再详细描述。 至此完成一次数据帧的提取。 如果是没什么特殊的要求的话,这里应该也算到一段落了,有一些对测试时间有要求的地方,就会要求在最短的时间内得到最多的信息。 图 6中我们可以看到,接收到的数据帧中,除了中间一个完整的帧之外,头尾还有一些无用的数据,其实这些数据中也包含了有用的信息的。 比如我们可以从 0xAC、 0x96这二个 帧的位置中推断中它前面的 0x2 0x2A、 0x38这三个字节也是我们想要的数据字节,但是由于没有接收到它的帧头,所以程序没能提取出来,但我们可以从后一帧的帧头推算出前面那一帧的数据字节是哪些,即使没收到前面那一帧的帧这里只给出一个流程,不再给出具体的程序。 另外有可能接收的数据长度比较长,可能就不止包含了一帧的数据在里面,所以在程序中也要判断一下剩下的数据还够不够一帧的数据长度,如果够则可以根据上一次查找的帧头位置+数据帧长度来确定下一个数据帧的帧头位置了,不需要使用搜索的方法。 也可能存在处理完一帧数据后 ,剩下的数据不够一个帧的,这时可以将这些剩下的数据保留起来,将它添加到下一次接收到的数据前面,组成新的数据再进行处理。 去掉已经处理的数据可以使用 “ 删除数组元素 ” 这个函数来实现。 这里也不再给出具体的程序。 串口数据类型的转换 由于 LabVIEW中 VISA Read/Write 这二个函数都是只能读取 /写入字符串类型的数据的,而有时候需要接收 /写入的数据类型不一定是字符串,导致在刚开始接触的时候会有一点困惑。 在进行数据转换时,只要记住计算机中所有数据都是以二进制保存这个原则就容易解决问题了。 串口线上传输 的也是高低,串口接收到的也是二进制数据,只是到 LabVIEW 后被转换为字符串格式了。 还是以例子进行解释。 LabVIEW 从串口接受数据 ① 假设 LabVIEW 从串口接收到的数据为 “1234” (正常显示模式下),那么这个数据在串口底层的时候其实是这样的二进制数据:。基于组态的pc机串口通信程序设计
相关推荐
0Hz 时,即使实际供水压力仍然低于设定压力,也不能够再增加变频器的输出频率了。 要增加实际供水压力,正如前面所讲的那样,只能够通过水泵机组切换,增加运行机组数量来实现。 另外,变频器的输出频率不能够为负值,最低只能是 0Hz。 其实,在实 际应用中,变频器的输出频率是不可能降低到 0Hz。 因为当水泵机组运行,电机带动水泵向管网供水时,由于管网中的水压会反推水泵
xx 理工学院毕业设计(论文) 6 第三章 群控电梯硬件配置与选型 群控电梯硬件配置主要包括:直流减速电机、曳引电动机、位置检测装置、变频器及PLC 的选型。 直流减速电机(如图 31 所示)俗称齿轮减速电机,主要是它在普通直流电机基础上添加了配套齿轮减速箱。 因为有齿轮减速箱的作用,所以拥有了更大的力矩、较低的转速。 在本设计中直流减速电机的输入电压和转速分别为 24V、 10 转每分钟。
................................................................. 26 光幕系统装置 ........................................................................... 27 换速和平层感应器装置 .................................
遗传算法基本思想 进化论认为每一物种在不断的发展过程中都是越来越适应环境。 物种的每个个体的基本特征被后代所继承,但后代又不完全同于父代,这些新的变化若适应环境,则被保留下来。 在某一环境中也是那些更能适应环境的个体特征能被保留下来,这就是适者生存的原理。 遗传学说认为遗传是作为一种指令码封装在每个细胞中,并以基因的形式包含在染色体中,每个基因有特殊的位置并控制某个特殊的性质
系统硬件组成 本课题 在实际调研和系统需求分析的基础上, 利用可编程逻辑控制器 和触摸屏 设计 一个 交通灯南京晓庄学院 2020 届本科毕业设计 4 控制系统。 系统运行时 ,按照红、绿、黄三种灯的交替工作来控制各个方向的 左行、 直行 及右行 ,并且 根据 信号灯 工作时间 利用 数码管 进行 倒计时显示。 根据控制要求, 本 系统设计的硬件 组成 框图如图 2所示。 图 2 系统设计的硬件
公司, 为用户提供丰富的图形界面以及相关下位机的驱动程序 , 但是驱动程序和软件分开的,需要用户自己在另行购买。 Intellution也是 OPC( OLE for Process Control)组织的发起成员之一。 iFiX 第 3 页 的 OPC 组件和驱动程序同样需要单独购买。 ( 3) Citech: 悉雅特集团( Citect)是世界领先的提供工业自动化系统、设施自动化系统