社区
C#
帖子详情
关于serialport的属性ReceivedBytesThreshold
freeboy827
2009-09-21 02:21:53
我设置了值为272
可是有时接收的长度为16
这是怎么回事,有没有人遇到这种问题
谢谢回复
...全文
826
11
打赏
收藏
关于serialport的属性ReceivedBytesThreshold
我设置了值为272 可是有时接收的长度为16 这是怎么回事,有没有人遇到这种问题 谢谢回复
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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
利用
Se
ria
l
Port
控件实现PC与PC串口通信(事件方式&查询方式)
利用
Se
ria
l
Port
控件实现PC与PC串口通信(事件方式&查询方式)
VB .net
Se
ria
l
Port
控件使用详解
VB2008中使用
Se
ria
l
Port
控件详解,从接收到发送。估计你看了就会用这个了,其实VB2008很简单哦~
C#_
Se
ria
l
Port
---非常好用
在
Se
ria
l
Port
控件的
属性
列表中主要注意3个地方: (1)
Port
Name:表示要打开的通信端口名称; (2)BaudRate:表示端口的波特率; (3)Re
ceived
Byte
s
Threshold
:表示触发
Se
ria
l
Port
控件的DataRe
ceived
事件前输入缓冲区里的字节数; 是串口通信很好的实例,里面包含了很多细节
Se
ria
l
Port
控件的使用
个人收集整理的
Se
ria
l
Port
控件常用
属性
、方法和事件及其使用方法,并附有相应代码
C#串口编程
Se
ria
l
port
类1.doc
C#
Se
ria
l
Port
串口开发技术相关类、
属性
、方法、事件等用法详细说明,并且配有详细的开发实例。
C#
111,098
社区成员
642,554
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章