SerialPort使用BaseStream异步读取数据问题

zjl1985 2014-05-15 08:23:26

private void SerialPortReadCallBack(IAsyncResult ar)
{
SPortState state = (SPortState)ar.AsyncState;
if ((state.sp == null) || (!state.sp.IsOpen))
return;

int numberOfBytesRead;
// int numberOfBytesRead2;
Stream mas = state.sp.BaseStream;
// string sss2 = state.sp.ReadExisting();
numberOfBytesRead = mas.EndRead(ar);

//string sss = state.sp.ReadExisting();
//state.totalBytesRead += numberOfBytesRead;
if (numberOfBytesRead > 0)
{
string data = string.Empty;
//string data2 = state.sp.ReadLine();
// byte[] dd = new byte[numberOfBytesRead];
//Array.Copy(state.buffer, 0, dd, 0, numberOfBytesRead);
data = String.Concat(data, Encoding.ASCII.GetString(state.buffer, 0, numberOfBytesRead));
this.richTextBox1.SelectionColor = Color.Green;

richTextBox1.AppendText("\r\n报文" + state.sp.PortName + ":" + data);

//richTextBox1.AppendText("\r\n报文" + state.sp.PortName + ":" + sss);
mas.BeginRead(state.buffer, 0, SPortState.BufferSize,
new AsyncCallback(SerialPortReadCallBack), state);
}
}


我异步接收数据,但是报文并不是一次收下,如果是自带的DataReceived则可以,但是DataReceived效率感觉一般
...全文
347 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjl1985 2014-05-15
  • 打赏
  • 举报
回复
引用 2 楼 lele_nancy 的回复:
报文长度固定的话用一下固定长度

_SerPort.ReceivedBytesThreshold = 24;
试过啦,木有用~~我觉得是BaseStream的问题~~
lele_nancy 2014-05-15
  • 打赏
  • 举报
回复
报文长度固定的话用一下固定长度

_SerPort.ReceivedBytesThreshold = 24;
zjl1985 2014-05-15
  • 打赏
  • 举报
回复
详细说明一下 加断点看,就是我发一条报文,如果是一个byte,就没事 如果大于一个byte,BeginRead这个就走两遍,第一次输出一个byte,第二次将剩下的读完, 如果在这个方法里ReadExisting(),会把剩下的读完。。。 我自己可以处理这个情况,但是感觉很别扭。。。我在三台机器上测试都是这个情况,串口调试程序自己收发不是这个样子

110,567

社区成员

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

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

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