用于串行通信的 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& 0xff
。我猜 VB6 以不同的方式处理这个问题,或者至少是计算的 VB6 实现。
【参考方案1】:
实际的问题是我没有调用“enableReceiveThreshold”。
现在工作。
【讨论】:
以上是关于用于串行通信的 VB6 应用程序与 Java 8u60的主要内容,如果未能解决你的问题,请参考以下文章