本帖最后由 h804759109 于 2013-11-27 11:53:09 编辑

解决方案 »

  1.   

    情况如下所示:得到的数据:01 03 02 13 88 B5 12得到的是:01 03 02 13 3f 3f 12接收到的数据本来就是字符串吗?还是16进制的数?
    serialPort1.ReadExisting()是在编码的基础上读取 SerialPort 对象的流和输入缓冲区中所有立即可用的字节。 默认是使用ASCIIEncoding,这种编码方式仅支持0~0x7F之间的值,如果值超出7F,会编成3F,所以0x88he 0xB5变成了0x3F,“01 03 02 13 88 B5 12”是指16进制还是什么?如果是16进制,那使用serialPort1.ReadExixting()读出来的应该是对应的ASCII字符啊
      

  2.   

    MODBUS也有两种传输方式,ASCII或者是RTU,不知道楼主是用的哪一种传输方式
      

  3.   

    你好 是rtu如果MODBUS采用RTU方式传输了 01 03 02 13 88 B5 12,那就好解释了,
    实际上datareceive = serialPort1.ReadExisting();读到的是这些值对应的ASCII码字符,而88和B5由于超出了7F,实际上对应的是'?',即0x3F。对应的是ASCII字符,后来又通过char字符数组转换成short之类的楼主这样做好费周章将16进制通过ASCIIEncoding接收,又再转成16进制,不如直接就按照16进制来接收,也省的用char字符数组进行转换了。
    这样做:
    int len=serialPort1.BytesToRead();
    byte[] buffer=new byte[len];
    serialPort1.Read(buffer,0,len);//这样就可以原封不动的接收到 01 03 02 13 88 B5 12,将buffer保存起来就可以
      

  4.   

    你好 是rtu如果MODBUS采用RTU方式传输了 01 03 02 13 88 B5 12,那就好解释了,
    实际上datareceive = serialPort1.ReadExisting();读到的是这些值对应的ASCII码字符,而88和B5由于超出了7F,实际上对应的是'?',即0x3F。对应的是ASCII字符,后来又通过char字符数组转换成short之类的楼主这样做好费周章将16进制通过ASCIIEncoding接收,又再转成16进制,不如直接就按照16进制来接收,也省的用char字符数组进行转换了。
    这样做:
    int len=serialPort1.BytesToRead();
    byte[] buffer=new byte[len];
    serialPort1.Read(buffer,0,len);//这样就可以原封不动的接收到 01 03 02 13 88 B5 12,将buffer保存起来就可以
    非常感谢你!
      

  5.   

    你好 是rtu如果MODBUS采用RTU方式传输了 01 03 02 13 88 B5 12,那就好解释了,
    实际上datareceive = serialPort1.ReadExisting();读到的是这些值对应的ASCII码字符,而88和B5由于超出了7F,实际上对应的是'?',即0x3F。对应的是ASCII字符,后来又通过char字符数组转换成short之类的楼主这样做好费周章将16进制通过ASCIIEncoding接收,又再转成16进制,不如直接就按照16进制来接收,也省的用char字符数组进行转换了。
    这样做:
    int len=serialPort1.BytesToRead();
    byte[] buffer=new byte[len];
    serialPort1.Read(buffer,0,len);//这样就可以原封不动的接收到 01 03 02 13 88 B5 12,将buffer保存起来就可以
    非常感谢你!结贴给分吧- -!
      

  6.   

    MODBUS也有两种传输方式,ASCII或者是RTU,不知道楼主是用的哪一种传输方式
      

  7.   

    你好 是rtu如果MODBUS采用RTU方式传输了 01 03 02 13 88 B5 12,那就好解释了,
    实际上datareceive = serialPort1.ReadExisting();读到的是这些值对应的ASCII码字符,而88和B5由于超出了7F,实际上对应的是'?',即0x3F。对应的是ASCII字符,后来又通过char字符数组转换成short之类的楼主这样做好费周章将16进制通过ASCIIEncoding接收,又再转成16进制,不如直接就按照16进制来接收,也省的用char字符数组进行转换了。
    这样做:
    int len=serialPort1.BytesToRead();
    byte[] buffer=new byte[len];
    serialPort1.Read(buffer,0,len);//这样就可以原封不动的接收到 01 03 02 13 88 B5 12,将buffer保存起来就可以
    非常感谢你!结贴给分吧- -!
    纳雍readexisting方法读数据,只要遇到数据大于7F的就出错了,有什么方法解决吗?我的意思是一定要用readexisting这个方法的话?