C#串口操作的使用浅析

C#串口操作的使用:做工业通信有很长时间了,特别是串口(232/485),有VB/VC/C各种版本的串口操作代码,这些代码也经过了多年的现场考验,应该说是比较健壮的代码,但是目前却没有C#相对成熟的串口操作代码,最近用Moxa的设备开发基于WinCE5.0的C#串口操作代码,所以就扩充完善了一下C#串口操作,特别是SendCommand函数,这是我比较常用的主从通信代码,不喜欢用事件或线程接数据,在规定的超时时间内直接循环判断要接收的数据。

下面是具体C#串口操作的代码:

 
  
  1. public class PortData  
  2. {  
  3. public event PortDataReceivedEventHandle Received;  
  4. public event SerialErrorReceivedEventHandler Error;   
  5. public SerialPort port;  
  6. public bool ReceiveEventFlag = false;   
  7.  //接收事件是否有效 false表示有效  
  8.  
  9. public PortData(string sPortName,   
  10. int baudrate,Parity parity,SerialInterface.SerialMode mode)  
  11. {  
  12. port = new SerialPort(sPortName,   
  13. baudrate, parity, 8, StopBits.One);  
  14. port.RtsEnable = true;  
  15. port.ReadTimeout = 3000;  
  16. port.DataReceived +=   
  17. new SerialDataReceivedEventHandler(DataReceived);  
  18. port.ErrorReceived +=   
  19. new SerialErrorReceivedEventHandler(ErrorEvent);  
  20. }  
  21.  
  22. ~PortData()  
  23. {  
  24. Close();  
  25. }  
  26. public void Open()  
  27. {  
  28. if (!port.IsOpen)  
  29. {     
  30. port.Open();  
  31. }  
  32. }  
  33.  
  34. public void Close()  
  35. {  
  36. if (port.IsOpen)  
  37. {  
  38. port.Close();  
  39. }  
  40. }  
  41. //C#串口操作之数据发送  
  42. public void SendData(byte[] data)  
  43. {  
  44. if (port.IsOpen)  
  45. {  
  46. port.Write(data, 0, data.Length);  
  47. }  
  48. }  
  49. public void SendData(byte[] data,  
  50. int offset,int count)  
  51. {  
  52. if (port.IsOpen)  
  53. {  
  54. port.Write(data, offset, count);  
  55. }  
  56. }  
  57. //C#串口操作之发送命令  
  58. public int SendCommand(byte[] SendData,  
  59.  ref  byte[] ReceiveData,int Overtime)  
  60. {  
  61.  
  62. if(port.IsOpen)  
  63. {  
  64. ReceiveEventFlag = true;//关闭接收事件  
  65. port.DiscardInBuffer(); //清空接收缓冲区   
  66. port.Write(SendData, 0, SendData.Length);  
  67. int num=0,ret=0;  
  68. while (num++ < Overtime)  
  69. {  
  70. if (port.BytesToRead >= ReceiveData.Length) break;  
  71. System.Threading.Thread.Sleep(1);   
  72. }  
  73. if (port.BytesToRead >= ReceiveData.Length)   
  74. ret = port.Read(ReceiveData, 0, ReceiveData.Length);  
  75. ReceiveEventFlag = false;   //打开事件  
  76. return ret;  
  77. }  
  78. return -1;  
  79. }  
  80.  
  81. public void ErrorEvent(object sender,  
  82.  SerialErrorReceivedEventArgs e)  
  83. {  
  84. if (Error != null) Error(sender, e);  
  85. }  
  86. //C#串口操作之数据接收  
  87. public void DataReceived(object sender,  
  88.  SerialDataReceivedEventArgs e)  
  89. {  
  90. //禁止接收事件时直接退出  
  91. if (ReceiveEventFlag) return;  
  92.  
  93. byte[] data = new byte[port.BytesToRead];  
  94. port.Read(data, 0, data.Length);  
  95. if (Received != null) Received(sender,   
  96. new PortDataReciveEventArgs(data));  
  97. }  
  98.  
  99. public bool IsOpen()  
  100. {  
  101. return port.IsOpen;  
  102. }  
  103. }  
  104. public delegate void PortDataReceivedEventHandle(  
  105. object sender, PortDataReciveEventArgs e);  
  106. public class PortDataReciveEventArgs : EventArgs  
  107. {  
  108. public PortDataReciveEventArgs()  
  109. {  
  110. this.data = null;  
  111. }  
  112.  
  113. public PortDataReciveEventArgs(byte[] data)  
  114. {  
  115. this.data = data;  
  116. }  
  117.  
  118. private byte[] data;  
  119.  
  120. public byte[] Data  
  121. {  
  122. get { return data; }  
  123. set { data = value; }  
  124. }  
  125. }  

注:1~9 串口的名称是 "COMx:",>9的以前用////.//COMx:比较好使,但是在moxa 661设备上却不行,要用如下格式"$device//COM" + PortNo.ToString() + "/0",也许这是moxa修改了相应的串口驱动。

C#串口操作的一些内容就向你介绍到这里,希望对你了解和学习使用C#串口操作有所帮助。

你可能感兴趣的:(C#串口操作的使用浅析)