C#串口操作的使用浅析

开发 后端
C#串口操作在工业通信方面的应用是如何的呢?那么本文就向你介绍C#串口操作在工业通信编程中使用的心得体会,希望对你了解和学习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#串口操作有所帮助。

【编辑推荐】

  1. 深度剖析C#序列化和反序列化
  2. 深入探讨C#序列化和反序列化
  3. C# XML序列化应用浅析
  4. C#对象序列化应用浅析
  5. C#工具栏的编程实现浅析
责任编辑:仲衡 来源: 博客园
相关推荐

2009-08-17 13:34:02

C#异步操作

2009-09-11 11:27:38

AttributeUsC# Attribut

2009-08-14 15:23:10

C#使用ErrorPr

2009-08-18 13:49:21

C# 操作Excel

2009-09-07 06:07:46

C#窗体设计

2009-08-19 10:25:14

C#操作Word

2009-08-26 13:48:31

C#打印条码

2009-08-18 09:37:14

C#枚举类型

2009-09-04 15:45:29

C#缓存流

2009-09-18 10:58:31

C#数组操作

2009-08-19 11:34:06

C#操作Word

2009-08-19 11:13:49

C#操作Word

2009-08-31 18:38:59

C#写文件

2009-08-18 16:04:12

C# 操作Excel

2009-08-20 10:25:37

C#操作内存

2009-08-19 09:42:52

C#操作Word书签

2009-08-20 10:53:23

C#操作内存

2009-08-25 16:29:33

C#使用sqlserv

2009-08-19 16:42:41

C#如何使用XML

2009-08-13 13:29:04

C#结构体使用
点赞
收藏

51CTO技术栈公众号