Rfid通信1-串口模式(附:对串口通讯进行了封装源码及学习资料)
2013-06-04 13:52
411 查看
点击打开链接
===========================================================================================================
程序预览:
程序运行,设置参数选择com4,打开,串口调试工具发送指令,程序接收指令
===========================================================================================================
代码解析:
代码特点:1.对串口类的封装(CSPDAO.cs);2:利用设计模式里的模板模式对串口数据发送和接收进行提取(Protocol文件夹)
CSPDAO.cs代码解析
/// <summary>
/// 请求命令队列
/// </summary>
private Queue<IProtocolReader> m_queueRequests;
/// <summary>
/// 应答数据集合
/// </summary>
private List<byte> m_listResponses;
/// <summary>
/// 发送线程同步信号
/// </summary>
private ManualResetEvent m_sendWaiter;
/// <summary>
/// 接收数据处理线程同步信号
/// </summary>
private ManualResetEvent m_receiveWaiter;
// 开启端口
m_serialPort = new SerialPort(portName, baudRate, (Parity)parity, dataBits, (StopBits)stopBits);
m_serialPort.DataReceived += SerialPortDataReceived;
m_serialPort.Open();
//
// 开启线程
m_bProtRunThdExit = false;
ThreadPool.QueueUserWorkItem(new WaitCallback(Polling)); // 轮询发送线程
ThreadPool.QueueUserWorkItem(new WaitCallback(Send)); // 命令发送线程
ThreadPool.QueueUserWorkItem(new WaitCallback(Received)); // 接收处理线程
Send方法
byte[] buffer = reader.GetCMDBytes();
m_serialPort.DiscardInBuffer();
m_serialPort.Write(buffer, 0, buffer.Length);
reader.Display();
SerialPortDataReceived方法
int iBytes = m_serialPort.BytesToRead ;
if (iBytes > 0)// m_serialPort.BytesToRead > 0
{
byte[] buffer = new byte[iBytes];
int readCount = m_serialPort.Read(buffer, 0, buffer.Length);
//
Monitor.Enter(m_listResponses);
m_listResponses.AddRange(buffer);
Monitor.Exit(m_listResponses);
}
Received方法
byte[] buffer = m_listResponses.GetRange(0, m_listResponses.Count).ToArray();
//m_oHandel.Process(buffer);
m_oHandel.Process(m_oReader, buffer);
m_listResponses.RemoveRange(0, m_listResponses.Count);
遇到的问题:
1.
//this.Invoke((EventHandler)(delegate
//{
// txtTags.Text = Tags;
//}));
this.BeginInvoke((EventHandler)(delegate
{
txtTags.Text = Tags;
}));
// 不使用Invoke原因:当点击关闭程序时,会出现无法访问已释放的对象。对象名:“MainForm”
// <位置:CSPDAO send(),catch>
2.硬件接法:因为阅读器出口接线是485,所以为了在pc机上能调试,接上了485转RS232,再接上RS232转USB
问题点:因为我想做串口重连这个功能,所以在程序运行过程中,拔掉usb,然后出现问题
"由于线程退出或应用程序请求,已放弃 I/O 操作","COM5不存在",接上usb后,程序可以跑一会,但过了一会出现"对端口的访问被拒绝",用try...catch...无法
找到网上的一些说法:
//文件句柄丢失,无解!!
//SerialPort设计时没考虑到:
//1:在Window系统中正常情况下打开的“文件”是不可能被删除。
//2:但虚拟串可却突破了这一点。
//所以,如果在“使用中”的USB转串口的设备,在未“Close”的情况下移除,那么将导致程序中的“SerialPort”对象即无法关闭,无法正常运行,也法重新再打开。
//如果有这种用法时,还是建议用标准串口
===========================================================================================================
程序预览:
程序运行,设置参数选择com4,打开,串口调试工具发送指令,程序接收指令
===========================================================================================================
代码解析:
代码特点:1.对串口类的封装(CSPDAO.cs);2:利用设计模式里的模板模式对串口数据发送和接收进行提取(Protocol文件夹)
CSPDAO.cs代码解析
/// <summary>
/// 请求命令队列
/// </summary>
private Queue<IProtocolReader> m_queueRequests;
/// <summary>
/// 应答数据集合
/// </summary>
private List<byte> m_listResponses;
/// <summary>
/// 发送线程同步信号
/// </summary>
private ManualResetEvent m_sendWaiter;
/// <summary>
/// 接收数据处理线程同步信号
/// </summary>
private ManualResetEvent m_receiveWaiter;
// 开启端口
m_serialPort = new SerialPort(portName, baudRate, (Parity)parity, dataBits, (StopBits)stopBits);
m_serialPort.DataReceived += SerialPortDataReceived;
m_serialPort.Open();
//
// 开启线程
m_bProtRunThdExit = false;
ThreadPool.QueueUserWorkItem(new WaitCallback(Polling)); // 轮询发送线程
ThreadPool.QueueUserWorkItem(new WaitCallback(Send)); // 命令发送线程
ThreadPool.QueueUserWorkItem(new WaitCallback(Received)); // 接收处理线程
Send方法
byte[] buffer = reader.GetCMDBytes();
m_serialPort.DiscardInBuffer();
m_serialPort.Write(buffer, 0, buffer.Length);
reader.Display();
SerialPortDataReceived方法
int iBytes = m_serialPort.BytesToRead ;
if (iBytes > 0)// m_serialPort.BytesToRead > 0
{
byte[] buffer = new byte[iBytes];
int readCount = m_serialPort.Read(buffer, 0, buffer.Length);
//
Monitor.Enter(m_listResponses);
m_listResponses.AddRange(buffer);
Monitor.Exit(m_listResponses);
}
Received方法
byte[] buffer = m_listResponses.GetRange(0, m_listResponses.Count).ToArray();
//m_oHandel.Process(buffer);
m_oHandel.Process(m_oReader, buffer);
m_listResponses.RemoveRange(0, m_listResponses.Count);
遇到的问题:
1.
//this.Invoke((EventHandler)(delegate
//{
// txtTags.Text = Tags;
//}));
this.BeginInvoke((EventHandler)(delegate
{
txtTags.Text = Tags;
}));
// 不使用Invoke原因:当点击关闭程序时,会出现无法访问已释放的对象。对象名:“MainForm”
// <位置:CSPDAO send(),catch>
2.硬件接法:因为阅读器出口接线是485,所以为了在pc机上能调试,接上了485转RS232,再接上RS232转USB
问题点:因为我想做串口重连这个功能,所以在程序运行过程中,拔掉usb,然后出现问题
"由于线程退出或应用程序请求,已放弃 I/O 操作","COM5不存在",接上usb后,程序可以跑一会,但过了一会出现"对端口的访问被拒绝",用try...catch...无法
找到网上的一些说法:
//文件句柄丢失,无解!!
//SerialPort设计时没考虑到:
//1:在Window系统中正常情况下打开的“文件”是不可能被删除。
//2:但虚拟串可却突破了这一点。
//所以,如果在“使用中”的USB转串口的设备,在未“Close”的情况下移除,那么将导致程序中的“SerialPort”对象即无法关闭,无法正常运行,也法重新再打开。
//如果有这种用法时,还是建议用标准串口
相关文章推荐
- 新手学习-Tcp的服务端与客户端之间进行通讯
- 学习设计模式资料
- 《Android 源码设计模式解析与实战》学习笔记
- openfire源码研究笔记:对设计模式及原则的学习
- 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等)
- 【J2me3D系列学习文章之三】(立即模式)对立方体进行变换操作-旋转、缩放、平移
- linux 下的串口程序学习资料
- 设计模式学习资料
- ActiveMQ学习(三)——MQ的通讯模式
- Android源码学习之单例模式应用及优点介绍
- Builder模式的误区:将复杂对象的构建进行封装,就是Builder模式了吗?
- Netty学习之旅----源码分析netty服务端初始化流程(Reactor主从模式实现)
- jQuery源码分析学习--资料收集--更新中
- [导入]关于整理出的设计模式系列各方面学习资料
- c#收发串口数据的源码(封装了windows api的类)
- 近200篇机器学习&深度学习资料分享(含各种文档,视频,源码等)
- C#设计模式学习资料--创建者模式
- 开源搜索框架Lucene学习之分词器(4)——通过分词器源码学习装饰者模式
- 公司财务发工资时,记录了当时发工资的资料Employee.txt 1.定义公司员工类Employee,属性有:工号,姓名,性别,工资(double类型),进行属性的隐藏和封装,重写toString.
- Android源码学习之三-Activity是如何进行自动化测试的