串口通信,接收问题,新手求指教!!!!! 串口通信C#Vs2010 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用List<byte>或byte[]+int自己算索引偏移不保证2次就能收到所有的数据,也有可能需要很多次,这跟你发送的数据量有关系如果很短,也有可能一次就收到你可以自定义起始符和结束符,这样就能知道到哪里就算收全了或者如果每次发送的是固定长度的,判断长度也可以如果是同步接收,也可以通过时间来判断,比如100ms都没有任何新的字节到达 就是起止符,一般如果你发送的是ASCII码,那么数据中就绝对不会出现类似0x02,0x0D这种东西一般都是将0x02作为起始符,0x0D作为结束符怎么拼接,你的字符串总要变成byte数组才能通过串口发送吧不要直接发送,而是循环赋值到一个新的byte数组中去,然后再发送或者发送之前,先发个02,发送结束,再发送个0D,都行 如果你要发送的内容中包含汉字,那么编码02和0d有可能被正常的数据使用你就需要自己定义起止符了比如ffff作为起始,0000作为结束 话说,串口发送文字消息,自己玩玩还可以,真正工业上,没有这么用的都是有固定的协议,比如固定长度,或者先发送后面总共的字节数,再发送数据或者即使是固定长度,也有起止符可能还要加上CRC校验或SUM校验来抗干扰,避免接收到错误的数据 发送以后加延时,延时药足够大 PDUscan.Sp.DiscardInBuffer(); PDUscan.Sp.DiscardOutBuffer(); byte[] bytes = setaddr(addnow, addnew); PDUscan.Sp.Write(bytes, 0, bytes.Length); System.Threading.Thread.Sleep(100); int len = PDUscan.Sp.BytesToRead; if (len != 8) { return false; } else { byte[] recievebyte = new byte[len]; PDUscan.Sp.Read(recievebyte, 0, len); if (recievebyte[4] == 0x01) { PDUscan.Sp.Close(); return true; } else { PDUscan.Sp.Close(); return false; } } 我的程序加延时后也没什么问题,去掉延时就不行了,请问这里为什么要加延??而且请问你的代码中recievebyte[4] == 0x01 是什么意思?? 串口通信是要有时间的,比如,我的接收信息是36个字节,我测试过,9600的波特率可能需要35ms左右,基本上延时个100ms就可以保证接收数据完整,计算机的反应速度是很快的,执行一个语句的速度可能非常快,来不及接收完整就会跳到下一句了 我这个代码是对法只在接收准确的信息后才会返回信息,我看楼主的情况可能和我的差不多我不确定事件的触发是接收到一个字节的同时就触发呢,还是其他的方法,ReceivedBytesThreshold这个属性我都没改过,按理来说是接收到一个字节的同时就触发事件。那它触发事件后,在执行事件的时候会不会有新的触发,如果有,而且当前事件还没执行完,那还触发吗? 我这个代码是对法只在接收准确的信息后才会返回信息,我看楼主的情况可能和我的差不多我不确定事件的触发是接收到一个字节的同时就触发呢,还是其他的方法,ReceivedBytesThreshold这个属性我都没改过,按理来说是接收到一个字节的同时就触发事件。那它触发事件后,在执行事件的时候会不会有新的触发,如果有,而且当前事件还没执行完,那还触发吗?没有过,可能需要清空接收区,在接到设置的字节数才会触发 放到数组里呗比如List<byte>,或byte[]都行 放到数组里呗比如List<byte>,或byte[]都行用ArragList LIST=new ArragList();为什么不行啊,因为我判断的是if(LIST[2]==0x69)调试提示object 和int不能。 Repeater嵌套UpdatePanel中的button事件 DataGridView 如何判断是否选择了某行 如何设置Tabpage宽度 提交后值没有写入数据库!!!!!急等 问题解决立马给分 小弟 刚接触c#这门语言 不知这门语言在以后就业中 那个方面会运用的最多 多广泛!望大神们赐教! 关于xml 排序 一问 请问高人,C#如何获取屏幕的物理尺寸. GdI+画图请问怎么画一个立体感的圆柱呢? c#.NET和RS22串口连接 如何不用DNS获取本机的IP地址? c#遍历treeview的问题,实在没辙了 C#如何实现操作系统多个账户间的切换
不保证2次就能收到所有的数据,也有可能需要很多次,这跟你发送的数据量有关系
如果很短,也有可能一次就收到你可以自定义起始符和结束符,这样就能知道到哪里就算收全了
或者如果每次发送的是固定长度的,判断长度也可以如果是同步接收,也可以通过时间来判断,比如100ms都没有任何新的字节到达
一般都是将0x02作为起始符,0x0D作为结束符怎么拼接,你的字符串总要变成byte数组才能通过串口发送吧
不要直接发送,而是循环赋值到一个新的byte数组中去,然后再发送
或者发送之前,先发个02,发送结束,再发送个0D,都行
你就需要自己定义起止符了
比如ffff作为起始,0000作为结束
都是有固定的协议,
比如固定长度,或者先发送后面总共的字节数,再发送数据
或者即使是固定长度,也有起止符
可能还要加上CRC校验或SUM校验来抗干扰,避免接收到错误的数据
PDUscan.Sp.DiscardInBuffer();
PDUscan.Sp.DiscardOutBuffer();
byte[] bytes = setaddr(addnow, addnew);
PDUscan.Sp.Write(bytes, 0, bytes.Length);
System.Threading.Thread.Sleep(100);
int len = PDUscan.Sp.BytesToRead;
if (len != 8)
{
return false;
}
else
{
byte[] recievebyte = new byte[len];
PDUscan.Sp.Read(recievebyte, 0, len);
if (recievebyte[4] == 0x01)
{
PDUscan.Sp.Close();
return true;
}
else
{
PDUscan.Sp.Close();
return false;
}
}
我的程序加延时后也没什么问题,去掉延时就不行了,请问这里为什么要加延??而且请问你的代码中recievebyte[4] == 0x01 是什么意思??
我这个代码是对法只在接收准确的信息后才会返回信息,我看楼主的情况可能和我的差不多我不确定事件的触发是接收到一个字节的同时就触发呢,还是其他的方法,ReceivedBytesThreshold这个属性我都没改过,按理来说是接收到一个字节的同时就触发事件。那它触发事件后,在执行事件的时候会不会有新的触发,如果有,而且当前事件还没执行完,那还触发吗?
我这个代码是对法只在接收准确的信息后才会返回信息,我看楼主的情况可能和我的差不多我不确定事件的触发是接收到一个字节的同时就触发呢,还是其他的方法,ReceivedBytesThreshold这个属性我都没改过,按理来说是接收到一个字节的同时就触发事件。那它触发事件后,在执行事件的时候会不会有新的触发,如果有,而且当前事件还没执行完,那还触发吗?没有过,可能需要清空接收区,在接到设置的字节数才会触发
比如List<byte>,或byte[]都行
比如List<byte>,或byte[]都行
用ArragList LIST=new ArragList();为什么不行啊,因为我判断的是if(LIST[2]==0x69)调试提示object 和int不能。