如何使用 Java 应用程序通过 Windows 串行端口发送任意字节?

发布于 2024-12-07 21:54:45 字数 2439 浏览 2 评论 0原文

我正在尝试在 Windows 中使用 Java 通过串行 COM 端口发送任意二进制数据。在发送数据之前,它(Java 或 Windows)似乎对数据进行了一些映射。我对 Windows COM 接口不是很熟悉,所以我希望有一个 ioctl-esq 设置来关闭此行为,并且 Windows 开发人员“只需知道”如何处理此问题。

当我发送值为 0-255 的二进制字节数组时,我在另一端得到以下信息:

                                                        0x00
0x01    0x02    0x03    0x04    0x05    0x06    0x07    0x08
0x09    0x0a    0x0b    0x0c    0x0d    0x0e    0x0f    0x10
0x11    0x12    0x13    0x14    0x15    0x16    0x17    0x18
0x19    0x1a    0x1b    0x1c    0x1d    0x1e    0x1f    0x20
0x21    0x22    0x23    0x24    0x25    0x26    0x27    0x28
0x29    0x2a    0x2b    0x2c    0x2d    0x2e    0x2f    0x30
0x31    0x32    0x33    0x34    0x35    0x36    0x37    0x38
0x39    0x3a    0x3b    0x3c    0x3d    0x3e    0x3f    0x40
0x41    0x42    0x43    0x44    0x45    0x46    0x47    0x48
0x49    0x4a    0x4b    0x4c    0x4d    0x4e    0x4f    0x50
0x51    0x52    0x53    0x54    0x55    0x56    0x57    0x58
0x59    0x5a    0x5b    0x5c    0x5d    0x5e    0x5f    0x60
0x61    0x62    0x63    0x64    0x65    0x66    0x67    0x68
0x69    0x6a    0x6b    0x6c    0x6d    0x6e    0x6f    0x70
0x71    0x72    0x73    0x74    0x75    0x76    0x77    0x78
0x79    0x7a    0x7b    0x7c    0x7d    0x7e    0x7f    0x3f
0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f
0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f
0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f
0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0xa0
0xa1    0xa2    0xa3    0xa4    0xa5    0xa6    0xa7    0xa8
0xa9    0xaa    0xab    0xac    0xad    0xae    0xaf    0xb0
0xb1    0xb2    0xb3    0xb4    0xb5    0xb6    0xb7    0xb8
0xb9    0xba    0xbb    0xbc    0xbd    0xbe    0xbf    0xc0
0xc1    0xc2    0xc3    0xc4    0xc5    0xc6    0xc7    0xc8
0xc9    0xca    0xcb    0xcc    0xcd    0xce    0xcf    0xd0
0xd1    0xd2    0xd3    0xd4    0xd5    0xd6    0xd7    0xd8
0xd9    0xda    0xdb    0xdc    0xdd    0xde    0xdf    0xe0
0xe1    0xe2    0xe3    0xe4    0xe5    0xe6    0xe7    0xe8
0xe9    0xea    0xeb    0xec    0xed    0xee    0xef    0xf0
0xf1    0xf2    0xf3    0xf4    0xf5    0xf6    0xf7    0xf8
0xf9    0xfa    0xfb    0xfc    0xfd    0xfe    0xff    

请注意,当字节从 0x80-0x9f 变化时,值切换到 0x3f。

抱歉缺少详细信息,但我正在处理一个闭源(商业)Java 库,并且我遇到了一个可能与操作系统或 Java 相关的奇怪问题。此外,图书馆的支持代表并不认为图书馆有问题。

注意:我确实了解 Java 的仅签名字节,因此在操作它们时我会很小心,尽管相关库可能会搞乱它们。

I am trying to send arbitrary binary data across a serial COM port using Java in Windows. There seems to be some mapping that it (Java or Windows) is doing on the data before sending it out. I am not very familiar with the Windows COM interface so my hope is that there is an ioctl-esq setting to turn off this behaviour and that Windows developers 'Just know' how to deal with this.

When I send an array of binary bytes with values 0-255 I get the following on the other end:

                                                        0x00
0x01    0x02    0x03    0x04    0x05    0x06    0x07    0x08
0x09    0x0a    0x0b    0x0c    0x0d    0x0e    0x0f    0x10
0x11    0x12    0x13    0x14    0x15    0x16    0x17    0x18
0x19    0x1a    0x1b    0x1c    0x1d    0x1e    0x1f    0x20
0x21    0x22    0x23    0x24    0x25    0x26    0x27    0x28
0x29    0x2a    0x2b    0x2c    0x2d    0x2e    0x2f    0x30
0x31    0x32    0x33    0x34    0x35    0x36    0x37    0x38
0x39    0x3a    0x3b    0x3c    0x3d    0x3e    0x3f    0x40
0x41    0x42    0x43    0x44    0x45    0x46    0x47    0x48
0x49    0x4a    0x4b    0x4c    0x4d    0x4e    0x4f    0x50
0x51    0x52    0x53    0x54    0x55    0x56    0x57    0x58
0x59    0x5a    0x5b    0x5c    0x5d    0x5e    0x5f    0x60
0x61    0x62    0x63    0x64    0x65    0x66    0x67    0x68
0x69    0x6a    0x6b    0x6c    0x6d    0x6e    0x6f    0x70
0x71    0x72    0x73    0x74    0x75    0x76    0x77    0x78
0x79    0x7a    0x7b    0x7c    0x7d    0x7e    0x7f    0x3f
0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f
0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f
0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f
0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0x3f    0xa0
0xa1    0xa2    0xa3    0xa4    0xa5    0xa6    0xa7    0xa8
0xa9    0xaa    0xab    0xac    0xad    0xae    0xaf    0xb0
0xb1    0xb2    0xb3    0xb4    0xb5    0xb6    0xb7    0xb8
0xb9    0xba    0xbb    0xbc    0xbd    0xbe    0xbf    0xc0
0xc1    0xc2    0xc3    0xc4    0xc5    0xc6    0xc7    0xc8
0xc9    0xca    0xcb    0xcc    0xcd    0xce    0xcf    0xd0
0xd1    0xd2    0xd3    0xd4    0xd5    0xd6    0xd7    0xd8
0xd9    0xda    0xdb    0xdc    0xdd    0xde    0xdf    0xe0
0xe1    0xe2    0xe3    0xe4    0xe5    0xe6    0xe7    0xe8
0xe9    0xea    0xeb    0xec    0xed    0xee    0xef    0xf0
0xf1    0xf2    0xf3    0xf4    0xf5    0xf6    0xf7    0xf8
0xf9    0xfa    0xfb    0xfc    0xfd    0xfe    0xff    

Note that the values switch to 0x3f when the bytes go from 0x80-0x9f.

Sorry for lack of details, but I am dealing with a closed source (commercial) Java library here and I am having a weird issue that may be OS or Java related. Also, the support rep for the library does not think the library is at fault.

Note: I do know about Java's signed only bytes so I am careful when operating on them although the library in question may be mucking them up.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

秋意浓 2024-12-14 21:54:45

问题在于字符串对我要附加的数据进行编码的方式。我天真地认为我可以将任意数据附加到字符串中,然后对其调用 getBytes() 来获取 byte[] 数组。事实证明,字符串正在对附加数据进行编码,并且输出的字节与字节结尾不匹配。

感谢您的有用评论。

The problem was the way that the String was encoding the data that I was appending. I naively assumed that I could append arbitrary data to a string and then call getBytes() on it to get a byte[] array. It turns out that the String was encoding the appended data and the bytes out didn't match the bytes end.

Thanks for the helpful comments.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文