关于串口DataReceived 事件的问题

todaywlq 2011-11-02 11:50:40
在串口的DataReceived中向串口发送数据,能否立即触发 DataReceived 事件,然后再执行剩下的代码

如下

private string CommData = string.Empty;
public void Sp_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (Sp.IsOpen)
{
byte[] readBuffer = new byte[Sp.ReadBufferSize];
Sp.Read(readBuffer, 0, readBuffer.Length);
CommData = System.Text.Encoding.Default.GetString(readBuffer);
if (CommData.Length == 0)
return;

if (CommData.IndexOf("+CLIP:", 0) > 0)
{
if (CommData.IndexOf(",,", 0) > 0)
{
label1.Text = "来电号码:" + GetRingNumber(CommData);
}
}
if (CommData.IndexOf("\"MT\"", 0) > 0 || CommData.IndexOf("\"SM\"", 0) > 0 || CommData.IndexOf("\"ME\"", 0) > 0)
{
//读取短信内容
if (CommData.IndexOf("\"+CPMS\"", 0) < 0)
{
int smsIndex = GetSmsIndex(CommData);
string strOrder = "AT+CMGR=" + smsIndex.ToString() + "\r\n";
CommData = "";

Sp.Write(strOrder); //能不能立即触发 Sp_DataReceived,读到返回的数据

int currTime = 0;
int timeInc = 50;
while (currTime < 2000)
{
if (CommData.Trim() != "")
{
break;
}
else
{
Application.DoEvents();
System.Threading.Thread.Sleep(timeInc);
currTime = currTime + timeInc;
}
}

if (CommData.Trim() != "")
{
//处理数据,执行不到这句
}
}
}
if (CommData.IndexOf("+QMMNOTIFY:3", 0) > 0)
{
//ReadMms(SportData);
}
}
}
...全文
215 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
gaoqiang089 2012-08-18
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 6 楼 qldsrx 的回复:

请将问题表述得详细些,什么叫立刻触发DataReceived 事件,这个事件的触发不是我们能控制的,因此无法从这个方向入手,我要知道你要达到的效果,找其它方法实现。


我已经在事件中向串口发送数据了,是想让它立刻触发这个事件,而不是执行发送数据后面的代码

问题已经解决 感谢 mabaolin
[/Quote]

请我楼主怎么解决的 我也遇到这个问题
mabaolin 2011-11-02
  • 打赏
  • 举报
回复
下面的while是做什么的,最好提出去。

int timeInc = 50;
while (currTime < 2000)
{
if (CommData.Trim() != "")
{
break;
}
else
{
Application.DoEvents();
System.Threading.Thread.Sleep(timeInc);
currTime = currTime + timeInc;
}
}

mabaolin 2011-11-02
  • 打赏
  • 举报
回复
if (CommData.IndexOf("\"+CPMS\"", 0) < 0)
{
int smsIndex = GetSmsIndex(CommData);
string strOrder = "AT+CMGR=" + smsIndex.ToString() + "\r\n";
CommData = "";

System.Threading.ThreadPool.QueueUserWorkItem(new System.Threading.WaitCallback(Send),strOrder );
}
public void Send(object obj)
{
string msg = (string)obj;
sp.write();//....发送
}
todaywlq 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 mabaolin 的回复:]

发送数据起新线程
[/Quote]
对多线程不太了解,如何做?
mabaolin 2011-11-02
  • 打赏
  • 举报
回复
发送数据起新线程
todaywlq 2011-11-02
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 qldsrx 的回复:]

请将问题表述得详细些,什么叫立刻触发DataReceived 事件,这个事件的触发不是我们能控制的,因此无法从这个方向入手,我要知道你要达到的效果,找其它方法实现。
[/Quote]

我已经在事件中向串口发送数据了,是想让它立刻触发这个事件,而不是执行发送数据后面的代码

问题已经解决 感谢 mabaolin
qldsrx 2011-11-02
  • 打赏
  • 举报
回复
请将问题表述得详细些,什么叫立刻触发DataReceived 事件,这个事件的触发不是我们能控制的,因此无法从这个方向入手,我要知道你要达到的效果,找其它方法实现。

110,539

社区成员

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

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

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