最近写C#串口通信程序,系统是B/S架构。SerialPort类有一个DataReceived事件,用来接收串口返回的数据,但这种方式在C/S架构下很好用,但B/S就不好处理了。所以写了一个同步模式接收返回数据的方法,不使用DataReceived事件。经过测试,可以正常使用。
一、MachineFactory类
为什么使用工厂类:售货机由不止一个厂家提供,接口协议都不一样。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.IO; using System.IO.Ports; namespace IMachineDll { /// <summary> /// 售货机工厂类 /// </summary> public class MachineFactory { /// <summary> /// 货机接口缓存 /// </summary> private static Dictionary<string, IMachine> dicMachine = new Dictionary<string, IMachine>(); /// <summary> /// 锁变量 /// </summary> public static object _lock = new object(); /// <summary> /// 创建售货机类 /// </summary> /// <param name="path">DLL物理路径</param> /// <param name="dllName">DLL名称(不含扩展名),命名空间必须为DLL名称加“Dll”后缀,类名必须和DLL名称相同</param> /// <param name="com">串口名称,如:COM1</param> public static IMachine Create(string path, string dllName, string com) { if (!dicMachine.ContainsKey(dllName) || dicMachine[dllName] == null) { using (FileStream fs = new FileStream(path + dllName + ".dll", FileMode.Open, FileAccess.Read)) { using (MemoryStream ms = new MemoryStream()) { byte[] byteArray = new byte[4096]; while (fs.Read(byteArray, 0, byteArray.Length) > 0) { ms.Write(byteArray, 0, byteArray.Length); } Assembly assembly = Assembly.Load(ms.ToArray()); dicMachine[dllName] = (IMachine)assembly.CreateInstance(dllName + "Dll." + dllName, false, BindingFlags.Default, null, new object[] { com }, null, null); } } } return dicMachine[dllName]; } } }