首页 新闻 会员 周边 捐助

类中无法触发DataReceviced事件?

0
悬赏园豆:10 [待解决问题]

自己写了个串口通讯类(代码如下),想封装为DLL,可是DataReceviced事件始终不起作用,难道类中调用事件需要特殊方法?

using System.IO.Ports;

namespace SerialPortLibrary
{
public class PortConn
{
private string _value;
private SerialPort _portObj;

public PortConn(string portNum)
{
_portObj
= new SerialPort(portNum, 9600, Parity.None, 8, StopBits.One);
_portObj.DtrEnable
= true;
_portObj.DataReceived
+= new SerialDataReceivedEventHandler(portObj_DataReceived);
}

public void PortOpen()
{
if (_portObj.IsOpen)
{
_portObj.Close();
}
else
{
_portObj.Open();
}
}

public void PortClose()
{
_portObj.Close();
}

public void SendCommand(string commandString)
{
_portObj.WriteLine(commandString);
}

public void portObj_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
_value
= _portObj.ReadLine();
}

public string GetValue
{
get { return _value; }
}
}
}

 

sala的主页 sala | 初学一级 | 园豆:190
提问于:2010-08-24 12:34
< >
分享
所有回答(2)
0

PortConn conn = new PortConn();

你需要在事件触发之前,一直保持对 conn 的引用.

Launcher | 园豆:45050 (高人七级) | 2010-08-24 13:01
是在使用的 PortConn jp = new PortConn(Port); jp.PortOpen(); jp.SendCommand("Cmd"); MessageBox.Show(jp.GetValue); jp.PortClose();
支持(0) 反对(0) sala | 园豆:190 (初学一级) | 2010-08-24 13:11
@sala: PortConn jp = new PortConn(Port); jp.PortOpen(); jp.SendCommand("Cmd"); MessageBox.Show(jp.GetValue); // 在PortClose之前,需要等待 DataReceived 触发. // 也就是说在 portObj_DataReceived 方法被调用之前,不要 Close. jp.PortClose();
支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2010-08-24 13:15
这个我知道,但portObj_DataReceived应该在jp.GetValue就执行完了,如果将那个类中的代码直接写到Winform程序中就很快收到返回数据了。
支持(0) 反对(0) sala | 园豆:190 (初学一级) | 2010-08-24 14:04
我是发现SerialDataReceivedEventHandler 事件在DLL封装中根本未触发。
支持(0) 反对(0) sala | 园豆:190 (初学一级) | 2010-08-24 14:05
@sala:如果"portObj_DataReceived应该在jp.GetValue就执行完了",那就不叫事件了.这是个异步的过程,不是你写成啥顺序,它就该执行啥顺序,请你认真检查你的代码是否在 portObj_DataReceived 调用之前,就把 PortConn 回收了,或者就调用了 PortClose(). 你要自己检查不出来,请把完整的代码贴出来,包括你如何调用你的 dll 的.
支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2010-08-24 14:26
0

 //timer检查获取数据  这个是重点  需要自己去提取是否有数据
            m_timer = new System.Windows.Forms.Timer();
            m_timer.Interval = defaultTimerInterval;
            
            //设置端口的默认值
            m_serialPort = new SerialPort();
            m_serialPort.ReadBufferSize = 2048;//byte[] size 2048
            m_serialPort.BaudRate = 9600; //电子秤默认是9600
            m_serialPort.DataBits = 8;
            m_serialPort.Parity = Parity.None;
            m_serialPort.StopBits = StopBits.One;
            m_serialPort.ReadTimeout = 2000;//超时
            m_serialPort.PortName = "COM2"; //多数都用COMM
            m_serialPort.DataReceived += new SerialDataReceivedEventHandler(m_serialPort_DataReceived);
          

SESSION MODE | 园豆:205 (菜鸟二级) | 2011-11-19 17:10
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册