同学让我帮他们单位做个背景软件!
主要功能就是显示从单片机中发出的数据!
我详细说一下要干什么:
1、一共有六个单片机。
2、计算机发出一个低电平,一段时间后(这段时间一直保持低电平)送出数据,呼叫某个单片机。
3、单片机收到信号后,与自身的指比较。与这个信号对应的单片机开始发送数据,我这边开始接受。
4、单片机发送数据结束后,在发送一个结束信号,计算机得到这个结束信号后,在呼叫下一个单片机,如此循环下去...我用mscomm开发,现在遇到几个问题:
1、用mscomm可以发送搞/低电平么?而且要保持低电平的时间是1.5位那么长!(这点最关键)
2、用mscomm接收到二进制怎么转换成十进制显示呀?
最好有点码,谢谢了

解决方案 »

  1.   

    用块板卡 PCI-7401 8位32路A/D转换
    或自己写主板上的并口
      

  2.   

    我对硬件不懂,高低电平是不是就是发送0和1组成的序列,如果是那用MSCOMM应该可以。
      

  3.   

    当然是用MSCOMM
    可以用并口也可用串口
    单片机用什么口,你就用什么口
    单片机用485,你也可用232,不过要用到485/232转化头
      

  4.   

    to gcj123(佛的光辉) :
    能具体点么
      

  5.   

    用串口能搞定,不要说是六个,就是六十个也没有问题.
    一个串口最好只和起控制作用的单片机(A)通讯,用A来控制选择与具体的哪一个单片机交换数据.关于高低电平的问题,不要用MSComm来搞,把它交给A来处理,而计算机用约定好的指令来控制这个A:比如让它选择哪个单片机,发送什么数据等.关于二进制数据到十进制数据的转换:
    比如对于二进制10000001(&H81)对应显示十进制为129,可参见下面的过程
    Private Function ctrByte2StringD(ByVal bytSrc As Byte, ByRef strDest As String) As Boolean
    On Error GoTo ErrHandler
        Dim blnR As Boolean
        Dim bytT As Byte, lngI As Long, lngT As Long
        Dim strT As String
        
        strDest = ""
        '因为一个Byte最多表示到255,所以选择2做为初始条件
        For lngI = 2 To 0 Step -1
            bytT = Fix(bytSrc / (10 ^ lngI))
            bytSrc = bytSrc Mod (10 ^ lngI)
            '此处可以判断如果为0时不进行累加
            strDest = strDest & CStr(bytT)
        Next
        blnR = True
    ErrHandler:
        If Err Then
            'DbDisplayError "ctrByte2StringD"
            blnR = False
        End If
        ctrByte2StringD = blnR
    End Function
      

  6.   

    实际用一个CStr(bytevalue)也能搞定上面的函数功能.
      

  7.   

    我同学那边已经定好用串口通信,怎么呼叫我不用管,我只要发出一定时间的低电平触发单片机,在发出信号呼叫单片机即可!
    to AechoJohn(江江) :谢谢了!可是硬件环境已经定下来了,用低电平触发单片机的事情就有我这边来做!没办法!应该怎么办呀?
      

  8.   

    我觉得为什么一定要保持低电平啊?什么意思啊,我做过两个产品,都是单片机和计算机通讯的,并不需要保持低电平。只要定好通讯协议,就可以通讯。你的意思是不是用低电平作片选,哪个是低就表示选中了那个单片机?
     mscomm接收到二进数后,无需操作,系统自动转换成10进数。
      

  9.   

    为什么一定要保持低电平啊?什么意思啊?你的低电平是指哪根线?
    Carrier Detect (CD) 线?Clear To Send (CTS) 线?Data Set Ready (DSR) 线?Data Terminal Ready (DTR) 线?Request To Send(RTS)?
    是不是你只用了3根:Vcc,GND,数据。这样的话,肯定没法保持的。如果是高电平,会出现什么问题?
      

  10.   

    我没开发过串口通信的程序,只是按msdn上使用mscomm的方法做的!
    我现在能够收到数据和发送数据!但同学昨天让我加上输出高低电平的功能!
    我不知该怎么实现,不会前功尽弃吧!
    这个活对我很重要!
    分不够可以在加!
    麻烦大家了!
      

  11.   

    他想搞成中断的方式。也就是当电平变化,才会接收数据?对么?
    你是用mscomm,就是串口方式,这方法错误,他那边!
      

  12.   

    我记的不是很清楚,好象微机串口的第七脚是要求传输,你可以用7脚接单片机的控制脚,在VB程序里
    MSCOMM1.RTSEnable = True
    适当延时
    MSCOMM1.RTSEnable = FALSE
      

  13.   

    单片机一般可以是3根线和计算机通讯:地,RXD(P3.0)、TXD(P3.1)。
    单片机用开中断方式,当RXD(P3.0)上有数据到达时,会产生中断,进入中断服务
      

  14.   

    单片机一般可以是3根线和计算机通讯:地,RXD(P3.0)、TXD(P3.1)。
    单片机用开中断方式,当RXD(P3.0)上有数据到达时,会产生中断,进入中断服务
    串行口控制寄存器SCOM(98H)上的98H.0是接收中断标识位,98H.1是发送中断标识位。
    所以没有必要置高低电平----除非有别的目的----有的话,得再加一条线,来做标志线,否则
    数据位不可能实现
      

  15.   

    to tangyang8061(大保姆):
    你的意识是:由于串行中断,我发过去单片机应该能接到,是把?如果要发高低电平的话,必须要在开一个口(一共九个,现在用到三个)来传输,不能只用2、3、5这三个口是吧?
      

  16.   

    刚才说的有点过头。
    其实让 数据线 保持低电平或高电平也不是不可能的。比如单片机要实现数据线的高低电平保持实在是easy,可是在计算机上,你要用vb,尤其是用vb的mscomm控件,那是很难,方法就是再加
    线,要在计算机上实现就要访问硬件,也就是说操作串口(访问串口驱动),用api肯定能实现。而相比 修改单片机部分就简单多了,推荐。
      

  17.   

    看来,用mscomm控件和串口都是不实际的,自己开发就知道了,一是不好控,二是误码率太高。你首先要明白,单片机通信是标准232口还是485口
                   或者是直接bit通信,还要明白这是串行,还是并行通信。
    在windows平台开发bit流的通信是不可靠的(它是消息机制,时间无法控),用纯DOS环境汇编开发,还算可以。我们公司一般做一个中间硬件板卡,一端为标准485口,一端为bit流
      

  18.   

    DTR:此脚位由计算机控制,用以通知单片机可以进行传输,高电位时表示计算机已经准备就绪,随时可以接收数据。
    DSR:此脚位由单片机控制,他用这支脚位的高电位通知计算机一切准备就绪,可以传送数据过来。
    RTS:此脚位由计算机控制,用以通知单片机马上传送数据至计算机;而当单片机收到此信号后,便会将数据传送给计算机。
    CTS:此脚位由单片机控制,用以通知计算机将预传送的数据送至单片机;当计算机收到此脚位的讯号,即将准备送出的数据送至单片机。所以你只需控制mscomm1.DTREnable=true  和mscomm1.RTSEnable=true 即可
      

  19.   

    startvb(共同学习) ,你只知道设置,你知道他的通讯用了几条线吗?
     zpwly(选你所爱,爱你所选)  to   tangyang8061(大保姆):
    “你的意识是:由于串行中断,我发过去单片机应该能接到,是把?如果要发高低电平的话,必须要再开一个口(一共九个,现在用到三个)来传输,不能只用2、3、5这三个口是吧?”
    三条线!  
     
      

  20.   

    to  tangyang8061:
    你以为你很聪明吗?:(
    我当然知道怎么设置了,要不然我早失业了
      

  21.   

    还好我单位的机子是用Modem通讯,不然就难搞了。。
      

  22.   

    用 mscomm的话根本不要你那么麻烦。
    要实现你的功能也不难。
    多看看书。
    串口第五脚是地线。
      

  23.   

    to startvb(共同学习) :
    我现在才发现我确实笨的可以,能不能麻烦您老多废点口水开导开导我:
    DTR、DSR、RTS、CTS 在串口9针D形口上的编号分别是什么?他们是几根线,如果您老还没有失业的话,最好抓张图教教我这个菜鸟所有的引脚的定义,名称、作用等等... ...
    我在期待您的“帮助”,希望您不吝赐教。
       还有个重要的问题,就是只用2、3、5引脚的电平触发,也就是楼主的问题,如果您能够的解决的话,能给大家看看代码操作吗?非常感谢!非常感谢!
       
      

  24.   

    Pin1 CD  载波侦测(Carrier Detect)。
    Pin2 RXD 接收字符(Receive)。
    Pin3 TXD 传送字符(Transmit)。
    Pin4 DTR 数据端备妥(Data Terminal Ready)。
    Pin5 GND 地线(Ground)。
    Pin6 DSR 数据备妥(Data Set Ready)。
    Pin7 RTS 要求传送(Request To Send)。
    Pin8 CTS 清除以传送(Clear To Send)。
    Pin9 RI  响铃侦测(Rind Indicator)。用不用把25针的也给你写上?
      

  25.   

    to 版主 :你需要完整的9针串口
    根据串口每针的含义控制Mscomm1.DTREnable=true  、Mscomm1.RTSEnable=true   
                   Mscomm1.CTSHolding=True 、MSComm1.DSRHolding=true
      

  26.   

    to 版主 :你需要完整的9针串口
    根据串口每针的含义控制Mscomm1.DTREnable=true  、Mscomm1.RTSEnable=true   
                   Mscomm1.CTSHolding=True 、MSComm1.DSRHolding=true
      

  27.   

    正在做一个这样的东西,暂时只需要把com2口的数据接收并显示出来,应该很容易吧?是不是只要按照msdn来做就可以了?  下面这样写窗体可以吗?用的是VB6,我是菜鸟,请多关照,谢谢
    Private Sub Form_Load()
        MSComm1.CommPort = 2 '使用COM2。
        MSComm1.Settings = "2400,N,8,1"
        MSComm1.InputLen = 0 
        MSComm1.PortOpen = True 
    End SubPrivate Sub Form_Click()
        Text1.Text = MSComm1.Input '从串行端口读内容。
    End Sub
    Private Sub Form_Unload(Cancel As Integer)
        MSComm1.PortOpen = False
    End Sub
      

  28.   

    如果接收的是简单的文本可以
    但要是字节,就会收乱码
    Private Sub Form_Load()
        MSComm1.CommPort = 2 '使用COM2。
        MSComm1.Settings = "2400,N,8,1"
        MSComm1.InputLen = 0 
        Mscomm1.inputmode=1
        Mscomm1.Rthreshold=1
        MSComm1.PortOpen = True 
    End SubPublic Sub MSComm1_OnComm()
    Dim Buffer As Variant
    Dim i As Integer
    ' 依据 CommEvent 属性进行分支
    Select Case MSComm2.CommEvent
            
        ' 事件信息
        Case comEvReceive
            i = MSComm1.InBufferCount
            Buffer = MSComm1.Input
           ShowData txtTerm, (StrConv(Buffer, vbUnicode)), Buffer, i
    end select
    end sub
       Private Static Sub ShowData(Term As Control, Data As String, Buffer As Variant, DataLenth As Integer)
        On Error GoTo Handler
        Const MAXTERMSIZE = 320000
        Dim TermSize, i As Long
        Dim s2 As String
        Dim s1 As Byte
        Dim n3, n1, n2, StrLen As Integer
           ' DoEvents
            ' 确定现存的文本不会太大。
            TermSize = Len(Term.Text)
            If TermSize > MAXTERMSIZE Then
                Term.Text = Mid$(Term.Text, 4097)
                TermSize = Len(Term.Text)
            End If      
            For n3 = 0 To DataLenth - 1
                s1 = Buffer(n3)
                s2 = Hex(s1)
                s2 = "0" & s2
                s2 = Right(s2, 2)
                Term.SelText = s2 & " "
                Term.SelStart = Term.SelStart + 3
                HexWhere = HexWhere + 3
                If HexWhere > HexWhid * 3 - 2 Then
                    Term.Text1.SelText = Chr(13) & Chr(10)
                    Term.Text1.SelStart = Term.SelStart + 2
                    HexWhere = 0
                End If
            Next n3
    end sub
    这样就可以接收字节了
      

  29.   

    to startvb(共同学习):
        这可是你说的啊(等这句话等了半天了,呵呵):  
    "你需要完整的9针串口根据串口每针的含义控制Mscomm1.DTREnable=true、Mscomm1.RTSEnable=true Mscomm1.CTSHolding=True 、MSComm1.DSRHolding=true "
    哦,你既然知道 3针是不行的。而 楼主都说了:
       2003-7-25 17:16:41  zpwly(选你所爱,爱你所选):
      “to tangyang8061(大保姆):      你的意思是:由于串行中断,我发过去单片机应该能接到,是把?如果要发高低电平的话,必须要在开一个口(一共九个,现在用到三个)来传输,不能只用2、3、5这三个口是吧?”
        注意上面括号里的:“现在用到三个”,而且这是在你说下面这些话之前楼主说的吧!?
       2003-7-28 8:39:50  startvb(共同学习) :
      “所以你只需控制mscomm1.DTREnable=true  和mscomm1.RTSEnable=true 即可”
        难道“现在只用三个”,“只需控制mscomm1.DTREnable=true scomm1.RTSEnable=true 即可”就能行???
         我说的:
        “你知道他的通讯用了几条线吗?”就是针对上面的这些说的:人家楼主都说了3针了,你还在吆喝什么只需控制什么什么即可,能吗?你没理解?我的中文一向不好?不过也够清楚了吧!?难道你是留学生?
         另:如果不嫌麻烦的话,嘿嘿,最好把25针的也列出来。我资料不在手头,刚好需要参好参考,感激不尽。
         
      

  30.   

    to startvb(共同学习):
        老大,要镇静,呵呵
      

  31.   

    to tangyang8061 你可真能装比,垃圾
      

  32.   

    MSComm1.Settings = "2400,N,8,1"  
    MSComm1.Settings = "2400,M,8,1"  '<-据说这样可以发出串行字节的第九个位,这九位的编码就是用来做地址的,单片有专门处理这个位的指令,你可以去看一下,这样做效果会比较好,但我也是听说的,没弄过,只好自己找资料啦,至少这样最多可以有256台单片机来通讯