将串口控件?是不是这样的?在VB开头定义这样两个常量
Const S = 0
Const M = 1
如果是的话,我在做上位机和多下位机通信的问题,然后有下面这段程序   If (hk(0) = addr(0)) Then
               MSComm1.Settings = "9600,S,8,1"
                  MSComm1.Output = command
                 MsgBox "握手成功"
                 Print S
        End If
这段程序是将数据发给下位机,但是我在下位机RB8中看到还始终是1,请问哪位高手帮帮忙!

解决方案 »

  1.   

    应该不会。MSComm 的 Settings 属性中,parity 设置如下:Setting Description 
    E Even 
    M Mark 
    N (Default) None 
    O Odd 
    S Space If you use MARK parity, then the bit after the data word is a logical 1. 
    If you use SPACE parity, then the bit after the data word is a logical 0.另外,我们向 MSComm 的 Settings 属性时传输的是一个字符串。你的常数 S,/M 已经后面的打印语句都没有意义。
      

  2.   

    对了,如果你是中途更改 Seetings 属性,需要先关闭串口,再设置,再打开,才会生效。会比较慢。不妨用 API 来控制。或者用 VC++ 写一个 DLL。我早先做 RS485 的时候,就是用 DLL 中的 API 来控制。快一些。
      

  3.   

    Private Sub Form_Load()
    Form1.ShowForm3.Hide
    Combo1.ListIndex = 0
    Combo2.ListIndex = 0
    MSComm1.InputMode = comInputModeBinary
    MSComm1.Settings = "9600,M,8,1"
    addr = Array(&H1, &H2)
    command(0) = &H0End Sub
    Private Sub MSComm1_OnComm()
     Select Case MSComm1.CommEvent
      
                Case comEvReceive   ' 收到 RThreshold # ofchars.
    xv:     Dim hk As Variant
            hk = MSComm1.Input
           
            If (hk(0) = addr(0)) Then
            MSComm1.PortOpen = False
             MSComm1.Settings = "9600,S,8,1"
            MSComm1.PortOpen = True
            MSComm1.Output = command
                     MsgBox "握手成功"
                     Print S
            End If
                    
            If hk(0) = &HFA Then '通道0的开始标志位
            z_start = True
            ovt = 0
            End If
            If hk(0) = &HFB Then '通道0的结束标志位
            z_start = False
        
            Text1.Text = in_data(1) & in_data(2) & "." & in_data(3)
            End If
            If z_start = True Then
            in_data(ovt) = hk(0)
            ovt = ovt + 1
            End If
    '第1通道数据接受与处理
            
            If hk(0) = &HFC Then '通道0的开始标志位
            t_z_start = True
            t_ovt = 0
            End If
            If hk(0) = &HFD Then '通道0的结束标志位
            t_z_start = False
            Text2.Text = t_in_data(1) & t_in_data(2) & "." & t_in_data(3)
            
            End If
            If t_z_start = True Then
            t_in_data(t_ovt) = hk(0)
            t_ovt = t_ovt + 1
            End If
         
     If MSComm1.InBufferCount <> 0 Then
         GoTo xv
     End If
      End Select我按照您说的方法试了还是不行,我是通过上位机发送命令给下位机采集温湿度数据,首先发送地址给下位机,下位机收到地址后回发地址给上位机表示应答,然后上位机收到地址后跟之前发的地址对比,若一样即If (hk(0) = addr(0)) 则发送采集温湿度的命令0x00,此时发送的的是数据,所以必须定义setting中奇偶校验位为0,我很特地用print S 打印出来确实是0,但是下位机接收的RB8位始终为1 ,下位机代码如下,请各位大侠帮忙分析分析
    void Serial_Int(void) interrupt 4 
                    
     {  
    RI=0;//接受到上位机传来的地址帧时RI会自动置1,所以先清零
    ES=0; //暂时不接受数据,建立一对一通信
    if(SBUF!=Local_addr)   
    ES=1; //若非本机地址,继续地址监听      第一步:接受主机发来的地址(SM2=1)
    else
      {        
    SM2=0;//取消地址监听,可以接受数据帧
    SBUF=Local_addr;//从机地址回发
    while(TI!=1); TI=0; //从机地址发出去  第二步:回发应答信号 while(RI!=0); RI=0;//因为前面已经将RI置0 
    /*对接受到的数据进行分析判断*/
    if(RB8==1) 
    { LED=0;SM2=1;ES=1;}//复位信号,恢复地址监听
    else
    {
    command=SBUF;//接受命令  第三步:接受主机发来采集温湿度信号的命令

    if(command==ReadTH)  


    send_data();
    } //发送的数据为6个字节,注意此时ES=0,所以对本中断不影响       
                                               //第四步:发送温湿度数据 SM2=1;ES=1;//恢复地址监听
    } }我在这里面定义了LED,但是LED就是亮...
      

  4.   


    串口中总是DCD、DSR变成红色,请问这是什么问题
      

  5.   

    1. even 每个字节传送整个过程中bit为1的个数是偶数个(校验位调整个数)2. odd 每个字节穿送整个过程中bit为1的个数是奇数个(校验位调整个数)3. noparity没有校验位4. space 校验位总为05.  校验位总为1