用VB做的配料系统,现在界面部分已经基本完成,就差通讯和数据库报表查询~~头疼中
用MCSomm与RS-232通讯,具体过程如下
系统主要是控制六路斗秤下料,由在系统中输入所需料重后,点击“运行”斗秤的开关门电机控制关门——控制电震机震动——斗秤的称重传感器称重并返回数据,当数据和输入的数值相等时,电震机停止震动——称重传感器再次称重并输出到文本框——斗秤的开关门电机控制开门,等到称重传感器的值不再变化——斗秤关门,所有斗秤都关门(6路)——控制皮带电机转动,到达设定时间又开始新的一轮循环称重的实际值如果和给定值有差值,能在下一次循环中补偿,能用数据库记录每次每一路的数值并可以手动控制,比如点击“1号下料”1路电震机下料,点击“3号停止”3号电震机停止,点击“4号开门”四号斗秤开门,点击“6号关门”六号斗秤关门部分通讯代码如下:
串口初始化模块:
Private Sub Form_Initialize()
MSComm1.CommPort=1                           使用COM1口
MSComm1.Settings=”9600,N,8,1”                    
MSComm1.InputLen=0                             输入时读整个缓冲区
MSComm1.PortOpen=True                          打开端口
End Sub
数据读取及显示模块:
Private Sub Command1_Click()
Dim Instring As String                               第一变量
MSComm 1.Output=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3)   计算机发送指令(这句是什么意思?)Do While MSComm 1.inbuffercount<14                 等待接收全部数据
Doevents
Loop
Instring=MSComm 1.Input                            取重量数据并显示
Text1=Instring
End sub
退出模块:
Private Sub Form_QueryunLoad()
MSComm1.PortOpen=False                           关闭端口
End sub以上是我找到的参考论文中的代码,这个是不是只能控制称重部分?只是1路的?我需要6路,并且可以完成上述复杂控制
而且可以在无料的时候测试秤的重量(皮重)测量到的数值可以被保存,并且发送给称重传感器的数据=输入数据+所侧皮重(6路分别都是)虚心求教完整代码及说明,本人对VB很菜,希望好心人帮忙~!!!!!!!!!!!!
我手里的所有分都拿出来了,谢谢谢谢谢谢谢~~~~~~~~~~~~~~~~~!!!!!!!!!QQ:71780622

解决方案 »

  1.   

    先试着解释一下示例代码:Private Sub Command1_Click() 
    Dim Instring As String
    ' chr(2), chr(3) 是起始和停止标志字节
    ' 中间的数据是 AB03
    MSComm 1.Output=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3)
    ' 底层设备的应答有 14 字节,这里采用轮询方式等待应答数据
    Do While MSComm 1.inbuffercount <14  
    Doevents 
    Loop 
    '取重量数据并显示
    Instring=MSComm 1.Input                             
    Text1=Instring 
    End sub PC 端发送什么样的命令以及如何解释返回的数据,与应用层的协议有关。也就是你的配料系统微处理器是如何解释你的命令,返回什么样的应答数据。
    搞清楚这些,通过编程实现连续动作还是单步操作,都不成问题。
      

  2.   

    我不知道PC端发送的命令应该是什么样的,“如何解释返回的数据,与应用层的协议有关。”我也不清楚~~~~我对VB的了解相当少~~汗~!
    我需要发送输入到文本框中的重量设定数据(10进制数),发送电动机、开关门电机、的开关控制(不知道这是什么样的命令)刚才在百度上查也没有查到,郁闷中~~~~~~~~~
    我再查~~~~~~~~~~~~~~
      

  3.   

    1. 取样控制箱的通讯协议
    9600bps波特率,8位数据位,1位停止位,无校验。
    地址:十六进制表示的字节01H~1FH
    命令:ASCII表示的英文字符'QUYA'
    数据:ASCII 表示的十六进制
    校验:ASCII 表示的前十六字节二进制加和的2个字节,转变为十六进制ASCII占4字节。命令格式:
    地址(2字节) 命令(4字节) 数据(12字节) 校验(4字节) 数据格式:'AAMMNN000000'
      

  4.   

    Private Sub Command1_Click() 
    Dim Instring As String                               第一变量 
    MSComm 1.Output=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3)   计算机发送指令(这句是什么意思?)Do While MSComm 1.inbuffercount <14                 等待接收全部数据 
    Doevents 
    Loop 
    Instring=MSComm 1.Input                            取重量数据并显示 
    Text1=Instring 
    End sub 这一段我没有看明白,一般都是在mscomm的事件中控制字符串的接收的。
      

  5.   


    RThreshold属性必需设置,(按照你上面的协议此处应该设置为20)
    同时inputmod 必需设置为1才可以接收2进制数据。接收数据在下面过程中写
    Private Sub MSComm1_OnComm()
        Dim Arey() As Byte
        Dim Comm_Str As Variant
        
        If MSComm1.CommEvent = 2 Then
            Comm_Str = MSComm1.Input
            Arey = Comm_Str           End If
    End Sub上面的Arey数组你就可以进行随心所欲的处理了。(我当时编程的时候把单词拼写错了,不好意思)同时你也可以将
    RThreshold = 1
    哪么你就可以对当前数据线上的数据进行地址判断了。同时你的这套系统应该使用的是485总线,这样就可以并联更多的设备,同时距离也不用受限制。记得给分。
      

  6.   

    [Quote=引用 8 楼 anlog 的回复:]接收数据在下面过程中写   "在Dim Comm_Str As Variant 后面写吗?些什么呢?
    Private Sub MSComm1_OnComm() 
        Dim Arey() As Byte 
        Dim Comm_Str As Variant 
         
        If MSComm1.CommEvent = 2 Then    
            Comm_Str = MSComm1.Input 
            Arey = Comm_Str            End If 
    End Sub 上面的Arey数组你就可以进行随心所欲…
    “这一段是什么意思呢?能简单解释一下吗?”
    那我写上上面这段代码就可以完成我所需要的全部通讯吗?看着好简单哦~!呵呵
      

  7.   

    需要模块吗?模块里写什么?哪位大侠可以帮我把通讯和数据存储查询部分写好。我一定会多多给分的~!!!!!!!!谢谢谢谢~~~~~!!!!!!!!!!!!!
    最好有代码的解释,我比较菜了~呵呵。下面是程序连接~~~~~要是好心帮我把里面的代码也解释一下就太太太太感激了~!http://download.csdn.net/source/468165
      

  8.   

    只是1路的?我需要6路   If Comm1.PortOpen = True Then
            Comm1.PortOpen = False
        End If
        
        Comm1.CommPort = 6          '打開端口路
        Comm1.PortOpen = True
      

  9.   

    回9樓
       Arey,為接收到的數據
      

  10.   

    原材料放入6各个原料库中,料库下端出料口各接一个电磁振动给料机(即电振机)。待校秤完毕后(由称重传感器测量斗秤皮重并返回数值,记录到数据库),系统开始喂料,喂料量的大小可以通过操作人员事先输入。物料经电振机抖动,进入料斗,斗下面根据所装物料的多少,装有一只或两只精度为万分之三的传感器,通过该传感器,可准确称出斗内的物料重量和皮重。CPU根据检测到的传感器的电信号,确定斗内物料达到设定重量后,关断电振机电流,停止喂料。待料斗稳定后,CPU称出此时物料的静态重量,随后打开料斗门并开始下料,物料通过运输皮带送到下一工序。下料完毕,CPU将自动关闭料斗门,准备进行下一周期的配料。其中,每放完一斗物料,开始新一轮的配料时,要重新进行测量皮重,并计算落差补偿值,
    只要能完成上述功能,怎样都可以
      

  11.   

    #AAN 
    名称:从N通道读取模拟量输入数据
    说明:按照当前格式返回模拟量输入模块8通道中第N通道输入值
    格式:#AAN(CR)
          #为分界符
          AA(范围00~FF)表示模拟量输入模块的2位十六进制地址。
          N表示由N通道读取数值,数值范围是0~7V
         (CR)是终结符,用回车表示
    响应:>(数据)(CR)
          当输入模块的命令存在语法错误、模块通讯错误、没有专用地址时模块没有响应。
           >是分界符
         (数据)是第N 通道的数据输入值。
         (CR)是终结符,用回车表示。
    例如:命令  #120(CR)
          响应  >+1.4567(CR)
          命令查询地址为21h的模拟量输入模块的第0通道的输入值。
          模拟量输入模块第0通道的输入值等于+1.4567。
    注:其中返回值为A/D转换后的电压值,重量数值需要转换一下。
      

  12.   

    终于知道通讯协议是什么了。
    就用MODBUS-RTU通讯协议吧,http://hi.baidu.com/lbicecoffe/blog/item/fc73eaeede8f9bffb3fb95a9.html
      

  13.   

    你的这个问题已经超出了VB的范畴,不是研究VB就能解决得了的,对你提供的那段代码的二楼的解释已经很清楚了,但是你看不懂,看不懂的原因是你根本就没有搞明白该如何实现对你的几个设备进行控制的问题。你说你要控制6路斗秤,那这6路斗秤是一个设备还是6个设备,这些设备有没有提供rs232接口,如果有rs232接口那他们的通讯协议是怎么样的(也就是通过rs232接口发送什么样的指令能对这个设备进行控制,这种协议是与设备相关的,不同的设备,不同的设计人员设计出来的通讯协议都有可能不同,MODBUS-RTU只是人家与某个设备通讯是的协议,可能和你一点关系都没有)等等,所有这些基本的问题你都没搞清楚。像你这样的项目一般都需要一个单独的硬件控制设备来实现的,这个设备可以是单片机、可编程逻辑控制器等等,一般大多还是用单片机来实现(成本比可编程逻辑控制器低很多)。电脑首先将控制指令发送给单片机,单片机收到指令以后分析指令然后再对相应的设备进行控制,比如控制某个设备的启动、停止或者电磁阀的开、关等等。在你的这个系统里面就是由这个单片机去控制这六路斗秤的开关门电机的运转和停止。所谓的通讯协议指的就是电脑如何与单片机之间进行数据交换,包括波特率、帧结构、校验方式等等,所有这些都取决于单片机的程序设计
      

  14.   

    这种协议没有什么大家熟悉的,完全由硬件开发人员自己定,由于现在一般的电脑只有一个串口(ATX主板可能还有两个,通过串口扩展卡可以扩展出多个串口),而你有三个控制模块,所以比较大的可能性是将这三个控制模块串起来接到同一个串口上,基于这种情况就需要对这三个控制模块进行编号(这个编号是需要保存到控制模块的存储器里去的),然后计算机与模块之间的通讯协议就可以参考以下这种帧格式进行定义,第1字节和第2字节代表帧头,第3字节表示控制模块的模块号,第4字节表示这个控制模块上的第几路设备,第5字节表示控制指令,第6-8字节表示数据,第9 10字节是CRC校验码,比如:FF FF 03 02 01 00 00 05 0A 9B,其中FF FF代表帧头,03表示第三个控制模块,02表示该控制模块上的第2路设备,01表示启动斗秤的开关们电机,00 00 05表示斗秤下5个单位的料,0A 9B是将前面8个字节按照CRC冗余算法计算的冗余码,你的程序就是根据用户的操作去构建一个这样的数据帧,然后把这个数据帧从串口发送出去,下面的3个控制模块收到这个数据帧以后就开始分析,通过对帧结构的分析它就可以知道要对那一路的设备进行控制。上面你说你看不懂的那行就是一个数据帧,只不过他那个数据帧由6个字节组成而已,所以这种通讯协议完全由硬件开发人员来定义,完全没有什么大家熟悉的一说,如果没人告诉你那三个模块的通讯协议,即便你的这个东西做出来了不可能和那三个模块进行通讯,更谈不上去控制下面的设备了。(如果那三个模块随便定,对系统无所谓那你还研究串口通讯的代码干嘛,MCSomm控件都不需要直接忽略完事,反正都是虚的)
      

  15.   

    命令以#开始,以@结束,以:分隔命令包括: K 表示开关通道, A 表示AD通道带参数表示设置,不带参数表示查询比如:
     #K1:1@ 表示打开第一个开关通道 #K1:0@ 表示关闭第一个开关通道 #K1@ 表示查询第一个开关通道状态 
    还有,#K@表示查询所有开关通道 
     传回 #K1:1@ 表示第1个开关通道的状态为开启 #K:00000010@ 表示对应的各开关通道状态设备AD通道格式与此相仿 #A1:0983@ 表示AD通道1的当前值为0983
      

  16.   

    波特率为9600,数据格式如下:每100ms发送一组数据,每组数据有5帧,每帧11位,1位起始位(0),8位数据位(D0-D7),2位停止位(1),无奇偶校验.定义如下:第1帧:D0—D7 ----0FFH(起始位)第2帧:D0—D2 ----为小数点位置(0-5)        D3     -----NC        D4     -----1表示称重稳定 0表示称重未稳定        D5     -----1表示称重为负 0表示称重为正        D6     -----NCD7     -----1表示超载第3帧:D0—D7 ----BCD1(称重值)第4帧:D0—D7 ----BCD2(称重值)第5帧:D0—D7 ----BCD3(称重值)        BCD1,BCD2,BCD3为由低到高的称重值的BCD码。
      

  17.   

    急~~~~~~~~~~~~~~~~
    马上要交了,好心人帮帮我吧~~~~~~~~~~~~~~~~~~~~~谢谢~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    我找的那些通讯协议都不可以吗?哭了~!!!!!!!!!!!!!
    要什么样的才行啊~?要怎么找啊~?我的设计是串口——RS232——RS232 转 RS485谢谢提供编程例子~~~~~~~~!要控制多从机的,一对一通讯的例子已经有了。各位大哥大姐求救啊~!!!!!!!!!!跪谢~!!!!!!!!!!!!又开了一个感谢贴子,那个帖子的感谢分一同加上~!!!!!!!
    http://topic.csdn.net/u/20080601/22/d7d39aa3-a974-42b2-8190-6db8d4365dec.html
      

  18.   

    恰巧我现在做的就是上位机软件。你要跟哪个硬件通讯,就要相应那个硬件的通讯协议,而这种东西,一般要找硬件开发厂商拿,网上搜的是不能用的。像我公司里的同事接一个云台监控的工程,里面的协议就有近百种,这个客户定这种,那个客户定那种,所以通讯协议不是我们要给你用哪种,而是你现在的设备用的是哪种。而且这种一般都是下位机开发完,定下了通讯协议后,电脑这边的上位机再去配合下位机的,你现在下位机都没弄好,如何做这上位机软件?一般你说的机组,比较多的是一个RS485然后底下并数个RS232,每一台设备定一个编号,通讯的时候将编号一起传输,发到串口上,设备收到后解析,进行相应的运转。你现在应该去下几个串口通迅的例子,把基本概念搞明白,然后把通迅协议搞到手,要不然就算是有一亿分,也没人能凭空生出你所用设备的协议的。
      

  19.   

    串口通讯的例子他应该已经有了,顶楼的那段代码应该就可以用,关键问题是他不知道该去哪里找这个通讯协议,但是偏偏这个问题在这里是没有人能够给他解答的,google、百度也是搜不到结果的,是必须自己静下心来看文档的。这个问题只能从你的那些控制模块的设计文档中找到答案。在看这些文档之前还是建议你先搞清楚整个系统工作的原理,包括那些控制模块怎么控制斗秤?斗秤称重后的数据以什么样的方式返回?返回的数据是返回给控制模块还是返回给电脑?如果返回给控制模块了,那控制模块又如何将数据传回电脑?电脑又怎么通过控制模块控制斗秤等等。如果这个系统的设计文档你看不懂,有个简单的办法,直接去问那个控制模块的设计人员或者你们这个项目的Leader(或者导师,我估摸着你应该是一个自控专业的即将毕业的学生在做毕业设计),他们肯定知道具体的通讯协议是怎么样的。你上面24楼和28楼所描述的协议可能都是这个系统的通讯协议,其中28楼描述的那个可能是控制模块将称重传感器的称重值返回PC的协议,24楼的那个可能是PC发出的控制指令通过控制模块控制斗秤开关门电机的运行及查询开关门电机运行状态的协议。
      

  20.   

    28楼的协议我可以给你解释一下,这个协议应该是控制模块把称重传感器测量出来的称重值返回给电脑的通讯协议。其中“波特率为9600,1位起始位(0),8位数据位(D0-D7),2位停止位(1),无奇偶校验 ”这几句的意思说明的是PC与控制模块通讯时串口的参数设置,也就是mscomm1的Setting属性必须设置为:"9600,n,8,1",9600是波特率,n是无奇偶校验,8是有8个数据位,1是有2位停止位。"每100ms发送一组数据,每组数据有5帧",这一句说明了控制模块每隔100毫秒就会给PC传送一次称重值,每次传送的数据为5个字节(这里不应该用帧这个单位,一般情况下这一组数据5个字节合起来才叫一个数据帧,这里有一个概念的错误)剩下的就是这5个字节(一个数据帧)的具体含义。
    其中第一字节是帧头,值为16进制的FF,表示这一组数据的开始,也就是你用MSComm1.Input这个方法取得串口数据时,取得的第一个字节的内容必须是255(也就是16进制的FF),如果不是255就表示这是一组垃圾数据。第二个字节有8个位(bit),其中第0、1、2位(bit)对应的是小数点位置,第3位(bit)对应NC等等依此类推,比如第二字节转换成二进制以后为00100000,
    其对应为D7=0 D6=0 D5=1 D4=0 D3=0 D2=0 D1=0 D0=0,根据协议的解释D4=0表示称重不稳定,D5=1表示称重为负值等等第三至第五字节为具体的称重重量,以BCD码进行存储,其中低位在前高位在后,也就是说实际的重量应该用(第五字节的值*16*16+第四字节的值*16+第三字节的值)这种方法进行计算。
      

  21.   

    自己写了一个,
    命令以#开始,以@结束,以:分隔 斗秤开关量输出:
    功能码:01                1BYTE           0X01
    地址:01-06             1BYTE           0X01——0X06
    1为打开,0为关闭            1BYTE           0X01——0X00开关量输入(查询)
    功能码:02                1BYTE           0X02
    地址:01-06              1BYTE           0X01——0X06
    1为以打开,0为已关闭        1BYTE           0X01——0X00电振机开关量输出:
    功能码:03                1BYTE           0X01
    地址:01-06             1BYTE           0X01——0X06
    1为打开,0为关闭            1BYTE           0X01——0X00开关量输入(查询)
    功能码:04                1BYTE           0X02
    地址:01-06              1BYTE           0X01——0X06
    1为以打开,0为已关闭        1BYTE           0X01——0X00
    数字量输出
    功能码:05                1BYTE           0X03
    地址:01-06               1BYTE           0X01——0X06
    输出数据                    2BYTE           0X0000——0XFFFF数字量输入(查询)
    功能码:06               1BYTE           0X04
    地址:01-06               1BYTE           0X01——0X06
    输入数据                    2BYTE           0X0000——0XFFFF格式:#0X010X010X01@不知道还有什么欠缺或者不合理的地方~~~?如果按上面的协议应该怎么写呢?要检查所有开关是否关闭——如果关闭——称重传感器测皮重并把重量用10进制值显示在6个文本框(已经用D/A转换为数字量)——打开所有电振机——检测6个斗秤的重量和给定值(6个命令按钮中(我用的命令按钮显示数据)的10进制数据)相同时,哪一路相同了,关闭哪一路的电震机,等待电震机都关闭了,测所有斗秤重量,返回显示到另外6个命令按钮中。同时打开斗秤开关门,等待所有料都下完——斗秤关门,开始下一周期
      

  22.   

    不用演示,你就随便拷一点代码,反正根本没设备,你就说“点击此按钮,发XXXX,实现XXXX功能”,就行了,不用这么较真。
    我还真没听过没下位机,就要上位机凭空生出通讯协议,还要把东西做出来的,你们是什么学校什么专业什么老师啊,服了。
      

  23.   

    呵呵~~~~~~~~~~~~~~~
    感谢大家的帮助~~~~~~~~·那我就听取大家的意见,随便弄代码吧不过,要是我这个控制6个东西的,代码应该怎么改呢?Private Sub Command1_Click() 
    Dim Instring As String                             
    MSComm 1.Output=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3)  
    Do While MSComm 1.inbuffercount <14                
    Doevents 
    Loop 
    Instring=MSComm 1.Input                            
    Text1=Instring 
    End sub 比如说这个
    Instring=MSComm 1.Input                            
    Text1=Instring 我需要把读到的六路数据放到六个命令按钮里显示
      

  24.   

    呵呵~~~~~~~~~~~~~~~
    感谢大家的帮助~~~~~~~~·那我就听取大家的意见,随便弄代码吧不过,要是我这个控制6个东西的,代码应该怎么改呢?Private Sub Command1_Click() 
    Dim Instring As String                             
    MSComm 1.Output=chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3)  
    Do While MSComm 1.inbuffercount <14                
    Doevents 
    Loop 
    Instring=MSComm 1.Input                            
    Text1=Instring 
    End sub 比如说这个
    Instring=MSComm 1.Input                            
    Text1=Instring 我需要把读到的六路数据放到六个命令按钮里显示
      

  25.   

    从你还在谈什么“已经用D/A转换为数字量”来看,你对整个系统的工作原理还处在一个一知半解的状态。整个硬件控制部分包括控制模块、斗秤、传感器等等就相当于一个封装好了的“类”,与上位机通讯的协议就相当于类的接口,而“已经用D/A转换成数字量”(这里应该说是A/D转换,才能变成数字量)就相当于类里边某一个内部参数的数据类型的变化,对于“类”的使用者来说只需要知道这个类的接口就可以了,不需要知道类里面的具体实现过程,你就是这个“类”的使用者,对于你来说只需要知道类的接口也就是上位机与下位机的通讯协议就可以了,像“已经用D/A转换成数字量”这样的类的内部参数数据类型的变化和你一点关系也没有。从你还在谈什么“已经用D/A转换成数字量”来猜测,你所理解的这个系统缺少了一个东西,也是这个系统的心脏,就是我前面提到的“单片机"或"PLC",所以你认为用A/D转换成数字量以后就可以直接送给上位机了,所以你在提到显示测量皮重的时候会提到“已经用D/A转换成数字量”了,你的这个想法是不对的,由此也可以看出你对这个系统的工作原理还没有搞清楚,还处在一个一知半解的状态,建议你还是再好好研究研究这个系统的工作原理把,要不然论文答辩的时候别人随便提点硬件方面的问题你就会露馅的。
      

  26.   


    如果真要控制应该是根据用户的操作和通讯协议构造出一个数据帧,然后用Mscomm1.output把相关的指令发送下去,然后再通过mscomm1.input读取下位机返回的结果。
      

  27.   

    谢谢提醒我的这个系统不用单片机也不用PLC,用的是三个模块,两个开关量模块和一个数字量模块,通过开关量模块控制开关门电机和电振机,数字量模块控制称重传感器
      

  28.   

    看来你还没明白什么意思!问你两个简单的问题:1、假定从计算机的串口发送一个0xFF表示启动你所有的开关门电机,问:你的这三个模块将如何接收这个0xFF,以及如何知道收到的是0xFF而不是别的?2、假定计算机从串口收到一个0xDD表示称重传感器侧出来的重量,问:你的这三个模块如何将0xDD发送到计算机的串口上?
      

  29.   

    所谓的6路12个设备其实用一个COM口就可以。关键是用地址区分好各个设备。我以前给别人写的通过串口控制配液仪的程序,按照配液仪的通讯协议与指令集,就是一个Com口控制n个配液仪的。每个设备都分配一个Com口既不现实也没必要。用Com口通讯有个实时性的问题,这个比较不好解决。如果你的毕设可以改用CAN通讯的话(感觉现在好像太晚了),用CAN会舒服很多(我用CAN做数据采集毕设时候的感觉。不过我是软硬件都做)而且用CAN比较有所谓的“学术、技术含量”。只要买个周立功的CAN卡就很容易解决,PC端看通那几十页函数库说明就可以了。不知道你那个模块是你们自己做的还是从外面买现成的。外面买现成的话应该在说明书上有通讯协议和指令集信息。以前我参加学校机器人队用的一个国外的电机控制器就是这么一个情况,附带一百多页的指令说明。此外,D/A乃数模转换,D为数(Digital),A为模(Analog)。模数转换应为A/D,论文里不要弄错了。
    你那导师估计也没打算让你做出实际东西来,本科毕设过不过关键还是看工作量。工作量够了,答辩没严重问题就过了。只要你那套通讯协议包括 发送:设备地址、设备指令、指令参数 接收:设备地址、设备返回类型、设备返回参数 基本上就算完成任务了。我们毕业那年碰上本科教育评估,毕设检查得特严,但最后凡是工作量够的都过去了。
      

  30.   

    这么写可以吗?
    Private Sub commCOM_OnComm()
    Select Case commCOM.CommEvent
    Case comEvReceive
    Dim DataReceived() As ByteIf commCOM.CommEvent = "#K:000000@" Then     ‘所有的开关门都打开的话
    commCOM.InputLen = 0commCOM.OutBufferCount = 0
    commCOM.Output = "#KZ:111111@"          ’打开所有电振机
    End If
    If commCOM.CommEvent = "#KZ:111111@" Then ‘所有电振机都是开的ReDim DataReceived(i) As Byte
    DataReceived() = commCOM.Input        
    End If
        Command1(12).Caption = DataReceived(0)  ’将输入数据显示到6个按钮
        Command1(13).Caption = DataReceived(1)
        Command1(14).Caption = DataReceived(2)
        Command1(15).Caption = DataReceived(3)
        Command1(16).Caption = DataReceived(4)
        Command1(17).Caption = DataReceived(5)End Select
    End Sub
    -----------------------------------------------------------------Public Function funSendCommand(Command As String) As Boolean
        On Error GoTo lopError
        '------------------------------------------------
        Dim vResult() As Boolean
          
         vResult(0) = Command1(6).Caption    
         vResult(1) = Command1(7).Caption
         vResult(2) = Command1(8).Caption
         vResult(3) = Command1(9).Caption
         vResult(4) = Command1(10).Caption
         vResult(5) = Command1(11).Caption    If Not commCOM.PortOpen Then
            GoTo lopError
        Else        With commCOM
                .OutBufferCount = 0
                .Output = "#AD@" + vResult          ‘输出控制称重传感器和6个称重的数值
            End With
        End If
        vResult = True
        funSendCommand = vResult
        
      
      For i = 6 To 11
      For j = 12 To 17
         frmindex.Controls("command" & j).Caption = "command" & i      ‘当称重数值和给定值相同时
      Next
    End Sub
        commCOM.OutBufferCount = 0
        commCOM.Output = "#KZ:000000@" + "#K:111111@" + "#P:1"     ’输出关闭所有电振机,打开所有秤门,打开皮带传输电机
        Dim Start     As Single
        
      Start = Timer6                               ‘延时
      Do While Timer6 < Start + PauseTime
      DoEvents
      Loop
      commCOM.Output = "#K:000000@"                 ’关闭所有秤门  
        '------------------------------------------------
        Exit Sub
        '----------------
    lopError:
        funSendCommand = False
    End Sub
    Public Function funGetData() As String
        funGetData = vResult
    End FunctionPublic Function funClearData()
       vResult = ""
    End Function
    ------------------------------------------------------------------------------------------
    请问~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~这么写可以吗?~~~~~~~~~~~~~~~~
      

  31.   

    发送  chr(2)+chr(65)+chr(66)+chr(48)+chr(51)+chr(3)  
    会返回 14位结果 这是 通讯协议
      

  32.   

    串口的物理接口在你这里有用的就3根线:RXD,TXD,GND。只要保证从机的TXD都接在PC的RXD上,从机的RXD都接在PC的TXD上,GND都接在一起,就可以保证在信号线压在RS-232标准范围内PC和各从机都可以通讯。当然,这些是做硬件的才需要知道的。通讯协议你可以全部采用ASCII码方式进行,这样对于纠错还有一定帮助(收到非法ASCII码即判为通讯错误),而且在VB里很容易处理(就是做下面的模块的人用C写单片机程序会累点)。PC发送:"A" & str(地址变量) & 指令 & str(数据) & vbKeyReturn
    从机返回:str(数据) & vbKeyReturn这种协议很方便实用,当时我用的Faulhaber(没拼错的话)电机控制器的传输协议也差不多就这个样子。你可以上网找找这个东西的资料,德国的空心杯电机公司。比如你要3号设备开始抖100下,可以这么定:
    "A3Shake100" & vbKeyReturn再如要获得1号设备状态可以这么定:
    "A1GetStatus0" & vbKeyReturn
    然后在接受事件里面将返回的字符串取出来现在信息大爆炸,在搜索引擎搜“串口通讯”这么模糊的字眼会有很多重复信息和垃圾信息的。我们学校都快答辩了,你还有事件做么?