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

Java 禁用串行通信的奇偶校验位不起作用,java,serial-port,parity,Java,Serial Port,Parity,我在通过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

我在通过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(包含启动和停止位)。我不知道,这个奇偶校验或额外的位是从哪里来的。。。有人有什么想法吗?

虽然“一个接一个”的模式命令本打算像您一样使用,但我非常怀疑微软在维护这种遗留支持方面付出了多少努力。我的第一步是打开命令提示符并运行

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
,以检查参数是否也已更改

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

如果所有这些都失败了,您可以尝试使用java串行库。虽然不是每个人都喜欢它,但它是一种常用的。推荐 在rxtx上。提及
.

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

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

奇偶校验位未连接。。。不管怎样。可能库本身在重载函数中附加了奇偶校验位,或者发生了其他奇怪的事情://

谢谢您的帮助,但我已经尝试了一些方法。我已经试过你提到的图书馆了,这是一个非常奇怪的图书馆;)。我在控制台和realterm上都试过了,一切都很好。这确实是java函数本身的一个问题(见上文)