为啥 串口通信 分多次stm32串口接收数据据

用SerialPort类做串口通信,为什么发送一次数据有时接收方要收两次?
用SerialPort类做串口通信,为什么发送一次数据有时接收方要收两次?
/csharp/1490054.html& &用SerialPort类做的一个串口通信的测试程序,添加了DataReceived事件处理方法,用两台机器串口直接对联发送数据,发送方在发送多于8个字节的数据时,接收方有时要分两次收,而且每次第一次收都是8个字节,这是为什么?接收发送时都做了数据转换,发送时将string转换为byte数据发送,接收方也以byte类型接收,再转换成string类型显示,如果不转换发送中文时出错!
解决方案 ?
检查一下Rthreshold属性和inbuffersize属性
对呀,我虽然不是做的串口通信,我做的是socket通信,跟你你样的问题,不过我是这样解决的len是我接收到的(可能是第一次接受到的)packlen是我发过来的一个包的大小while&(len&&&packlen)&&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&int&TcpFile&=&cs.ClientSocket.Receive(cs.buff,&0,&cs.buff.Length&-&len,&SocketFlags.None);&&&&&&&&&&&&&&&&&&&&&&&&&&&&&len&+=&TcpF//便于while做出正确判断&&&&&&&&&&&&&&&&&&&&&&&&}如果我接受的数据小与一个包的大小,我就再去Receive一次
串口通信和socket通信貌似还是有差别的
myup5201314()&正解。你不能假定,一次发送,就能一次接收。电脑串口通讯,我们唯一可以确认的就是,接收不会切断字节,也就是接收只发生在字节边界处,所以,我们通常在第一个字节指示发送包的长度。实际上,早期的单片机接收缓冲区只有4个bit,接收就会发生在4个位处,现在通常缓冲区8个位。对于PC来说,这个缓冲区还可以更大。串口通讯是不可靠的,第一个字节有可能丢失,造成接收异常,有时候单片机速度慢还会不能及时响应造成缓冲区溢出,结果后面发送的会冲掉前面发送的内容。这时候我们需要使用串口的控制线来进行同步。如果使用控制线,可以不需要长度,也不需要其他额外的校验,当然也可以进行一定的校验。在发送数据的时候,你可以让某个控制线始终处于高电平,当发送结束时,控制他为低电平。此外还需要缓冲区的高低电平控制,缓冲区满时拉高某个控制线的电平。对于PC来说,这些其实可以省略,PC对PC可以保证缓冲区不溢出。还可以保证接收的数据完整。你要做的,就是使用2根空闲的控制线来同步两者间数据发送。
检查一下Rthreshold属性和inbuffersize属性正解
串口的通讯可靠不可靠取决于环境和协议,就想同样是双绞线,用UDP协议和TCP协议传输数据可靠性是完全不一样的,串口的电气性能是没有问题的,毕竟是很成熟的技术了,并且广泛的运用在工业控制领域,所以不能说串口通讯是不可靠的。串口参数中的停止位和校验位都可以简单的纠正通讯中的错误。但楼主的问题显然不是串口不稳定造成的,若是不稳定应该产生误码才对,而不是数据流的截断!问题的原因应该是串口配置的问题。
那个Serlai类可以设置接收到几个字节后触发那个DataReceived的事件,你可以设置接收1个字节就触发,然后可以一次性把缓冲区里面的数据全部拿出来你最好设计一个好一点的协议,我曾经做的那个要有非常大的电流,有100安培还不止,搞得干扰很严重
raulredondo大哥,您能不能说说怎么设置接收到几个字节后触发那个DataReceived的事件?
suliang1984,我没有在SerialPort类中找到Rthreshold属性呀!接收缓冲区肯定是足够大的!
ReceivedBytesThreshold决定接收几个字节触发DataReceived,默认为1串口编程基本都会遇到这个问题!我的办法:定义一个全局变量,DataReceived事件连接读到的字符串,满足条件处理完当前数据后,清空变量!
串口是慢速通讯机制,当你的串口有数据到达,响应事件的时候,其实数据还没有发送完毕,如果你非要一次就接收完毕,你要设立一个延时我建议你不要设立延时,而是在你的串口指令编码中设置好标志位,例如字节的起始标志和终止标志,以及字节长度等信息,通过判断这些信息达到完成接受的目的。我做串口是采用一个死循环,一直采集,然后分割数据,把数据成块加入到ArrayList可以看我得Bloghttp://blog.csdn.net/cnming/archive//1597930.aspx串口程序不处理好,会有数据掉包的现象
串口(RS232)的通讯是不可靠的,他的电气特性不同于使用对绞线的网线。1、他使用TTL电平,电压高。2、允许的漏电流较高,容易受到干扰,也不可以长距离传送。3、使用原始的高低电平来区别1、0,延时,码率不同都会造成干扰。短距离,优良环境中才能可靠工作,如果在恶劣环境中,要么使用RS485,或者使用光电串口,并且加上软件纠错。LZ的问题并非干扰,我只是告诉他,将来要注意干扰问题,在设计通讯协议的时候要充分考虑串口的不可靠。
BlueTrees(蜗牛)&正解,但只要设计合理这些问题可以避免的。cnming(cnming)&的方法也可以,曾经我用过这种发法:不适用串口类的DataReceived事件触发,而是循环判断inputbuffer中的数据长度,比如你一直要发送的数据长度是12字节,那么当判断到inputbuffer的长度大于等于12字节时读取缓冲中的数据。虽然有可能inputbuffer的数据会超出长度,将超出长度的数据截断就可以了。不过要考虑再循环中加入超时,否则有可能陷入死循环。建议自己写一个简单的传输协议,用串口做数据流的不间断传输可靠性实在不敢保证。
DataReceived事件由Rthreshold属性触发,如果Rthreshold属性设为8,发送方在发送多于8个字节但是少于16个字节的数据时,接受一次,如果发送等于或多于16个字节少于24字节,就接受两次,如此类推
发表评论:
TA的最新馆藏为什么 串口通信 分多次接收数据
[问题点数:30分,结帖人youhun1990]
为什么 串口通信 分多次接收数据
[问题点数:30分,结帖人youhun1990]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2012年4月 VC/MFC大版内专家分月排行榜第一
2012年5月 VC/MFC大版内专家分月排行榜第二2012年3月 VC/MFC大版内专家分月排行榜第二2011年7月 VC/MFC大版内专家分月排行榜第二2011年1月 VC/MFC大版内专家分月排行榜第二2010年12月 VC/MFC大版内专家分月排行榜第二2010年9月 VC/MFC大版内专家分月排行榜第二2010年6月 VC/MFC大版内专家分月排行榜第二2010年5月 VC/MFC大版内专家分月排行榜第二2010年4月 VC/MFC大版内专家分月排行榜第二
2012年5月 VC/MFC大版内专家分月排行榜第三
2012年4月 VC/MFC大版内专家分月排行榜第一
2012年5月 VC/MFC大版内专家分月排行榜第二2012年3月 VC/MFC大版内专家分月排行榜第二2011年7月 VC/MFC大版内专家分月排行榜第二2011年1月 VC/MFC大版内专家分月排行榜第二2010年12月 VC/MFC大版内专家分月排行榜第二2010年9月 VC/MFC大版内专家分月排行榜第二2010年6月 VC/MFC大版内专家分月排行榜第二2010年5月 VC/MFC大版内专家分月排行榜第二2010年4月 VC/MFC大版内专家分月排行榜第二
2014年11月 VC/MFC大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
正在努力加载中...
串口通信中接收数据时延迟处理与缓存处理的解决方案(C_)
下载积分:700
内容提示:串口通信中接收数据时延迟处理与缓存处理的解决方案(C_)
文档格式:PDF|
浏览次数:608|
上传日期: 14:36:40|
文档星级:
该用户还上传了这些文档
串口通信中接收数据时延迟处理与缓存处理的解决方案(C_)
官方公共微信共有 2438 人关注过本帖
标题:C#串口通讯接收数据问题!!求老师解答!!
等 级:新手上路
帖 子:10
结帖率:100%
&&问题点数:0&&回复次数:4&&&
C#串口通讯接收数据问题!!求老师解答!!
我写了一个串口程序!是和一台仪器进行通信,在通讯过程中,我发送一条指令后,仪器会回复一条指令,我要判断回复的指令是否正确,我把接受的数据放在ReceiveData中,每次判断前我要知道接收到的仪器的指令是否更新过,我现在不知道怎么判断接受的的数据是否更新??
&&&private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)//串口接收数据
&&&&&&&&&&&while (serialPort1.BytesToRead & 0)
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&ReceiveData += serialPort1.ReadExisting();//接受的数据放在ReceiveData
&&&&&&&&&&&&}
&&&&&&&&&&&&ReceiveData = &&;
&&&&&&&&private void collect_data_Click(object sender, EventArgs e)//通信过程
&&&&&&&&&&&&
&&&&&&&&&&&&sendmesg[1] = &WAV& + wave_set.Text.ToString() + '\r';//x射线波长
&&&&&&&&&&&&sendmesg[9] = &SKM& + voltage_set.Text+ current_set.Text + '\r';//管电压,管电流
&&&&&&&&&&&&sendmesg[10] = &SHO& + '\r';//开光栅
&&&&&&&&&&&&sendmesg[11] = &Q/& + '\r';
&&&&&&&&&&&&&&& WriteData(&SHR&+'\r');
&&&&&&&&&&&&while (!string.Equals(ReceiveData,'\n' + &C=?& + '\r')) ;
&&&&&&&&&&&&&&& WriteData(&/S& + '\r');
&&&&&&&&&&&&for (i = 1; i & 13; i++)//这个地方出现问题,因为不知道怎么判断接收的的数据已经更新??????????
&&&&&&&&&&&&{
&&&&&&&&&&&&&&& while (!string.Equals(ReceiveData,'\n' + &C=?& + '\r')) ;
&&&&&&&&&&&&&&& WriteData(sendmesg[i]);
&&&&&&&&&&&&}
&&&&&&&&&&&&button3.Enabled =
搜索更多相关主题的帖子:
等 级:新手上路
帖 子:10
等 级:新手上路
等 级:新手上路
之前读过的数据&&&取出来之后就把缓存区清空&&如果有数据那肯定就是最新的&&就不用判断数据是否更新了&&
等 级:贵宾
威 望:83
帖 子:2519
专家分:9310
你的担心有点多余 通过事件DataReceived监听是否收到数据。这个通信绝对是实时的。
出来混,谁不都要拼命的嘛。 。拼不赢?那就看谁倒霉了。 。有机会也要看谁下手快,快的就能赢,慢。 。狗屎你都抢不到。 。还说什么拼命?
版权所有,并保留所有权利。
Powered by , Processed in 0.036642 second(s), 8 queries.
Copyright&, BCCN.NET, All Rights Reserved您的举报已经提交成功,我们将尽快处理,谢谢!
串行通信是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0...
大家还关注}

我要回帖

更多关于 串口通信如何接收汉字 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信