首页 新闻 会员 周边 捐助

关于c# serialport类接收数据问题???

1
悬赏园豆:10 [已关闭问题] 关闭于 2011-06-15 13:35

我要实现程序通过com向设备发送开门与关门的指令。每次发送指令后会返回一条指令用来判断开门是否成功。开门,关门的方法要封装成一个接口,以便其他程序调用,现在我不是很清楚,用serialport这个类,在开门或关门的方法中,我怎样利用DataReceived这个事件读取并处理两个方法的返回结果,谢谢!serialport类参考下面:

public ComPort()
{
}
//用于线程同步,初始状态设为非终止状态,使用手动重置方式
private EventWaitHandle allDone = new EventWaitHandle(false, EventResetMode.AutoReset);

SerialPort _serialPort
= new SerialPort();
//声明获取时间委托
public delegate void EventHandlerDataReceived(byte[] param);
//获取数据事件
public EventHandlerDataReceived DataReceived;
//声明获取事件委托
public delegate void EventHandlerStatusChanged(string param);
//获取事件信息
public EventHandlerStatusChanged StatusChanged;
//串口号
public string PortName = "COM1";
//波特率
public int BautRate = 9600;
//效验位
public Parity Parity = System.IO.Ports.Parity.None;
//数据位
public int DataBits = 8;
//停止位
public StopBits StopBits = System.IO.Ports.StopBits.One;
//读写时间超时
public int ReadTimeout = 50;
public int WriteTimeout = 50;
/// <summary>
/// 打开端口
/// </summary>
public void Open()
{
//串口号
_serialPort.PortName = PortName;
//波特率
_serialPort.BaudRate = BautRate;
//效验位
_serialPort.Parity = Parity;
//数据位
_serialPort.DataBits = DataBits;
//停止位置
_serialPort.StopBits = StopBits;
//读写时间超时
_serialPort.ReadTimeout = ReadTimeout;
_serialPort.WriteTimeout
= WriteTimeout;

try
{
//开启端口
_serialPort.Open();
//开启数据读取监控
StartReading();

}
catch (IOException)
{
_serialPort.Close();
StatusChanged(PortName
+ "端口被占用...");
}

//设置端口状态
// StatusChanged("端口:" + PortName + ",波特率:" + BautRate + ",效验位:" + Parity.ToString() + ",数据位置" + DataBits + "," + PortName + "已经打开...");
}
/// <summary>
/// 开启监听线程
/// </summary>
private void StartReading()
{
_serialPort.DataReceived
+= new SerialDataReceivedEventHandler(ReadData);
}
/// <summary>
/// 关闭端口连接
/// </summary>
public void close()
{
_serialPort.Close();
// StatusChanged("关闭" + PortName + "连接......");
}
/// <summary>
/// 获取端口状态
/// </summary>
/// <returns></returns>
public bool IsOpen()
{

return _serialPort.IsOpen;
}
/// <summary>
/// 获取数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void ReadData(Object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(
300);
if (_serialPort.IsOpen)
{
//StatusChanged("正在获取数据... ...");
int bytes = _serialPort.BytesToRead;
byte[] buffer = new byte[bytes];
_serialPort.Read(buffer,
0, bytes);
DataReceived(buffer);
buffer
= null;
allDone.Set();
//StatusChanged("获取数据成功... ...");
}
}

/// <summary>
/// 写入数据
/// </summary>
public void SendData(byte[] WriteData)
{
if (_serialPort.IsOpen)
{
allDone.WaitOne(
500);
_serialPort.Write(WriteData,
0, WriteData.Length);
// StatusChanged("正在发送数据... ...");
}
}
问题补充: 还有获取数据 private void ReadData(Object sender, SerialDataReceivedEventArgs e) 这个方法中的 DataReceived(buffer); 是什么意思,为什么在这抛错,这个类我该如何调用,谢谢
mysun的主页 mysun | 初学一级 | 园豆:14
提问于:2011-04-25 16:00
< >
分享
所有回答(1)
0
//COM端口接收到数据后触发
void comPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
Thread.Sleep(
120);//暂停120毫秒等一条完整的命令进入缓冲区
byte[] c = new byte[50];//用来接收缓冲区收到的数据
try
{
comPort.Read(c,
0, 50);
}
catch { }
string oldOrder = "";
for (int i = 0; i < 50; i++)
{
string re = Convert.ToString(c[i], 16).ToUpper();
oldOrder
= oldOrder + re;

}
}

oldOrder就是你收到的数据。。。至于命令内容什么的你自己判断吧!

马战鹏 | 园豆:432 (菜鸟二级) | 2011-04-25 16:19
是这样,假设我在类Door中我有个开门的方法
public bool OpenDoorRemote(SerialPort port, List bufferGet, ref byte[] buf, string address, byte doorNum)
{
byte[] buffer = new byte[] {0x7E,0xD0 ,0x2C, 0x9D, 0x10 ,0x01, 0x01 ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0xAB,0x01,0x0D};
string dataString=serial.ConvertByteToString(buffer);
serial.SendDataToCOM(port, dataString);
在发送成功后,就接收返回的串,然后进行判断,我是解析ref buf这个参数然后进行判断,最后返回,但不知这样做对不对?要是在这个comPort_DataReceived事件中处理,就不能很好的封装
支持(0) 反对(0) mysun | 园豆:14 (初学一级) | 2011-04-25 16:27
为什么不能很好的封装?我就是在那个事件中调用方法进行解析的。没有觉得有什么不妥。。你说的那个不知道对不对的问题,你试下呗,顺便告诉me结果,我也学习学习!应该有硬件环境吧?连接上控制板,看其能不能执行你发送的命令!
支持(0) 反对(0) 马战鹏 | 园豆:432 (菜鸟二级) | 2011-04-26 08:31
有硬 件环境,现在发送都没问题,问题在于我想把这个硬件的接口单独封装起来,与serialport分别为两个类,现在我不知道样样在封装方法时在发送指令成功后同时能获取返回指令
支持(0) 反对(0) mysun | 园豆:14 (初学一级) | 2011-04-26 16:18
我感觉只能封装协议里面的内容和发送数据,接收数据还得通过serialport类来接收数据。
支持(0) 反对(0) 马战鹏 | 园豆:432 (菜鸟二级) | 2011-04-26 17:35
现在就是这不知怎么处理。事件中会捕获缓存中的数据,难不成为switchcase 来一个一个判断,但这个返回值在接口的方法中似乎是一点意义没有啊
支持(0) 反对(0) mysun | 园豆:14 (初学一级) | 2011-04-27 10:25
返回值在接口的方法中没有意义就不处理呗,只是把有意义的处理下。。。
支持(0) 反对(0) 马战鹏 | 园豆:432 (菜鸟二级) | 2011-04-27 14:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册