禁用奇偶校验位串行通信不起作用



我有一个问题,通过我的端口发送字节。它发送一个奇偶校验位,尽管它被明确地关闭(我需要没有奇偶校验的字节来与一些硬件通信)。我的代码很简单:

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);

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

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

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命令。如果所有这些都有效,请验证模式设置不仅仅是运行mode命令的shell中的属性,例如,在更改一些参数后,在另一个shell中运行mode以检查参数是否也发生了更改。

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

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

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

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

奇偶校验位不附加…管它呢。也许库本身在重载函数中附加了奇偶校验位,或者发生了其他奇怪的事情:/

最新更新