To:yefanqiu
我在您的blog中看到 串口操作实用类 这篇文章.不知道该如何使用获取到串口返回信息.类详见:http://topic.csdn.net/u/20071211/16/a6cafd0c-ab2f-4960-9abd-41923b360d98.html我写了一个串口控制类,也就是向串口发送信息,但不知道该如何去获取返回信息
...
PortData port = new PortData("COM1", 9600);
//向串口发送数据
public void selectKey(byte TMKAddress, byte workKeyAddress)
{
byte[] reg = new byte[8];
byte[] setData = new byte[6];
setData[0] = 0x1B;
setData[1] = 0x41;
setData[2] = TMKAddress;
setData[3] = workKeyAddress;
setData[4] = 0x0D;
setData[5] = 0x0A;
if (!port.IsOpen())
{
port.Open();
int i = port.SendCommand(setData, ref reg, 1000); //1000这个参数作用不是太明白
if (i != -1)
{
byteReg= pdr.Data;
} port.Close();
} private byte[] _byteReg;
public byte[] byteReg
{
get { return _byteReg; }
set { _byteReg = value; }
} private string _strReg;
public string strReg
{
get { return _strReg; }
set { _strReg = value; }
}...
1.事件委托我不是很清楚.这样写肯定有问题.
2.总是接收不到串口数据,如果一步步跟踪调试的话可以捕获到.串口返回时间问题吗?如果问题解决,200分送上!
不胜感激!
我在您的blog中看到 串口操作实用类 这篇文章.不知道该如何使用获取到串口返回信息.类详见:http://topic.csdn.net/u/20071211/16/a6cafd0c-ab2f-4960-9abd-41923b360d98.html我写了一个串口控制类,也就是向串口发送信息,但不知道该如何去获取返回信息
...
PortData port = new PortData("COM1", 9600);
//向串口发送数据
public void selectKey(byte TMKAddress, byte workKeyAddress)
{
byte[] reg = new byte[8];
byte[] setData = new byte[6];
setData[0] = 0x1B;
setData[1] = 0x41;
setData[2] = TMKAddress;
setData[3] = workKeyAddress;
setData[4] = 0x0D;
setData[5] = 0x0A;
if (!port.IsOpen())
{
port.Open();
int i = port.SendCommand(setData, ref reg, 1000); //1000这个参数作用不是太明白
if (i != -1)
{
byteReg= pdr.Data;
} port.Close();
} private byte[] _byteReg;
public byte[] byteReg
{
get { return _byteReg; }
set { _byteReg = value; }
} private string _strReg;
public string strReg
{
get { return _strReg; }
set { _strReg = value; }
}...
1.事件委托我不是很清楚.这样写肯定有问题.
2.总是接收不到串口数据,如果一步步跟踪调试的话可以捕获到.串口返回时间问题吗?如果问题解决,200分送上!
不胜感激!
private void ReceiveData(object sender, PortDataReciveEventArgs e)
{
// 在这里处理接收数据
}上面加上:
......
PortData port = new PortData("COM1", 9600);
port.Received = new(PortDataReceivedEventHandle(ReceiveData));
port.Received += new(PortDataReceivedEventHandle(ReceiveData));
port.Received = new(PortDataReceivedEventHandle(ReceiveData));这样写是错误的port.Received += new PortDataReceivedEventHandle(port_Received);void port_Received(object sender, PortDataReciveEventArgs e)
{ Console.WriteLine("1111111111111111111111111");
Console.WriteLine(Convert.ToString(pdr.Data));
//throw new Exception("The method or operation is not implemented.");
}我试过了.但每次都打印不出来
不知道LZ是否考虑过放弃使用PortData类?因为这个类并没有比直接使用SerialPort类带来更多方便
就好像SerialPort的DataReceived那样的效果.
封装起来形成一个Dll以供使用.
ivanx 著于2007-8-15 17:22:20
本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports。我们将使用标准的RS 232C在PC间通信...看看,有用否?
//发送命令
public int SendCommand(byte[] SendData, ref byte[] ReceiveData,int Overtime)
{ if(port.IsOpen)
{
。
。
。
。 ReceiveEventFlag = false; //打开事件
if (port.BytesToRead >= ReceiveData.Length)
ret = port.Read(ReceiveData, 0, ReceiveData.Length);
return ret;
}
return -1;
}
就是把ReceiveEventFlag = false;跟if()语句调换一下位置;
另外,~PortData()虚构函数是没用的,必须显示调用Close()函数关闭端口(),因为你不知道port对象什么时候被销毁,它是受垃圾回收器管理的,所以不知道什么时候会调用~PortData()
port.Received += new PortDataReceivedEventHandle(port_Received);void port_Received(object sender, PortDataReciveEventArgs e)
{ Console.WriteLine("1111111111111111111111111");
//throw new Exception("The method or operation is not implemented.");
}public void selectKey(byte TMKAddress, byte workKeyAddress)
{
byte[] reg = new byte[8];
byte[] setData = new byte[6];
setData[0] = 0x1B;
setData[1] = 0x41;
setData[2] = TMKAddress;
setData[3] = workKeyAddress;
setData[4] = 0x0D;
setData[5] = 0x0A;
if (!port.IsOpen())
{
port.Open();
int i = port.SendCommand(setData, ref reg, 1000); //1000这个参数作用不是太明白
if (i != -1)
{
byteReg= pdr.Data; // 声明PortDataReciveEventArgs pdr = new PortDataReciveEventArgs();
} port.Close();
}
} private byte[] _byteReg;
public byte[] byteReg
{
get { return _byteReg; }
set { _byteReg = value; }
}获取不到返回值 pdr.Data为null
long start = System.DateTime.Now.Ticks;
long end = System.DateTime.Now.Ticks;
while( end - start < 1000 )
{
..........
end = System.DateTime.Now.Ticks;
}
{
if (_serialPort == null)
{
try
{
_serialPort = new SerialPort(cmbPort.Text, int.Parse(cmbBaudrate.Text));
_serialPort.Open();
_serialPort.DataReceived += new System.IO.Ports.SerialDataReceivedEventHandler(_serialPort_DataReceived);
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}
}
}
void _serialPort_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
byte[] buffer = new byte[_serialPort.BytesToRead];
int rc = _serialPort.Read(buffer, 0, buffer.Length);
ProcessMessage(buffer, rc);
}