红外串口通讯问题,有点难度,急!

czjearth 2010-06-02 09:25:41
本人在开发红外通讯程序时, 使用红外转串口与PC连接。

有以下问题:
红外发送数据后,接收时经常把下发的命令也接收到。 称之为反射。 (但并不总是这样)
如:

下发:
68 00 00 00 00 00 00 68 01 02 C0 10 10 16
正常应该回应帧:
68 00 00 00 00 00 00 68 81 04 01 02 03 04 10 16
实际回应(下发帧+正常响应帧):
68 00 00 00 00 00 00 68 01 02 C0 10 10 16 68 00 00 00 00 00 00 68 81 04 01 02 03 04 10 16

请问, 这种问题应该用什么比较通用的解决方案?

以前的通讯程序是:
1). 同步通讯
发送时接收,指定超时时间(比如3秒), 在这个时间段内每接收到数据判断帧是否完成。
完成后退出。
问题:在收到 下发帧后就判断为接收OK, 就退出了。 如果判断接收了两个帧才算完成。


2)。异步通讯
通过 DataReceive事件接收, 问题是: 怎么判断所有数据接收完成呢?




在线等答案。 谢谢!







...全文
500 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
czjearth 2010-06-07
  • 打赏
  • 举报
回复
协议中有长度标志,

事实是, 我希望将通讯和协议分开, 由协议层调用通讯层,

通讯层只管收发数据,

如果要通过协议中长度来标识数据收发是否完成。

那么也就是说,通讯层需要调用协议层。

这样就形成互调用。 似乎不太合逻辑。



兔子-顾问 2010-06-02
  • 打赏
  • 举报
回复
意思是你的协议中无法区分出是发送的还是接收的是这样么?
那你只能找个不是很好的办法,因为协议中没有区分。
1。你看看接收的长度是多少,当找到68 .... 10 16,这一条完整数据,长度是16的时候才处理。
2。你记录下发送的数据,如果是发送的,就不要。

判断数据完整性,判断数据有效性。
czjearth 2010-06-02
  • 打赏
  • 举报
回复


//判断接收数据是否接收完成。
if ( FinishedFrame(接收数据) ) break;
}


也就是说, 这个方法怎么实现, 以处理可能发生的两种情况:
1). 返回一个正确的数据帧

2). 返回 一个反射帧 + 一个正确的数据帧。



czjearth 2010-06-02
  • 打赏
  • 举报
回复
wuyazhe
不用汗,
也许是我描述不对,

我的意思是: 现在有可能收到一条正确的数据帧, 有可能收到两条正确的数据帧。 (第一个数据帧是发送帧)

我用什么方法判断接收完成呢 ?

请看一下代码实现:

//同步发送接收
void 发送(byte[] data)
{
串口.Write(data);

byte[] 接收数据;
DateTime dt1 = Now();
//大于3秒, 没收到数据表示超时
while( (now - dt1) < 3秒)
{
byte[] buffer = 串口.Read();
接收数据.Add(buffer);

//判断接收数据是否接收完成。
if ( FinishedFrame(接收数据) ) break;
}

//解析帧
ParseFrame(接收数据);
}


如果一个回应帧, 我自然会判断这个帧数据是否接收完成。
但现在是有可能有两个帧 : 所以在第一个帧接收完成后就判断数据接收完成, 第二帧数据不会接收了。






北京不不 2010-06-02
  • 打赏
  • 举报
回复
学习了
兔子-顾问 2010-06-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 czjearth 的回复:]
不是协议问题, 会回发两次 协议正确的数据帧。
[/Quote]

汗。再给你解释一次,我知道你协议没定义错,我告诉你的是分析方法。

那么你既然会分析,会找到一条完整协议,收发的命令肯定不同的,你过滤,只要收的部分,不是收的部分扔掉不就行了?
czjearth 2010-06-02
  • 打赏
  • 举报
回复
没人回,

自己再顶一下。
czjearth 2010-06-02
  • 打赏
  • 举报
回复
不是协议问题, 会回发两次 协议正确的数据帧。

111,097

社区成员

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

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

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