用于串行通信的 VB6 应用程序与 Java 8u60

Posted

技术标签:

【中文标题】用于串行通信的 VB6 应用程序与 Java 8u60【英文标题】:VB6 application vs Java 8u60 for Serial Communication 【发布时间】:2015-10-15 07:47:24 【问题描述】:

我正在编写一个 Java 应用程序来替换一个 VB6 应用程序。应用程序必须使用 10 字节二进制协议轮询远程系统,响应也是一个 10 字节二进制消息,其中最后一个字节是通过对所有先前字节求和计算得出的校验和。

我遇到的问题是校验和不匹配的 Java 应用程序中的大量错误。

结果是可重复的。 VB6 应用程序几乎没有错误,但是 Java 应用程序有很多错误。我检查了端口设置,它们是相同的 19200,n,8,1。

在VB6中端口设置串口设置如下:

    CDTimeout = 0
    CommPort = 1
    CTSTimeout = 0
    DSRTimeout = 0
    DTREnable = False
    EOFEnable = False
    Handshaking = None
    InBufferCount = 0
    InBufferSize = 1024
    Index = 0
    InputLen = 0
    InputMode = comInputModeBinary
    Interval = 1000
    Name = "comInterfaceUnit"
    NullDiscard = False
    OutBufferSize = 512
    ParityReplace = "?"
    RThreshold = 10
    RTSEnable = False
    Settings = "19200,n,8,1"
    SThreshold = 0
    Tag = ""

javax.comm SerialPort 设置如下:

    baudrate = 19200
    closed = false
    databits = 8
    dtr = false
    flowcontrol = 0
    framing = false
    framingByte = 0
    framingByteReceived = false
    name = "COM1"
    nativeHandle = 324295048
    notifyMask = 1
    parity = 0
    rcvThreshold = -1
    rcvTimeout = -1
    rts = true
    startBI = false
    stateCD = false
    stateCTS = false
    stateDSR = false
    stateFE = false
    stateOE = false
    statePE = false
    stateRI = false
    stopBits = 1

在 VB6 中,事件处理程序只是将接收到的字节复制到一个字节数组中,这正是 Java 代码通过 SerialEvent 执行的操作。

Java 校验和计算:

int intChecksumInPkt = (int)(arychrMsg[RESPONSE_LENGTH -1] & 0xff) ,intCalcChecksum = 0; 
for( int b=0; b<RESPONSE_LENGTH -1; b++ )  
    intCalcChecksum += (int)(arychrMsg[b] & 0xff); 
 
intCalcChecksum &= 0xff; 
if ( intCalcChecksum == intChecksumInPkt )  ... 

VB6 校验码:

intSum = 0
For intI = gintInterfaceUnitReplyStatusOffset To gintInterfaceUnitReplyData8Offset
    intSum = intSum + CInt(gbytInterfaceUnitReplyArray(gintCommPortIndex, intI))
Next intI
If gbytInterfaceUnitReplyArray(gintCommPortIndex, gintInterfaceUnitReplyChecksumOffset) = CByte(intSum And &HFF) Then
    ' Match, so a 'good' message.
    blnFunctionValue = True
End If

【问题讨论】:

我怀疑其他地方的错误。您可以添加校验和计算方法吗?并且接收部分也...... 校验和很简单,从包的第一个字节开始,求和到包的最后一个字节,不包括包的最后一个字节的校验和。 简单,但在“翻译”为 java 时有很多错误空间。但是我不想在没有看到实际使用的代码的情况下进行推测。经常有选角问题。去过那里,做到了——发疯了,学到了一些东西。我首先会这样做:检查发送的相同数据是否会导致在 VB6 和 Java 解决方案上接收到相同的数据。然后(其次)真正在调试器中逐步完成并检查两个总和何时开始彼此不同。 我同意,java中的校验和: int intChecksumInPkt = (int)(arychrMsg[RESPONSE_LENGTH -1] & 0xff) ,intCalcChecksum = 0; for( int b=0; b 好吧,我不知道在 VB6 中溢出是如何处理的……但我猜你在 intCalcChecksum 中有一个溢出(值 > 255)。然后您只需将其切断&amp; 0xff。我猜 VB6 以不同的方式处理这个问题,或者至少是计算的 VB6 实现。 【参考方案1】:

实际的问题是我没有调用“enableReceiveThreshold”。

现在工作。

【讨论】:

以上是关于用于串行通信的 VB6 应用程序与 Java 8u60的主要内容,如果未能解决你的问题,请参考以下文章

用于串行通信的 Python 字节数组

c# app与vb6 app通信

使用 VSPE 的 WPF 中的串行端口通信问题

通过 IOCP 进行串行通信

PortInUseException - Java串行通信

Java串口通信