背景:使用RealPort软件创建的Windows Server 2003 R2,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(); 在SerialPort.Event.DATA_AVAILABLE情况下的while循环中 打印出整数c并将其强制转换为字符((char)c); 问题是数字和结果字符移位太高(范围是135 - 250) 消息都以“All Rights Reserved。”结尾,每条消息中的最后一个字符都相同。 但是,从角色到角色的转变并不一致。 尝试过其他编码: UTF8 / UTF-8将数字转移得更高。和ascii / us-ascii一样。 Cp1252将数字移动到130-350范围,除了3个字符,转移到65533,8222和8240。 注意:使用InputStreamReader.getEncoding()UTF8和UTF-8是UTF8,ascii和us-ascii是ASCII。
我应该尝试其他编码吗?其他人见过这种事吗?
答案 0 :(得分:1)
我做的几乎完全相同。 9600波特,8N1(8个数据位,无奇偶校验,1个停止位),我们对字符移位没有任何问题。我们甚至没有在任何地方设置编码。
我们的输入流只是InputStream类型,它是用serialPort.getInputStream()设置的;
尝试从InputStreamReader退回,只使用普通的“InputStream”。编码应该自行处理。
希望在某种程度上有所帮助,
- gMale
答案 1 :(得分:0)
有两个有线服务端口。我发布的一篇文章被证明是TCP到串行设备中称为Digi的硬件配置之间的冲突。通过将COM5串行设置更改为9600,7,1,0,0,我能够解决该端口上的问题。值的移位是由于使用8个数据位而不是7.这当然意味着我必须更改代码中的端口参数以匹配。你的读者是不必要的,但是它确实帮助我通过观察转换随编码的变化来达到解决方案,直到我意识到更少的数据位也会产生相同的效果。
现在我正在寻找第二个端口上的魔力。
第二个端口设置为1200,8,1,0,0,使用9600导致流大多数为0,有128个。