关于c# serialport接受数据怪现象 本帖最后由 h804759109 于 2013-11-27 11:53:09 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 情况如下所示:得到的数据: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字符啊 MODBUS也有两种传输方式,ASCII或者是RTU,不知道楼主是用的哪一种传输方式 你好 是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保存起来就可以 你好 是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保存起来就可以非常感谢你! 你好 是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保存起来就可以非常感谢你!结贴给分吧- -! MODBUS也有两种传输方式,ASCII或者是RTU,不知道楼主是用的哪一种传输方式 你好 是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这个方法的话? 为某一方法指定了过多的参数??? c# winform 动态快捷键设定 C# 中ppt 编程 调用ImageButton的Click事件 treeview 通过子节点获取父节点的方法 数据库读取数据并赋给一个arraylist 救命啊!文本操作搞不定。。。。。 关于活动目录的开发 如何让对话框停在屏幕中间 【求一个算法】不知道怎么称呼这种算法,感觉有点很复杂的样子 C# 学习写控件时一直没效果。。。 GDI+ 中发生一般性错误。
serialPort1.ReadExisting()是在编码的基础上读取 SerialPort 对象的流和输入缓冲区中所有立即可用的字节。 默认是使用ASCIIEncoding,这种编码方式仅支持0~0x7F之间的值,如果值超出7F,会编成3F,所以0x88he 0xB5变成了0x3F,“01 03 02 13 88 B5 12”是指16进制还是什么?如果是16进制,那使用serialPort1.ReadExixting()读出来的应该是对应的ASCII字符啊
实际上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保存起来就可以
实际上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保存起来就可以
非常感谢你!
实际上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保存起来就可以
非常感谢你!结贴给分吧- -!
实际上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这个方法的话?