C#串口编程 & C#调用dll
最近在开发一套终端机上的自助服务软件,有许多地方需要软硬件交互,串口编程就显得尤其重要了。下面就以扫描枪为例,看看C#后台是如何获取扫描条码的。首先需要using System.IO.Ports。
1 static void Main(string[] args) 2 { 3 //string[] PortList = SerialPort.GetPortNames(); 4 //foreach (var ComItem in PortList) 5 //{ 6 // if (ComItem == "COM4") 7 // { 8 SerialPort mySerialPort = new SerialPort("COM4", 9600, Parity.None, 8, StopBits.One); 9 mySerialPort.Handshake = Handshake.None; 10 mySerialPort.DataReceived += new SerialDataReceivedEventHandler(DataReceviedHandler); 11 mySerialPort.Open(); 12 13 Console.WriteLine("Press any key to continue..."); 14 Console.ReadKey(); 15 mySerialPort.Close(); 16 // } 17 // } 18 } 19 private static void DataReceviedHandler(object sender, SerialDataReceivedEventArgs e) 20 { 21 SerialPort sp = (SerialPort)sender; 22 Thread.Sleep(100); 23 string dataReceived = sp.ReadExisting(); 24 Console.WriteLine("Data Received:" + dataReceived); 25 }
以上只是从硬件串口读取数据,若要向串口发送数据,可采用如下方法:
1 static public int Get_CheckXor(byte[] temp, int len) 2 { 3 int resultByte = 0; 4 for (int i = 0; i < len; i++) 5 { 6 resultByte ^= temp[i]; 7 } 8 string hexVal = Convert.ToString(resultByte, 16); 9 return Int32.Parse(hexVal, System.Globalization.NumberStyles.HexNumber); 10 } 11 12 byte[] Reset = new byte[9]; 13 Reset[0] = 0xF2; 14 Reset[1] = 0x00; 15 Reset[2] = 0x00; 16 Reset[3] = 0x03; 17 Reset[4] = 0x43; 18 Reset[5] = 0x30; 19 Reset[6] = 0x33; 20 Reset[7] = 0x03; 21 Reset[8] = Convert.ToByte(Get_CheckXor(Reset, Reset.Length - 1)); //最后一位奇偶校验位 22 if (!mySerialPort.IsOpen) 23 mySerialPort.Open(); 24 mySerialPort.Write(Reset, 0, Reset.Length);
当然,有时候我们的C#程序需要调用C++写的底层硬件dll,这个时候就要用到System.Runtime.InteropServices这个命名空间了。首先将dll文件放到C#程序的bin目录下,再如下方式声明
1 [DllImport(@"MCReader.dll", EntryPoint = "MCReader_Init")] 2 private static extern int MCReader_Init(Event_Callback cbFun, UInt32 param);
然后就可以直接使用该dll中封装的方法了。 这个时候需要注意C++的数据类型需要转换成相应的C#类型。
若想将C#控制台程序编译成dll,只需将项目的输出类型改成Class Library即可。