1

我在通过我的 comport 发送字节时遇到问题。它发送一个奇偶校验位,尽管它被明确关闭(我需要没有奇偶校验的字节与某些硬件通信)。我的代码非常简单:

Process p = Runtime.getRuntime().exec("cmd.exe /c mode com1: baud=115200 parity=n data=8 stop=1 to=off xon=off rts=off dtr=off");
p.waitFor();
fp = new RandomAccessFile("COM1","rw");
fp.write((byte)0x21);

我将振荡器连接到端口,无论我做什么,都有一个额外的位,这似乎是一个奇偶校验位。但正如你所看到的,我通过代码禁用了奇偶校验,也通过我的设备管理器禁用了它。我在振荡器上看到的是:0 0010 0001 11(包括开始和停止位)。我不知道,这个奇偶校验或额外比特来自哪里......有人有想法吗?

4

2 回答 2

2

虽然从前该模式命令旨在像您一样使用并且确实有效,但我会非常怀疑微软在维护这种遗留支持方面付出了多少努力。我的第一步是打开命令提示符并运行

C:\>mode
C:\>rem The above command will display values to all configurable settings
C:\>mode com1: baud=115200 parity=n data=8 stop=1 to=off xon=off rts=off dtr=off
C:\>mode
C:\>rem Any visible changes compared to the first mode command?
C:\>echo U >> COM1
C:\>rem Check bits on oscilloscope

如果这不像预期的那样工作,那么我认为你应该放弃 mode 命令。如果一切正常,请验证模式设置不仅仅是运行模式命令的 shell 中的属性,例如,在更改了一些参数后,mode在不同的 shell 中运行以检查参数是否也在那里更改。

此外,根据Microsoft 的文档,参数的语法baud=...不是数字波特值,而是映射到给定波特率的两位数(例如baud=96-> 9600,请参阅文档中的表格)。该站点提到了另一种语法,MODE COM1:9600,N,8,1它更符合我记得使用的语法,您也可以尝试一下。

所有这些都失败了,您可以尝试使用 java 串行库。Rxtx是一个常用的,虽然不是每个人都喜欢它。这篇文章推荐 http://code.google.com/p/java-simple-serial-connector/而不是 rxtx。这篇文章提到 了http://code.google.com/p/jperipheral

于 2014-03-24T10:55:12.643 回答
0

好的,我找到了一个解决方案,但仍然不知道为什么它不起作用(我不打算这样做;))但是因为我想发送一个字节数组,所以无论如何它是更好的解决方案。如果我像这样使用 fp.write:

byte[] ba = {(byte)0xaa, (byte)0xaa};
fp.write(ba, 0, 2);

奇偶校验位没有附加......什么都没有。也许库本身在重载函数中附加了一个奇偶校验位,或者发生了其他奇怪的事情:/

于 2014-03-24T11:55:52.890 回答