调试的数据是由数控机床上发送的,程序为:
%
O1234
%
 
使用您提供的串口调试助手软件接收(以16进制形式)的数据为:
12 25 20 0A 0D 0D 4F 31 32 33 34 0A 0D 0D 25 14
使用我自己编写的程序接收为:
12 3F 20 A 3F D 3F 31 3F 33 3F A 3F D 3F 14 14
我自己编写的程序中有些正确的数据都变成了3F,请问是什么原因?
 
以下是我自己编写的程序代码:
COM1的通信参数为9600,E,7,2
使用二进制接收形式
Option Explicit
Dim bytInput() As Byte
Dim strData As StringPublic Function receivedata()  ‘数据接收显示函数(以16进制显示)
Dim i%
For i = 0 To UBound(bytInput)
  strData = strData & Hex(bytInput(i)) & " "
Next i
RichTextBox1.Text = RichTextBox1.Text & strData
strData = ""
bytInput = ""
End Function
 
 
Private Sub Command1_Click()  ’接收数据
Dim slen%
Dim tmp As Variant
slen = Comm1.InBufferCount
ReDim bytInput(slen)
tmp = Comm1.Input
bytInput = tmp
receivedata
End Sub
 
Private Sub Command2_Click()  ‘结束程序
Comm1.PortOpen = False
End
End Sub
 
Private Sub Form_Load()
Comm1.PortOpen = True
End Sub
 
希望能得到大家的帮助,谢谢了!

解决方案 »

  1.   

    发生了奇偶校验错误
    COM1的通信参数要求为
    9600,E,7,2 
    从你的代码看,你未对Comm1的Settings属性进行设置
    MSCOMM控件的Settings属性缺省设置为
    9600,N,8,1
    所以你的代码需修改:Private Sub Form_Load()
        Comm1.InputMode = comInputModeBinary '二进制接收
        Comm1.Settings = "9600,E,7,2" 
        Comm1.PortOpen = True 
    End Sub ParityReplace 属性
    当发生奇偶校验错误时,设置并返回替换数据流中一个非法字符的字符。
    语法
    object.ParityReplace [ = value]
    ParityReplace 属性语法包括下列部分:
    部分 描述 
    object 对象表达式,其值是“应用于”列表中的对象。 
    value 字符串表达式,表示一个字符,如说明中所描述。 
    说明
    parity bit 是指同一定数据位数一起传输的位,以提供简单的错误检查。当使用校验位时,MSComm 控件把在数据中已经设置的所有位(值为 1)都加起来并检查其和为奇数或偶数(根据当端口开时奇偶校验的设置)。
    按照缺省规定,MSComm 控件用问号 (?) 替换非法字符。若设置 ParityReplace 为一个空字符串 (""),则当奇偶校验错误出现时,字符替换无效。但 OnComm 事件仍然产生,并且设置 CommEvent 属性为 comEventRXParity。
    ParityReplace 字符被用语面向字节的操作,它必须是单字节字符。可指定 0 到 255 之间的 任何 ANSI 字符代码
      

  2.   

    zdingyun ,我在MSCOM控件的属性中已经设置了Settings属性为“9600,E,7,2”
    但为什么还会出现这样的问题呢?
      

  3.   

    串口调试助手软件接收的设置也是
    9600,E,7,2
    的话,你需检查通信线,也有可能受干扰。
    接收你未使用ONCOMM事件可能也是原因之一。
      

  4.   

    我也用ONCOMM事件触发编程试过的,也还是这个样子,而且出现3F的错误后再用
    串口调试助手接收数据的话,串口调试助手也会出错.除非把电脑重起,再用串口
    调试助手接收又正常的.请问是怎么回事?
      

  5.   

    更新:
    我在电脑上将串口2和3的引脚短接进行模拟,用了以下的代码,显示收到的结果和串口调试助手实际连接串口
    设备的结果是相同的,并没有出现16进制字符3F的错误,但是用我程序中的接收部分与实际设备连接后,接收
    的数据总是错误的,请大家帮忙看看!
    Option Explicit
    Dim bytInput() As Byte
    Dim bytOutput() As Byte
    Dim strData As String
    Dim counterreceive%
    Public Function receivedata()
    Dim i%
    For i = 0 To UBound(bytInput)
      strData = strData & Hex(bytInput(i)) & " "
    Next i
    RichTextBox1.Text = RichTextBox1.Text & strData
    strData = ""
    bytInput = ""
    End FunctionPrivate Sub Command4_Click()
    Dim slen%
    Dim outtemp As Variant
    slen = 28
    ReDim bytOutput(slen)
    bytOutput(0) = &H12
    bytOutput(1) = &H25
    bytOutput(2) = &H20
    bytOutput(3) = &HA
    bytOutput(4) = &HD
    bytOutput(5) = &HD
    bytOutput(6) = &H4F
    bytOutput(7) = &H31
    bytOutput(8) = &H32
    bytOutput(9) = &H33
    bytOutput(10) = &H34
    bytOutput(11) = &HA
    bytOutput(12) = &HD
    bytOutput(13) = &HD
    bytOutput(14) = &H4E
    bytOutput(15) = &H31
    bytOutput(16) = &H30
    bytOutput(17) = &H47
    bytOutput(18) = &H35
    bytOutput(19) = &H34
    bytOutput(20) = &H47
    bytOutput(21) = &H39
    bytOutput(22) = &H30
    bytOutput(23) = &HA
    bytOutput(24) = &HD
    bytOutput(25) = &HD
    bytOutput(26) = &H25
    bytOutput(27) = &H14
    outtemp = bytOutput
    Comm1.Output = outtemp
    End SubPrivate Sub Command5_Click()
    Dim slen%
    Dim tmp As Variantslen = Comm1.InBufferCount
    ReDim bytInput(slen)
    tmp = Comm1.Input
    bytInput = tmp
    receivedata
    End SubPrivate Sub Command6_Click()
    Comm1.PortOpen = False
    End
    End SubPrivate Sub Form_Load()
    Comm1.PortOpen = True
    End Sub