社区
C#
帖子详情
关于serialport的属性ReceivedBytesThreshold
freeboy827
2009-09-21 02:21:53
我设置了值为272
可是有时接收的长度为16
这是怎么回事,有没有人遇到这种问题
谢谢回复
...全文
735
11
打赏
收藏
关于serialport的属性ReceivedBytesThreshold
我设置了值为272 可是有时接收的长度为16 这是怎么回事,有没有人遇到这种问题 谢谢回复
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
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
事件前输入...
COM串口协议通讯客户端服务器发送数据
在
Se
ria
l
Port
类中有DataRe
ceived
事件,当串口的读缓存有数据到达时则触发DataRe
ceived
事件,其中
Se
ria
l
Port
.Re
ceived
Byte
s
Threshold
属性
决定了当串口读缓存中数据多少个时才触发DataRe
ceived
事件,默认为1。...
C#上位机串口编程、Modbus编程
C#串口通信是借助一个
Se
ria
l
Port
类的对象来方便的对串口进行读写。 Modbus是一种串行通信协议,是施耐德电气发表工业标准协议。C# NModbus4库提供了ModbusMaster、ModbusSlave类来实现Modbus...
微机原理串行通信
Se
ria
l
Port
Se
ria
l
Port
类提供了七个重载的构造函数,既可以对已经实例化的
Se
ria
l
Port
对象设置上述相关
属性
的值,也可以使用指定的端口名称 、波特率和奇偶校验位数据位和停止位直接初始化
Se
ria
l
Port
类的新实例。 3.串口的...
C#
110,500
社区成员
642,577
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章