问个C#串口的,怎样判断命令是否已经执行完毕?

mohugomohu 2010-11-23 04:26:21

string strCmd = "AT+CMMS=3\r";
sp.Write(strCmd);
Thread.Sleep(this.TimeCmdSleep);
strCmd = "AT+CMGF=1\r";
sp.Write(strCmd);
Thread.Sleep(this.TimeCmdSleep);
strCmd = "AT+CMGS=" + tel + "\r";
sp.Write(strCmd);
Thread.Sleep(this.TimeCmdSleep);
strCmd = PublicMethod.EncodingUCS2(content) + "\x1A";
sp.Write(strCmd);

你看,我现在都是写入一条命令后就要等待一段时间(固定的),我想把他搞成执行完成后就往下执行,就不用等那么久了。
...全文
511 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
-小蕾- 2010-11-24
  • 打赏
  • 举报
回复
一般情况下的通讯是很快的,基本上等待一秒够了,如果是要等待返回数据,可以循环的去读.我就是这么做的,可能是很笨的方法.
mohugomohu 2010-11-24
  • 打赏
  • 举报
回复
不错,是我的疏忽,这是循环的。
事实上,这个方法用在需要耗时较长的指令上还是不错的,如果是短时的指令的话就没必要,直接等待一下即可。
兔子-顾问 2010-11-24
  • 打赏
  • 举报
回复
那你这个判断也没什么意义。
那是循环,不是if。怎么叫没意义?
兔子-顾问 2010-11-24
  • 打赏
  • 举报
回复
真不知道你看了我给你回复没有,或是仔细看了没有,我一行一行加个注释?

sp.DiscardInBuffer();//清除接受缓存
sp.WriteLine("AT+CMMS=3");//发命令
int tick = Environment.TickCount;//记录当前时间戳
int timeout = 2000;//你这个自己定,我假设2秒延迟等待应答,超过则提示超时无应答。
bool ack_found = false;//标志是否收到应答
StringBuilder buf = new StringBuilder();//定义缓存
while(Environment.TickCount - tick < timeout && !ack_found)//如果没收到应答或尚未超时,则循环
{
buf.Append(sp.ReadExisting());//将当前串口数据记录进缓存
//ack_found表示是否收到应答,没收到的话再继续循环就可以了。
ack_found = buf.ToString().IndexOf("OK") != -1;//假设应答为OK,检查收到数据中是否包含应答。
Application.DoEvents();//处理消息,避免界面卡死
}
if(!ack_found)
{
MessageBox.Show("step 1 error response. Try later.");
return;
}

不解释了。
mohugomohu 2010-11-24
  • 打赏
  • 举报
回复
我想了一下,sp.ReadExisting()是读取所有的数据,那么在发送指令之后如果还没有返回结果,那你这个判断也没什么意义。
兔子-顾问 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 mohugomohu 的回复:]
你这个不行啊,sp.ReadExisting()是读取所有的结果啊,如果已经执行了几个命令,那就是说会有很多个OK或者error,没办法判断
[/Quote]
那你不会之前先清空数据? sp.DiscardInBuffer();
at命令不会自己主动给你发东西的。你发了等应答怎么可能错?
浪子-无悔 2010-11-24
  • 打赏
  • 举报
回复
大忽悠兄上了啊.
mohugomohu 2010-11-24
  • 打赏
  • 举报
回复
你这个不行啊,sp.ReadExisting()是读取所有的结果啊,如果已经执行了几个命令,那就是说会有很多个OK或者error,没办法判断
兔子-顾问 2010-11-23
  • 打赏
  • 举报
回复
sp.WriteLine("AT+CMMS=3");
int tick = Environment.TickCount;
int timeout = 2000;
bool ack_found = false;
StringBuilder buf = new StringBuilder();
while(Environment.TickCount - tick < timeout && !ack_found)
{
buf.Append(sp.ReadExisting());
ack_found = buf.ToString().IndexOf("OK") != -1;//假设应答为OK
Application.DoEvents();//处理消息
}
if(!ack_found)
{
MessageBox.Show("step 1 error response. Try later.");
return;
}
依次类推的分析所有数据的返回值
doubleu2005 2010-11-23
  • 打赏
  • 举报
回复
手机的AT指令吧,一般会返回OK的,用这个判断就好了,我也写过类似的东西
staticuser 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 1楼 的回复:]
LZ发送的命令有执行结果么?有的话可以读取返回数据判断是否执行完毕呀
[/Quote]
staticuser 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 1楼 的回复:]
LZ发送的命令有执行结果么?有的话可以读取返回数据判断是否执行完毕呀
[/Quote]
[color=#00000]顶[/color]
staticuser 2010-11-23
  • 打赏
  • 举报
回复
[Quote=引用 1楼 的回复:]
LZ发送的命令有执行结果么?有的话可以读取返回数据判断是否执行完毕呀
[/Quote]
[color=#000]顶[/color]
lexfu 2010-11-23
  • 打赏
  • 举报
回复
LZ发送的命令有执行结果么?有的话可以读取返回数据判断是否执行完毕呀

111,129

社区成员

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

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

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