求救! serialport 串口通讯类的调用方法

tiewuqing 2010-11-25 02:01:04
.net 新手求救,最近做个纸币接收器的想项目 使用serialport 与串口通讯,因为要使用两台不通品牌的纸币接收器,所以网上找了个叶帆的【C#】串口操作实用类 地址:http://blog.csdn.net/yefanqiu/archive/2007/03/27/1543187.aspx

public class PortData
{
public event PortDataReceivedEventHandle Received;
public event SerialErrorReceivedEventHandler Error;
public SerialPort port;
public bool ReceiveEventFlag = false; //接收事件是否有效 false表示有效

public PortData(string sPortName, int baudrate,Parity parity,SerialInterface.SerialMode mode)
{
port = new SerialPort(sPortName, baudrate, parity, 8, StopBits.One);
port.RtsEnable = true;
port.ReadTimeout = 3000;
port.DataReceived += new SerialDataReceivedEventHandler(DataReceived);
port.ErrorReceived += new SerialErrorReceivedEventHandler(ErrorEvent);
}

~PortData()
{
Close();
}
public void Open()
{
if (!port.IsOpen)
{
port.Open();
}
}

public void Close()
{
if (port.IsOpen)
{
port.Close();
}
}
//数据发送
public void SendData(byte[] data)
{
if (port.IsOpen)
{
port.Write(data, 0, data.Length);
}
}
public void SendData(byte[] data,int offset,int count)
{
if (port.IsOpen)
{
port.Write(data, offset, count);
}
}
//发送命令
public int SendCommand(byte[] SendData, ref byte[] ReceiveData,int Overtime)
{

if(port.IsOpen)
{
ReceiveEventFlag = true; //关闭接收事件
port.DiscardInBuffer(); //清空接收缓冲区
port.Write(SendData, 0, SendData.Length);
int num=0,ret=0;
while (num++ < Overtime)
{
if (port.BytesToRead >= ReceiveData.Length) break;
System.Threading.Thread.Sleep(1);
}
if (port.BytesToRead >= ReceiveData.Length)
ret = port.Read(ReceiveData, 0, ReceiveData.Length);
ReceiveEventFlag = false; //打开事件
return ret;
}
return -1;
}

public void ErrorEvent(object sender, SerialErrorReceivedEventArgs e)
{
if (Error != null) Error(sender, e);
}
//数据接收
public void DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//禁止接收事件时直接退出
if (ReceiveEventFlag) return;

byte[] data = new byte[port.BytesToRead];
port.Read(data, 0, data.Length);
if (Received != null) Received(sender, new PortDataReciveEventArgs(data));
}

public bool IsOpen()
{
return port.IsOpen;
}
}
public delegate void PortDataReceivedEventHandle(object sender, PortDataReciveEventArgs e);
public class PortDataReciveEventArgs : EventArgs
{
public PortDataReciveEventArgs()
{
this.data = null;
}

public PortDataReciveEventArgs(byte[] data)
{
this.data = data;
}

private byte[] data;

public byte[] Data
{
get { return data; }
set { data = value; }
}
}

纸币接收器的命令都是单字节的,如查询连接状态:02h(12) 接收器回应 80h 8f 表示正常 26h 表示不可用,具体如何调用该通用类的,新手!对事件和委托不太熟悉,请高手给予示例!谢谢
...全文
371 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiewuqing 2010-11-26
  • 打赏
  • 举报
回复
串口调试软件可以接收数据 返回data总是 null 呢
port.Open();
byte[] send_data = new byte[1];
send_data[0] = 0x0c;
byte[] receive_data = new byte[2];
int i=port.SendCommand(send_data, ref receive_data, 1000);
PortDataReciveEventArgs kk = new PortDataReciveEventArgs();
i值不为零 也就是接收到数据 为什么kk.Data总为null
总也得不到值 该如何使用呢?
mohugomohu 2010-11-26
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20101126/15/f292f2ee-b5da-41e9-8c75-7da52cb50edb.html?13689
看看我的问题啊
mohugomohu 2010-11-26
  • 打赏
  • 举报
回复
顶!我也在学习啊!
tiewuqing 2010-11-26
  • 打赏
  • 举报
回复
也就是实时获取data的值,不需要发送命令 谢谢
tiewuqing 2010-11-25
  • 打赏
  • 举报
回复
您博客里写的是窗体级的代码 我想用一个通用类,因为使用不同型号的纸币接收器
现在通过这类返回接受数据 有点晕 呵呵 还望基于上面这个类给予指点
兔子-顾问 2010-11-25
  • 打赏
  • 举报
回复
博客中不是有源码下载么。
tiewuqing 2010-11-25
  • 打赏
  • 举报
回复
高手还得指点下 如何实时得到接受数据呢?
根据这个类 我要写出一个根据实时检测返回的数据 判断纸币接收器的状态
根据 public event PortDataReceivedEventHandle Received;
和public delegate void PortDataReceivedEventHandle(object sender, PortDataReciveEventArgs e);
public class PortDataReciveEventArgs : EventArgs

如何写方法呢 不太懂委托哦 谢谢


joefly1943 2010-11-25
  • 打赏
  • 举报
回复
学习一阵了!!谢谢
tiewuqing 2010-11-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuyazhe 的回复:]
看看我的博客?
http://blog.csdn.net/wuyazhe/category/695097.aspx
[/Quote]
得学习一阵了!!谢谢
tiewuqing 2010-11-25
  • 打赏
  • 举报
回复
因为该通用类 没有获取接收数据的方法 是serialport 事件委托

public void DataReceived(object sender, SerialDataReceivedEventArgs e)
{
//禁止接收事件时直接退出
if (ReceiveEventFlag) return;

byte[] data = new byte[port.BytesToRead];
port.Read(data, 0, data.Length);
if (Received != null) Received(sender, new PortDataReciveEventArgs(data));
}
我想在UI 界面 Textbox 获得接收数据 该如何调用呢
xuguidong1982 2010-11-25
  • 打赏
  • 举报
回复
不明白
兔子-顾问 2010-11-25
  • 打赏
  • 举报
回复
看看我的博客?
http://blog.csdn.net/wuyazhe/category/695097.aspx
tiewuqing 2010-11-25
  • 打赏
  • 举报
回复
谢谢 要是不发送命令 实时获取接收数据该如何处理呢
xx_lzj 2010-11-25
  • 打赏
  • 举报
回复
PortData comPort = new PortData("COM1:", 115200, Parity.Even);
byte[] bytSendArray = new byte[1]; //发送数据缓冲区
bytSendArray[0]=0x02;
byte[] bytReceiveArray = new byte[2];
intReceiveNum = comPort.SendCommand(bytSendArray, ref bytReceiveArray, 200);
comPort.Close();
if(bytReceiveArray[0]!=0x26)
{
//可用处理
}
else
{
//不可用处理
}
tiewuqing 2010-11-25
  • 打赏
  • 举报
回复
高手现身哦!
tiewuqing 2010-11-25
  • 打赏
  • 举报
回复
PortData comPort = new PortData("COM1:", 115200, Parity.Even);
byte[] bytSendArray = new byte[2]; //发送数据缓冲区
bytSendArray[0]=0xAC;
bytSendArray[2]=0xAA;
byte[] bytReceiveArray = new byte[5];
//该命令潜台词是你发送了两个字节的数据0xAC,0xAA 下位机应该在200毫秒超时内返回5个字节的数据
intReceiveNum = comPort.SendCommand(bytSendData, ref bytReceiveArray, 200);
//intReceiveNum为实际返回的数据个数,返回的数据放在bytReceiveArray中
comPort.Close();
作者给出的示例代码 是从发送命令返回接收数据的,如何得到 实时接收的数据来判断纸币接收器的状态呢

110,533

社区成员

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

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

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