【问题标题】:Disable Parity Bit for serial Communication does not work禁用串行通信的奇偶校验位不起作用
【发布时间】:2014-05-01 14:26:46
【问题描述】:

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

【问题讨论】:

    标签: java serial-port parity


    【解决方案1】:

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

    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 中的属性,例如更改一些参数后,在不同的 shell 中运行 mode 以检查那里的参数是否也更改了。

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

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

    【讨论】:

    • 感谢您的帮助,但我已经尝试了一些方法。我已经尝试过你提到的图书馆,它是一个超级奇怪的图书馆;)。我已经在控制台和 realterm 上尝试过,一切正常。这确实是 java 函数本身的问题(见上文)
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-10
      • 1970-01-01
      • 2015-12-03
      • 2015-06-29
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多