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即可。

 

 

 

posted @ 2012-09-29 14:38  编不好程的东东不是一个好歌手  阅读(1119)  评论(0编辑  收藏  举报