1.请问如何利用电脑串口接受电路开关信号?
(就是将一个开关接在串口上,开合和关闭时软件系统能接收到信号并做出相应处理,另:串口有9根线,要怎么接?)2.请问如何利用电脑串口发送电路开关信号?
(就是将一个小灯泡接在串口上,通过软件系统的运行能控制灯泡的亮与灭,另:串口有9根线,要怎么接?)求大虾帮手,搞不定就要卷铺盖了,555555555555555555555555555555555分不是问题,我能给多少都愿意,只要能帮我搞定,多谢各位了!!!!!

解决方案 »

  1.   

    1)我觉得你这个问题主要是电路设计的问题,如果你能用一个小的单片机,如89C2051(还有更小的),价格也很便宜,5、6块吧,通过单片机查询电路开关量的变化,然后用单片机自带串口或者模拟一个串口发送,然后剩下的就是通讯问题了,这就很简单了。2)如果不想用单片机,那么用一个74系列的并转串的片子,将开关量送到片子,转成串行量,然后接到电脑的RXD(因为你的应该是只读就好,所以232似乎只需要接RXD、GND),可能也可以,不过在速率等等上需要调试,软件设置校验位、数据位也要根据情况试验设置。3)可能可行的办法,就是利用DSR或CTS或RTS这类的信号线处理,即电路拉高或拉低该线,然后用mscomm1.dsrholding 属性的读变化来判断状态,这个处理是只读的,就是只解决了你的问题1)
    至于控制,mscomm1发送的是串行信号,还是需要串并转换问题,这个回到2)或1)上了,所以……附:9针接法:一般232只接3线(235,注意交叉) 458 2线(23,并连) 
    1 数据载波检测 DCD
    2 接收数据 RXD
    3 发送数据 TXD
    4 数据终端准备 DTR
    5 信号地 GND
    6 数据设备准备好 DSR
    7 请求发送 RTS
    8 清除发送 CTS
    9 振铃指示 DELL
     
      

  2.   

    第一问简单,我写过一个类似的软件,用串口接一个按钮,用户按下按钮,程序就做一个采图动作:
    1.接线是串口2和3号线接开关。
    2.实现方法,因为2和3脚分别是发送和接收端(不去考虑哪个发哪个收了),程序每隔0.2秒发送一个数据,我选择发 "T",只要OnComm()事件接受到数据"T"即判定用户按下了按钮,执行相应语句.第二问实现复杂点,需要一个数模转换电路,将数字信号转换成模拟信号,通过放大电路驱动灯泡发亮.
      

  3.   

    @hanstins(无) :  采用单片机是否是最佳的选择?
      

  4.   

    @Athoncj(阿龙) 
      你说的方法我试了,好像不行,能不能给你以前的代码参考一下,谢谢!!
      

  5.   

    串口不行的,用打印口(并口)就很简单。如果用串口,就必须有一个单片机外设来处理开关和灯电路。打印口:
    有 8 个输出引脚
    bit Pin    名称
    0    Pin2 D0 
    1    Pin3 D1 
    2    Pin4 D2 
    3    Pin5 D3 
    4    Pin6 D4 
    5    Pin7 D5 
    6    Pin8 D6 
    7    Pin9 D7 5 个输入引脚
    bit Pin    名称
    3    Pin15 nError(nFault) 
    4    Pin13 Select 
    5    Pin12 PaperEnd 
    6    Pin10 nAck 
    7    Pin11 Busy 下载一个 WinIO.DLL 动态链接库,照例子编程很容易。
      

  6.   

    下载链接:
    例子:http://www.vckbase.com/code/downcode.asp?id=2548
    库:http://www.vckbase.com/tools/downtools.asp?id=134
      

  7.   

    串口1脚是“载波检测”,它能根据DCD线的电平变化作出反应,
    转载一篇水木清华的文章
    用普通UPS实现停电监测 Chen Dong [本站会员]                                             我们单位使用的服务器是一台LINUX服务器,由于经费有限,无法购买昂贵的在线式UPS.而只是
    购买了一台APC BACK 500(RMB 500). 在外电源切断时,其说明书称可以维持电源供应约15分钟。
    如果在15分钟内无法来电,而该服务器又无法正常关闭,轻则丢失数据,重则导致系统崩溃,无
    法启动。这是我们所不希望出现的情况。
    为解决上述问题,我们考虑了用廉价的UPS开发自己适用的UPS系统,该系统的唯一要求是:
    在停电时自动关闭计算机,确保系统的安全。要解决上述问题,必须解决两个关键性的技术问题:
    1)硬件上如何检测停电,并将停电信号传给计算机?
    2)在Linux 系统中如何用守护程序来完成对停电信号的响应,自动关闭计算机?我们知道,在计算机的串行口中有一些输入/输出脚,例如,DCD(载波检测)(25针8脚,
    9针1脚)。我们的基本思路是通过DCD脚信号的变化来检测是否停电。具体做法如下:
    从市面上采购一个6V-12V/100mA-500mA的稳压电源作为停电检测传感器,把其输出的电压调整到
    9V,在其输出的线缆上串接一个3K的电阻(阻抗匹配用)后与一串口线的DCD脚相连接,其地线
    与串口的数字地(25针7脚,9针5脚)相连接。将该稳压电源与UPS输入端接在同一个接线板上,
    平时正常供电时,DCD脚的电平将也为高(9V),而一旦停电时,DCD脚的电平将发生变化,通过
    检测这种变化,我们就可以实现停电自动关机。电路连结示意图如下:        PC< --->UPS<--->POWER
             |                |
             |<-- 稳压电源<---|
                   
                   
    Linux 下停电监测守护程序power.c如下:
            #include〈sys/ioctl.h>
            #include〈fcntl.h>
            int main(int argc, char *argv[])
            {
                    int fd;
                    int flags;
                    /*打开串行口*/
                    if((fd=open(argv[1],O_RDWR |O_NDELAY))<0)
                    {
                      printf("usage: power /dev/cua0 or power /dev/cua1\n");
                      exit(1);
                    }
                    /*两次调用fork()&setsid()系统调用,使程序成为守护进程*/
                    if(fork()) exit(0);
                    if(setsid()==-1) exit(1);
                    if(fork()) exit(0);
                    if(setsid()==-1) exit(1);
                    for(;;)
                    {
                     ioctl(fd,TIOCMGET, &flags);/*从串行口读入DCD信号*/
                     flags=flags & 0x0040;
                             if(flags == 0)/*检测flags低字节的第7位如果不为1,则关机*/
                     system("/sbin/shutdown -h now");
                             sleep(300);/*每5分钟检测一次*/
                            }
            }在Linux系统中执行如下命令序列:gcc  power.c -o power
    mv power /sbin/.vi /etc/rc.local 在rc.local中加入 :
    power /dev/cua0 (com1作监测口) 或 
    power /dev/cua1(com2作监测口)重新启动计算机,即启动了该守护程序。该系统投入使用后经多次停电的检验均正常工作,保证了服务器的安全。[注]:本系统参考了:
    《用普通UPS实现计算机停电自动关机》,严军勇,《电脑爱好者》1999年17期
            并加以改进。在此对严军勇先生表示感谢。 
      
    中国Linux论坛 版权所有  --------------------------------------------------------------------------------
    Copyright 1999,2000 China Linux Forum--※ 来源:·BBS 水木清华站 smth.edu.cn·[FROM: 202.112.26.39]
      

  8.   

    楼上很有启发。
    收回我上面说的串口不能做这个应用需求的话。可以将 DCD(第8脚)连接到开关一端,开关另一端连接 5 — 15V Vcc。
    将 RTS(第4脚)连接到灯,灯的另一端接地。注意灯的负载电流不要超过 500 毫安(可以用 LED 串电阻)。用一个 msComm 控件,正常打开。Private Sub Timer1_Timer()
        msComm1.RTSEnable =  msComm1.CDHolding
    End SubCDHolding 属性设计时无效,请编译后执行。
    注意不要捕获 msComm comEventCDTO 错误事件,因为当 Carrier Detect 线为高电平 (CDHolding = True) 且超时时,MSComm 控件设置CommEvent 属性为 comEventCDTO(Carrier Detect 超时错误),并产生 OnComm 事件。
      

  9.   


      
     Dim XH As Long Private Sub Form_Load()
    On Error Resume Next
     If App.PrevInstance Then End
        Timer1.Interval = 150
        Timer2.Interval = 1500
        
        
        MSComm1.CommPort = 1
        MSComm1.Settings = "9600,n,8,1"
        MSComm1.RThreshold = 1
        If MSComm1.PortOpen Then MSComm1.PortOpen = False
            MSComm1.PortOpen = True
            MSComm1.InputMode = comInputModeBinary
            MSComm1.InBufferCount = 0 '清除发送缓冲区数据
            MSComm1.OutBufferCount = 0 '清除接收缓冲区数据
             
         Timer1.Enabled = True
         Timer2.Enabled = False
    End SubPrivate Sub Form_Resize()    If Me.WindowState = 2 Or Me.WindowState = 1 Then Me.HideEnd SubPrivate Sub MSComm1_OnComm()
        XH = XH + 1
        Label1.BackColor = &HFF&
        Label1.Caption = XH
        Timer1.Enabled = 0 '停止1秒发送数据(防抖)
        
        SendKeys "{F6}" '发送热键或进入处理程序
        
        Timer2.Enabled = 1
    End SubPrivate Sub Timer1_Timer()
        Label1.BackColor = &H8000000F
        MSComm1.InputMode = 0
        MSComm1.Output = "T"
    End SubPrivate Sub Timer2_Timer()
        Timer1.Enabled = 1
        Timer2.Enabled = 0
    End Sub
      

  10.   

    @of123() 
      你给的例子是VC++的,我不懂,有没有VB的?谢谢!!!!
      我尽快照你说的去试,有的元件要去买,不过我还是不懂怎么判断开关的状态,怎么让灯亮?如果可以,写些简单的代码给我好吗?谢谢你了@mzguanglin(逍遥王子)
      谢谢你的文章@yjukh(小虫) 
      如果可以请邮给我,谢谢!!! [email protected]@Athoncj(阿龙)
      你的这段代码,针脚要如何接?
      

  11.   

    @Athoncj(阿龙)
      对不起,刚才没注意是你。
      我试了你给的代码,好像不行,开关关闭和开启都接收不到“T”
      我是用RXD\TXD两条线接开关的,问题出在哪?
      

  12.   


    这个程序是在实用的,肯定没问题的,要不把源程序给你,其实也就这么多代码。
    端口号对吗?或把发送数据改成1试试。 
    MSComm1.Output = "1"
      

  13.   

    @Athoncj(阿龙)
      邮件还没收到。
      

  14.   

    @Athoncj(阿龙)
      你的方法测试成功了,谢谢!!!现在在等第2个问题的解决。
      

  15.   

    一大群人回答的都是让用户修改自己的问题,莫名其妙!
    RS232串口完全可以不依赖外部设备做数字输入输出;
    先看输出: 串口中的两个脚位可以由程序来控制状态,分别是DTR和RTS,这两只脚位被用来做握手
              都是由计算机来控制的,这当然就是一种数字输出了.突然有事,回头再继续啊,:)
      

  16.   

    @zzmwz(zzmwz)
    你说的是怎么弄?详细说一下好吗?谢谢
      

  17.   

    of123说的第二个方法应该是可行的,你可以通过更改RTSEnable来实现开关量的输出
      

  18.   

    @davysnet(随风)
      谢谢,我已经有研华公司联系了!!!