0

背景:Windows Server 2003 R2,使用RealPort软件创建的Wire Service虚拟串口,串口配置为COM5,9600波特,8个数据位,无奇偶校验位,1个停止位,无流控,使用RXTX 2.1-7。

找到端口 COM5,使用 portId.open 方法创建串行端口,并设置端口参数和流控制以匹配上面的设备驱动程序设置。我得到了 serialPort IntupStream 并将其包装在 InputStreamReader 中,这样我就可以控制输入编码。默认编码当然是 Cp1252 我读过,如果您使用 8 个数据位,则编码应该是 ISO-8859-1 aka Latin1。并且正在使用 InputStreamReader 方法: int c = isr.read(); 在 while 循环中 SerialPort.Event.DATA_AVAILABLE 打印出整数 c 并将其转换为字符 ((char)c); 问题是数字和生成的字符移动得太高(范围是 135 - 250) 消息都以“保留所有权利。)”结尾,并且每条消息中的最后一个字符都是相同的。然而,从一个角色到另一个角色的转变并不一致。尝试过其他编码:UTF8/UTF-8 将数字移得更高。ascii/us-ascii 也是如此。Cp1252 将数字移至 130 - 350 范围,但 3 个字符移至 65533、8222 和 8240。注意:使用 InputStreamReader.getEncoding() 时,UTF8 和 UTF-8 是 UTF8,ascii 和 us-ascii 是 ASCII。

我应该尝试其他编码吗?还有人见过这种东西吗?

4

2 回答 2

1

我正在做几乎完全相同的事情。9600 波特,8N1(8 个数据位,无奇偶校验,1 个停止位),字符移位没有问题。我们甚至没有在任何地方设置编码。

我们的输入流只是 InputStream 类型,它是用 serialPort.getInputStream(); 设置的。

尝试从 InputStreamReader 退后一步,只使用普通的“InputStream”。编码应该自行处理。

希望在某种程度上有所帮助,

--gMale

于 2010-07-19T20:57:50.010 回答
0

有两个有线服务端口。我发布的一个结果是 TCP 到串行设备(称为 Digi)中的硬件配置之间的冲突。通过将 COM5 串行设置更改为 9600,7,1,0,0,我能够解决该端口上的问题。值的移动是由于使用 8 个数据位而不是 7 个。这当然意味着我必须更改代码中的端口参数以匹配。你的正确之处在于阅读器是不必要的,但它确实通过观察编码的移位变化帮助我找到了解决方案,直到我意识到更少的数据位也会产生相同的效果。

现在我正在寻找第二个端口的魔法。

第二个端口设置是 1200,8,1,0,0 使用 9600 导致流大部分是 0 和一些 128。

于 2010-07-20T13:52:32.773 回答