请教 C# 串口通讯问题

yangpenghappy 2010-04-27 02:36:09
大家好 请教一下有关c# 串口通讯的一些问题,
这是我接受串口的一个事件

private void sComm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
//读入收到的数据。
int Len = sComm.BytesToRead;
if (Len < 1)
{
IsReceving = false; //***接收完成状态指示。
return;
}
byte[] data = new byte[Len];
sComm.Read(data, 0, Len);

//使用委托跨线程读取数据。
rtbRecStr.Invoke(interfaceUpdataHandle,data );//Resolve(byte [] data);解析方法
}
catch (Exception Err)
{
MessageBox.Show(Err.Message, "串口调试助手");
}
}

现在有这样一个问题 , 比如我要从串口读取数据 由于串口发送过来的数据不是一次发送过来的 可能分多次发送 间隔时间可能就毫秒级。 而且我要的数据长度也不是固定的 。 这样就有一个问题 Resolve() 方法是 只要串口接受到数据就去执行 传过来的数据又完整,所以要怎么处理才好。 求解!

比如我和电能表通讯 发送过来的帧命令可能是 68FFFFFFFF000068010A000100000000000000BEBE5416 但是从串口接受数据是他不是一次返回过来, 而是可能分多次。 所以我想知道 我要怎么去判断 接收的数据是一组命令 然后调用Resolve()去解析。 (很麻烦 想了很久实在是不知道有什么方法 希望大家能帮帮我 谢谢)
...全文
278 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
yangpenghappy 2010-04-28
  • 打赏
  • 举报
回复
没人啦说说啦 那只好结贴了。。。
蹊跷路人 2010-04-27
  • 打赏
  • 举报
回复
学习学习~!!!要用到了~!!!
weike021996 2010-04-27
  • 打赏
  • 举报
回复
mark,学习了
yangpenghappy 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 neil198 的回复:]

引用 2 楼 yangpenghappy 的回复:
引用 1 楼 neil198 的回复:

我记得串口返回的数据都有一个 /0或者什么的结束符吧??


有吗? 这个我好像没发现 也不太确定 如果真是这样 那就好办了。。。

你查查吧,我很久以前做过POS机。。 如果没有你可以看一下你的串口设备文档,一般都有一个结束符。
[/Quote]


你所说的结束符 我不知道是不是说的帧命令的结束符 这个是有的。0x16 结束 但是这个我觉得在不能起到判断的作用 因为 接收过来的数据可能在其他的里面也会出现这样的结束符 所以这个不足以判断 一组数据的结束。
yangpenghappy 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wuyazhe 的回复:]

数据一般是连续传输的,1秒时间有30%都是空闲的,我们假设最高效情况,那也应该有至少3%时间是连续空闲的。
所以你可以这样尝试
C# code

public void sComm_DataReceived(...)
{
List<byte> buf = new List<byte>();
int n = sComm.BytesToRead;
while(n>0)
……
[/Quote]


是的 我发现我接受过来的一组帧 虽然分成了四次接受 但是在时间上 至少是同一秒 可能是毫秒级不同。 我问过了做硬件的一些同事 他们说这可能就是跟一些环境具体的硬件设备环境有关系 ( 因为我的电脑没有串口 所有用到了usb转串口的线) 你的这个写法我觉得有一定的道理,可以试试 呵呵。还是谢谢你啊
兔子-顾问 2010-04-27
  • 打赏
  • 举报
回复
数据一般是连续传输的,1秒时间有30%都是空闲的,我们假设最高效情况,那也应该有至少3%时间是连续空闲的。
所以你可以这样尝试

public void sComm_DataReceived(...)
{
List<byte> buf = new List<byte>();
int n = sComm.BytesToRead;
while(n>0)
{
byte[] tmp = new byte[n];
sComm.Read(tmp,0,n);
buf.AddRange(tmp);
Threading.Thread.Sleep(30);
n = sComm.BytesToRead;
}
Resolve(buf.ToArray());
}
shashengduguzhe 2010-04-27
  • 打赏
  • 举报
回复
解决办法:
1。当你知道什么时候需要接受数据时,你可以等待一段时间再进行接收。此办法比较笨,因为你不知道何时数据已完整接收。
2。不断检测接收的数据,看接收数据是否已接收完整。

数据格式你自己应该知道。所以第二种方法是比较不错滴。
Neil198 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 yangpenghappy 的回复:]
引用 1 楼 neil198 的回复:

我记得串口返回的数据都有一个 /0或者什么的结束符吧??


有吗? 这个我好像没发现 也不太确定 如果真是这样 那就好办了。。。
[/Quote]
你查查吧,我很久以前做过POS机。。 如果没有你可以看一下你的串口设备文档,一般都有一个结束符。
sunfu4359 2010-04-27
  • 打赏
  • 举报
回复
路过,学习了~~
yangpenghappy 2010-04-27
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 neil198 的回复:]

我记得串口返回的数据都有一个 /0或者什么的结束符吧??
[/Quote]

有吗? 这个我好像没发现 也不太确定 如果真是这样 那就好办了。。。
Neil198 2010-04-27
  • 打赏
  • 举报
回复
我记得串口返回的数据都有一个 /0或者什么的结束符吧??

110,524

社区成员

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

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

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