关于serialport的属性ReceivedBytesThreshold

freeboy827 2009-09-21 02:21:53
我设置了值为272
可是有时接收的长度为16
这是怎么回事,有没有人遇到这种问题
谢谢回复
...全文
735 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
风之影子 2009-09-22
  • 打赏
  • 举报
回复
要合理的设置DataReceived属性
qiqundelang 2009-09-22
  • 打赏
  • 举报
回复
路过
灯火斑斓 2009-09-22
  • 打赏
  • 举报
回复
ReceivedBytesThreshold只是触发DataReceived事件的一个阀值,由于串口通讯的实时性,很难说你每次读取的数据长度就是阀值的长度。请参考下面的方法。

技术要点:
(1).首先,SerialPort的ReceivedBytesThreshold先设置成1,表示只要有1个字符送达端口时便触发DataReceived事件
(2).当DataReceived触发时,先把ReceivedBytesThreshold设置成一个比较大的值,达到读取本次端口数据时,不再触发DataReceived.
(3).循环读取端口中的数据,直至读完。
(4).移除读取数据中的非法字符。
(5).触发一个后台线程处理收到的数据。
(6).在finally中把ReceivedBytesThreshold重置回1

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (sender.GetType() != typeof(System.IO.Ports.SerialPort))
{
return;
}
string strReceive = string.Empty;
string strCollect = string.Empty;
System.IO.Ports.SerialPort comPort = (System.IO.Ports.SerialPort)sender;

try
{
comPort.ReceivedBytesThreshold = comPort.ReadBufferSize;
while (true)
{
strReceive = comPort.ReadExisting();
if (string.Equals(strReceive, string.Empty))
{
break;
}
else
{
strCollect += strReceive;
Application.DoEvents();
Thread.Sleep(100);
}
}
strCollect = strCollect.Replace("\0", string.Empty);
strCollect = strCollect.Replace("\r\n", string.Empty);
strCollect = strCollect.Replace("\r", string.Empty);
strCollect = strCollect.Replace("\n", string.Empty);

if (!this.bIsHandleCom)
{
this.bIsHandleCom = true;
mReceiveData = strCollect;
if (ReceiveDataParserEvent != null)
ReceiveDataParserEvent(mReceiveData);
if (ThreadReceiveParser != null && !ThreadReceiveParser.IsAlive)
{
ThreadReceiveParser.Start();
}
}

}
catch (Exception ex)
{
MessageBox.Show(this, ex.ToString(), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
comPort.ReceivedBytesThreshold = 1;
}
}
freeboy827 2009-09-22
  • 打赏
  • 举报
回复
代码很多,不好贴
刚开始读取是272位,过了几十秒,就读到一次不是272位的数据
以后读取到的还是272位,这样数据就错位了,不能解析
表达能力不好,不知道你看明白了吗
我的QQ 402514969 可否加QQ详谈,谢谢
风之影子 2009-09-22
  • 打赏
  • 举报
回复
p.Read(buffer2, 0, bytes2);

读取没有问题.


你再把问题描述详细一点.

是有时读到16位,那么再读到到16字节的前一次读取是多少呢?
还是一直都只读到16位.


freeboy827 2009-09-22
  • 打赏
  • 举报
回复
自己再顶
freeboy827 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 mjp1234airen4385 的回复:]
接到16的时候,继续读取,直到等于272,或超时。
[/Quote]
我是这样读取的
SerialPort p = sender as SerialPort;
if (!p.IsOpen)
{
return;
}
int bytes2 = serialPort.BytesToRead;

byte[] buffer2 = new byte[bytes2];
if (p.BytesToRead > 0)
{
p.Read(buffer2, 0, bytes2);
}
请问怎么继续读取
mjp1234airen4385 2009-09-21
  • 打赏
  • 举报
回复
接到16的时候,继续读取,直到等于272,或超时。
风之影子 2009-09-21
  • 打赏
  • 举报
回复
[Quote=引用楼主 freeboy827 的回复:]
我设置了值为272
可是有时接收的长度为16
这是怎么回事,有没有人遇到这种问题
谢谢回复
[/Quote]


代码呢
这个问题应该不存在吧!
jhdxhj 2009-09-21
  • 打赏
  • 举报
回复
ding
jhdxhj 2009-09-21
  • 打赏
  • 举报
回复
ding

110,500

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧