搜索
bottom↓
回复: 81

C#求推荐教程 想用它做串口通信

  [复制链接]

出0入0汤圆

发表于 2014-11-24 15:59:42 | 显示全部楼层 |阅读模式
求大神推荐下C#教程,想用它做串口通信,将下位机的数据通过串口上传,图行显示就这样,嘿嘿 怎样快速入门呢,我会C 嘿嘿

出0入0汤圆

发表于 2014-11-24 16:04:55 | 显示全部楼层
去codeproject找,如:http://www.codeproject.com/Artic ... sharp-for-Beginners

出0入8汤圆

发表于 2014-11-24 16:14:17 | 显示全部楼层
我也是和你一样的基础学的C#,也是要用串口,这个很容易弄的,都是控件,拖进来就好

出0入0汤圆

 楼主| 发表于 2014-11-24 16:16:14 | 显示全部楼层
百里屠苏 发表于 2014-11-24 16:14
我也是和你一样的基础学的C#,也是要用串口,这个很容易弄的,都是控件,拖进来就好 ...

是吗,看到这个信心倍增,吼吼

出0入0汤圆

 楼主| 发表于 2014-11-24 16:16:42 | 显示全部楼层
qinshi1208 发表于 2014-11-24 16:04
去codeproject找,如:http://www.codeproject.com/Articles/678025/Serial-Comms-in-Csharp-for-Beginners ...

哥们  谢谢了,能不能推荐一点资料呢。

出0入0汤圆

 楼主| 发表于 2014-11-24 16:19:51 | 显示全部楼层
qinshi1208 发表于 2014-11-24 16:04
去codeproject找,如:http://www.codeproject.com/Articles/678025/Serial-Comms-in-Csharp-for-Beginners ...

网页打开的很慢,全英文的啊

出0入0汤圆

发表于 2014-11-24 16:40:47 | 显示全部楼层
会用c么用vc++6.0最简单,如果用vs2005以上版本么SerialPort类最简单。

出5入8汤圆

发表于 2014-11-24 16:43:08 | 显示全部楼层
链接: http://pan.baidu.com/s/1qWmGT7e 密码: fx53
杜洋的C#视屏教程和源码,里面主要讲的就是用C#写串口助手,可以参考。

出0入0汤圆

发表于 2014-11-24 16:50:05 | 显示全部楼层
diyeyuye 发表于 2014-11-24 16:43
链接: http://pan.baidu.com/s/1qWmGT7e 密码: fx53
杜洋的C#视屏教程和源码,里面主要讲的就是用C#写串口 ...

   太感谢了  最近也在找这方面的资料看呢,平时编写个实用的小上位机啥的,网上找的很多视频都是从神马语法开始的,看着都头大

出0入0汤圆

 楼主| 发表于 2014-11-24 16:52:46 | 显示全部楼层
mubei 发表于 2014-11-24 16:50
太感谢了  最近也在找这方面的资料看呢,平时编写个实用的小上位机啥的,网上找的很多视频都 ...

还不感谢楼主大人

出0入0汤圆

 楼主| 发表于 2014-11-24 16:53:17 | 显示全部楼层
diyeyuye 发表于 2014-11-24 16:43
链接: http://pan.baidu.com/s/1qWmGT7e 密码: fx53
杜洋的C#视屏教程和源码,里面主要讲的就是用C#写串口 ...

下载去  嘿嘿

出0入0汤圆

发表于 2014-11-24 16:54:50 | 显示全部楼层

我也来点 刚刚下载8楼资料时意外发现的 一个哥们的分享   
http://pan.baidu.com/share/home? ... are#category/type=0
资料更加全  

出0入0汤圆

 楼主| 发表于 2014-11-24 16:57:16 | 显示全部楼层
mubei 发表于 2014-11-24 16:54
我也来点 刚刚下载8楼资料时意外发现的 一个哥们的分享   
http://pan.baidu.com/share/home?uk=3928540 ...

这东西是有点多

出0入0汤圆

发表于 2014-11-24 17:10:16 | 显示全部楼层
正需要那,不错的资料

出0入0汤圆

发表于 2014-11-24 17:14:19 | 显示全部楼层
没用过C#,准备开始学习学习!~

出0入0汤圆

发表于 2014-11-24 17:17:40 | 显示全部楼层
2楼是纯装13的,完全不解决任何问题

出0入0汤圆

发表于 2014-11-24 17:21:07 | 显示全部楼层
diyeyuye 发表于 2014-11-24 16:43
链接: http://pan.baidu.com/s/1qWmGT7e 密码: fx53
杜洋的C#视屏教程和源码,里面主要讲的就是用C#写串口 ...

牛逼啊 兄弟

出0入0汤圆

发表于 2014-11-24 17:23:02 | 显示全部楼层
.net本身带serialport组件

出0入0汤圆

发表于 2014-11-24 17:24:11 | 显示全部楼层
http://www.amobbs.com/thread-5588053-1-1.html
这是我结合春风电源写的界面

出0入0汤圆

发表于 2014-11-24 17:35:40 | 显示全部楼层
diyeyuye 发表于 2014-11-24 16:43
链接: http://pan.baidu.com/s/1qWmGT7e 密码: fx53
杜洋的C#视屏教程和源码,里面主要讲的就是用C#写串口 ...

谢了,刚好要用的。。。

出0入0汤圆

发表于 2014-11-24 18:11:01 来自手机 | 显示全部楼层
xtrig 发表于 2014-11-24 17:23
.net本身带serialport组件

.net2003不带,.net2005及以上才带。

出5入8汤圆

发表于 2014-11-24 18:13:45 | 显示全部楼层
mubei 发表于 2014-11-24 16:50
太感谢了  最近也在找这方面的资料看呢,平时编写个实用的小上位机啥的,网上找的很多视频都 ...

2块大洋在杜洋工作室的淘宝店买的,哈哈

出5入8汤圆

发表于 2014-11-24 18:14:55 | 显示全部楼层

2块大洋在杜洋工作室的淘宝店买的,哈哈

出0入0汤圆

发表于 2014-11-24 19:15:33 | 显示全部楼层
diyeyuye 发表于 2014-11-24 18:13
2块大洋在杜洋工作室的淘宝店买的,哈哈

我给的链接资料很全奥,比你那个还多,无意中看到的

出0入85汤圆

发表于 2014-11-24 19:44:07 | 显示全部楼层
mubei 发表于 2014-11-24 19:15
我给的链接资料很全奥,比你那个还多,无意中看到的

貌似下不了啊?大小都是1k?

出0入0汤圆

发表于 2014-11-24 19:49:19 | 显示全部楼层
marshallemon 发表于 2014-11-24 19:44
貌似下不了啊?大小都是1k?

啊?我还真没注意看

出0入0汤圆

 楼主| 发表于 2014-11-24 20:11:46 | 显示全部楼层
gallop020142 发表于 2014-11-24 17:24
http://www.amobbs.com/thread-5588053-1-1.html
这是我结合春风电源写的界面

感觉不错,支持了

出0入0汤圆

 楼主| 发表于 2014-11-24 20:12:05 | 显示全部楼层
diyeyuye 发表于 2014-11-24 18:14
2块大洋在杜洋工作室的淘宝店买的,哈哈

感谢共享,赞一个先嘿嘿

出0入0汤圆

发表于 2014-11-24 20:19:46 | 显示全部楼层
marshallemon 发表于 2014-11-24 19:44
貌似下不了啊?大小都是1k?


文件存在啊!你是不是下载错了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2014-11-25 09:44:51 | 显示全部楼层
百度  搜索一大把

出0入0汤圆

发表于 2015-1-24 10:42:21 | 显示全部楼层
强人太多了,佩服的五体投地

出0入0汤圆

发表于 2015-1-24 16:06:25 | 显示全部楼层
mubei 发表于 2014-11-24 16:54
我也来点 刚刚下载8楼资料时意外发现的 一个哥们的分享   
http://pan.baidu.com/share/home?uk=3928540 ...

怒赞,,资料真的草鸡多。。。

出0入0汤圆

发表于 2015-1-24 16:54:06 | 显示全部楼层
资料挺多的,谢谢大家分享

出0入0汤圆

发表于 2015-1-24 21:40:47 来自手机 | 显示全部楼层
嘿嘿,正需要,非常感谢。

出0入0汤圆

发表于 2015-1-24 23:46:34 | 显示全部楼层
diyeyuye 发表于 2014-11-24 16:43
链接: http://pan.baidu.com/s/1qWmGT7e 密码: fx53
杜洋的C#视屏教程和源码,里面主要讲的就是用C#写串口 ...

谢谢,我也需要!!!

出0入0汤圆

发表于 2015-1-25 12:01:43 来自手机 | 显示全部楼层
论坛里不是有用它做了串口调试工具的么 看看不就明白了。

出0入0汤圆

 楼主| 发表于 2015-1-25 12:46:37 | 显示全部楼层
1066950103 发表于 2015-1-25 12:01
论坛里不是有用它做了串口调试工具的么 看看不就明白了。

求链接 嘿嘿

出0入0汤圆

发表于 2015-1-25 13:30:55 | 显示全部楼层
和你一样学习中

出0入0汤圆

发表于 2015-1-27 12:54:59 | 显示全部楼层

http://www.amobbs.com/forum.php? ... B%E4%B8%B2%E5%8F%A3 这个可以么?

出0入0汤圆

发表于 2015-1-30 16:04:34 | 显示全部楼层
diyeyuye 发表于 2014-11-24 16:43
链接: http://pan.baidu.com/s/1qWmGT7e 密码: fx53
杜洋的C#视屏教程和源码,里面主要讲的就是用C#写串口 ...

谢谢教程

出0入0汤圆

发表于 2015-2-2 09:00:21 | 显示全部楼层
mubei 发表于 2014-11-24 16:54
我也来点 刚刚下载8楼资料时意外发现的 一个哥们的分享   
http://pan.baidu.com/share/home?uk=3928540 ...

这资料也太多了,找了几个可能会用到的收藏了。

出0入0汤圆

发表于 2015-2-2 10:39:14 | 显示全部楼层
diyeyuye 发表于 2014-11-24 16:43
链接: http://pan.baidu.com/s/1qWmGT7e 密码: fx53
杜洋的C#视屏教程和源码,里面主要讲的就是用C#写串口 ...

漂亮,杜洋的东西一般入门还是不错的

出0入0汤圆

发表于 2015-2-2 10:41:07 | 显示全部楼层
qinshi1208 发表于 2014-11-24 16:04
去codeproject找,如:http://www.codeproject.com/Articles/678025/Serial-Comms-in-Csharp-for-Beginners ...

不错,讲解很详细

出0入4汤圆

发表于 2015-2-2 11:50:22 | 显示全部楼层
百度下例程一堆,直接上,碰到不懂就百度,这样效率很高哦呵呵

出0入0汤圆

发表于 2015-2-2 23:29:13 | 显示全部楼层
我现在开始完全转向C++,发现C++才是学C的人应该升级的。

出0入0汤圆

发表于 2015-2-2 23:41:49 | 显示全部楼层
资料挺多的,想了解一门上位机软件平台,总是坚持不下来

出870入263汤圆

发表于 2015-2-3 17:11:04 | 显示全部楼层
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;

  4. namespace SerialEngineLibrary
  5. {
  6.     using System.Security;
  7.     using Microsoft.Win32;
  8.     using System.Diagnostics;
  9.     using System.Threading;
  10.     using System.Security.Permissions;
  11.     using Microsoft.Win32.SafeHandles;
  12.     using System.Runtime.InteropServices;

  13.     public unsafe sealed class SerialEngine : IDisposable
  14.     {
  15.         public const uint MAXDWORD = 0xFFFFFFFFu;

  16.         public delegate void DataArrivalEventHandler(byte[] data, int count);
  17.         public delegate void EngineEventHandler(EngineEventType ev, object arg);
  18.         public NativeAPI.COMMPROP m_commProp = default(NativeAPI.COMMPROP);

  19.         #region 私有变量。

  20.         private NativeAPI.COMMTIMEOUTS m_timeouts = default(NativeAPI.COMMTIMEOUTS);
  21.         private NativeAPI.DCB m_dcb = default(NativeAPI.DCB);
  22.         private CommEvMask m_commEventMask = CommEvMask.NONE;
  23.         private int m_readBufferSize, m_writeBufferSize;
  24.         private SafeFileHandle m_serialPort = null;
  25.         private bool m_isAsyncMode = false;
  26.         private bool m_keepLooping = false;
  27.         private string m_portName = "COM1";
  28.         
  29.         #endregion

  30.         #region 构造器。

  31.         public SerialEngine()
  32.         {
  33.             m_dcb.DCBlength = (uint)Marshal.SizeOf(m_dcb);
  34.             this.BaudRate = 9600;
  35.             this.BinaryMode = true;
  36.             this.Parity = ParityValue.NO;
  37.             this.OutxCtsFlow = false;
  38.             this.OutxDsrFlow = false;
  39.             this.DtrControl = DtrControlValue.DISABLE;
  40.             this.DsrSensitivity = false;
  41.             this.TXContinueOnXoff = true;
  42.             this.OutXEnable = false;
  43.             this.InXEnable = false;
  44.             this.ErrorCharEnable = false;
  45.             this.NullDiscarded = false;
  46.             this.RtsControl = RtsControlValue.DISABLE;
  47.             this.AbortOnError = false;
  48.             this.XonLim = 8;
  49.             this.XoffLim = 1000;
  50.             this.ByteSize = 8;
  51.             this.StopBits = StopBitsValue.ONE;
  52.             this.XonChar = (byte)'<';
  53.             this.XoffChar = (byte)'>';
  54.             this.ErrorChar = (byte)'?';
  55.             this.EofChar = (byte)'\n';
  56.             this.EventChar = (byte)'!';
  57.             this.ReadBufferSize = 4096;
  58.             this.WriteBufferSize = 2048;
  59.             this.ReadIntervalTimeout = 30;
  60.             this.ReadTotalTimeoutMultiplier = 0;
  61.             this.ReadTotalTimeoutConstant = 500;
  62.             this.WriteTotalTimeoutMultiplier = 5;
  63.             this.WriteTotalTimeoutConstant = 1000;
  64.             /* 开启9个受支持的串口事件侦测标志 */
  65.             m_commEventMask = (CommEvMask)0x1FFu;
  66.         }

  67.         #endregion

  68.         #region 属性。

  69.         public SafeFileHandle Handle
  70.         {
  71.             get { return m_serialPort; }
  72.         }

  73.         public bool IsOpen
  74.         {
  75.             get
  76.             {
  77.                 if (m_serialPort == null)
  78.                 {
  79.                     return false;
  80.                 }
  81.                 if (m_serialPort.IsInvalid)
  82.                 {
  83.                     m_serialPort = null;
  84.                     return false;
  85.                 }
  86.                 if (m_serialPort.IsClosed)
  87.                 {
  88.                     m_serialPort = null;
  89.                     return false;
  90.                 }
  91.                 return true;
  92.             }
  93.         }

  94.         public bool IsAsyncMode
  95.         {
  96.             get { return m_isAsyncMode; }
  97.         }

  98.         public CommEvMask EventMask
  99.         {
  100.             get { return m_commEventMask; }
  101.             set { m_commEventMask = value; }
  102.         }

  103.         public int ReadBufferSize
  104.         {
  105.             get { return m_readBufferSize; }
  106.             set { m_readBufferSize = value; }
  107.         }

  108.         public int WriteBufferSize
  109.         {
  110.             get { return m_writeBufferSize; }
  111.             set { m_writeBufferSize = value; }
  112.         }

  113.         public string PortName
  114.         {
  115.             get { return m_portName; }
  116.             set
  117.             {
  118.                 m_portName = value;
  119.             }
  120.         }

  121.         public uint BaudRate
  122.         {
  123.             get { return m_dcb.BaudRate; }
  124.             set
  125.             {
  126.                 m_dcb.BaudRate = value;
  127.                 if (IsOpen)
  128.                 {
  129.                     if (!NativeAPI.SetCommState(m_serialPort, ref m_dcb))
  130.                     {
  131.                         throw new ApplicationException("波特率设置失败");
  132.                     }
  133.                 }
  134.             }
  135.         }

  136.         public bool BinaryMode
  137.         {
  138.             get { return (m_dcb.GetFlag(NativeAPI.DcbFlags.fBinary, 1) != 0); }
  139.             set { m_dcb.SetFlag(NativeAPI.DcbFlags.fBinary, 1, value ? 1u : 0u); }
  140.         }

  141.         public ParityValue Parity
  142.         {
  143.             get { return (ParityValue)m_dcb.Parity; }
  144.             set
  145.             {
  146.                 m_dcb.Parity = (byte)value;
  147.                 if (value == ParityValue.NO)
  148.                 {
  149.                     m_dcb.SetFlag(NativeAPI.DcbFlags.fParity, 1, 0u);
  150.                 }
  151.                 else
  152.                 {
  153.                     m_dcb.SetFlag(NativeAPI.DcbFlags.fParity, 1, 1u);
  154.                 }
  155.             }
  156.         }

  157.         public bool OutxCtsFlow
  158.         {
  159.             get { return (m_dcb.GetFlag(NativeAPI.DcbFlags.fOutxCtsFlow, 1) != 0); }
  160.             set { m_dcb.SetFlag(NativeAPI.DcbFlags.fOutxCtsFlow, 1, value ? 1u : 0u); }
  161.         }

  162.         public bool OutxDsrFlow
  163.         {
  164.             get { return (m_dcb.GetFlag(NativeAPI.DcbFlags.fOutxDsrFlow, 1) != 0); }
  165.             set { m_dcb.SetFlag(NativeAPI.DcbFlags.fOutxDsrFlow, 1, value ? 1u : 0u); }
  166.         }

  167.         public DtrControlValue DtrControl
  168.         {
  169.             get { return (DtrControlValue)m_dcb.GetFlag(NativeAPI.DcbFlags.fDtrControl, 2); }
  170.             set { m_dcb.SetFlag(NativeAPI.DcbFlags.fDtrControl, 2, (uint)value); }
  171.         }

  172.         public bool DsrSensitivity
  173.         {
  174.             get { return (m_dcb.GetFlag(NativeAPI.DcbFlags.fDsrSensitivity, 1) != 0); }
  175.             set { m_dcb.SetFlag(NativeAPI.DcbFlags.fDsrSensitivity, 1, value ? 1u : 0u); }
  176.         }

  177.         public bool TXContinueOnXoff
  178.         {
  179.             get { return (m_dcb.GetFlag(NativeAPI.DcbFlags.fTXContinueOnXoff, 1) != 0); }
  180.             set { m_dcb.SetFlag(NativeAPI.DcbFlags.fTXContinueOnXoff, 1, value ? 1u : 0u); }
  181.         }

  182.         public bool OutXEnable
  183.         {
  184.             get { return (m_dcb.GetFlag(NativeAPI.DcbFlags.fOutX, 1) != 0); }
  185.             set { m_dcb.SetFlag(NativeAPI.DcbFlags.fOutX, 1, value ? 1u : 0u); }
  186.         }

  187.         public bool InXEnable
  188.         {
  189.             get { return (m_dcb.GetFlag(NativeAPI.DcbFlags.fInX, 1) != 0); }
  190.             set { m_dcb.SetFlag(NativeAPI.DcbFlags.fInX, 1, value ? 1u : 0u); }
  191.         }

  192.         public bool ErrorCharEnable
  193.         {
  194.             get { return (m_dcb.GetFlag(NativeAPI.DcbFlags.fErrorChar, 1) != 0); }
  195.             set { m_dcb.SetFlag(NativeAPI.DcbFlags.fErrorChar, 1, value ? 1u : 0u); }
  196.         }

  197.         public bool NullDiscarded
  198.         {
  199.             get { return (m_dcb.GetFlag(NativeAPI.DcbFlags.fNull, 1) != 0); }
  200.             set { m_dcb.SetFlag(NativeAPI.DcbFlags.fNull, 1, value ? 1u : 0u); }
  201.         }

  202.         public RtsControlValue RtsControl
  203.         {
  204.             get { return (RtsControlValue)m_dcb.GetFlag(NativeAPI.DcbFlags.fRtsControl, 2); }
  205.             set { m_dcb.SetFlag(NativeAPI.DcbFlags.fRtsControl, 2, (uint)value); }
  206.         }

  207.         public bool AbortOnError
  208.         {
  209.             get { return (m_dcb.GetFlag(NativeAPI.DcbFlags.fAbortOnError, 1) != 0); }
  210.             set { m_dcb.SetFlag(NativeAPI.DcbFlags.fAbortOnError, 1, value ? 1u : 0u); }
  211.         }

  212.         public ushort XonLim
  213.         {
  214.             get { return m_dcb.XonLim; }
  215.             set { m_dcb.XonLim = value; }
  216.         }

  217.         public ushort XoffLim
  218.         {
  219.             get { return m_dcb.XoffLim; }
  220.             set { m_dcb.XoffLim = value; }
  221.         }

  222.         public byte ByteSize
  223.         {
  224.             get { return m_dcb.ByteSize; }
  225.             set { m_dcb.ByteSize = value; }
  226.         }

  227.         public StopBitsValue StopBits
  228.         {
  229.             get { return (StopBitsValue)m_dcb.StopBits; }
  230.             set { m_dcb.StopBits = (byte)value; }
  231.         }

  232.         public byte XonChar
  233.         {
  234.             get { return m_dcb.XonChar; }
  235.             set { m_dcb.XonChar = value; }
  236.         }

  237.         public byte XoffChar
  238.         {
  239.             get { return m_dcb.XoffChar; }
  240.             set { m_dcb.XoffChar = value; }
  241.         }

  242.         public byte ErrorChar
  243.         {
  244.             get { return m_dcb.ErrorChar; }
  245.             set { m_dcb.ErrorChar = value; }
  246.         }

  247.         public byte EofChar
  248.         {
  249.             get { return m_dcb.EofChar; }
  250.             set { m_dcb.EofChar = value; }
  251.         }

  252.         public byte EventChar
  253.         {
  254.             get { return m_dcb.EvtChar; }
  255.             set { m_dcb.EvtChar = value; }
  256.         }

  257.         public uint ReadIntervalTimeout
  258.         {
  259.             get { return m_timeouts.ReadIntervalTimeout; }
  260.             set { m_timeouts.ReadIntervalTimeout = value; }
  261.         }
  262.         public uint ReadTotalTimeoutMultiplier
  263.         {
  264.             get { return m_timeouts.ReadTotalTimeoutMultiplier; }
  265.             set { m_timeouts.ReadTotalTimeoutMultiplier = value; }
  266.         }
  267.         public uint ReadTotalTimeoutConstant
  268.         {
  269.             get { return m_timeouts.ReadTotalTimeoutConstant; }
  270.             set { m_timeouts.ReadTotalTimeoutConstant = value; }
  271.         }
  272.         public uint WriteTotalTimeoutMultiplier
  273.         {
  274.             get { return m_timeouts.WriteTotalTimeoutMultiplier; }
  275.             set { m_timeouts.WriteTotalTimeoutMultiplier = value; }
  276.         }
  277.         public uint WriteTotalTimeoutConstant
  278.         {
  279.             get { return m_timeouts.WriteTotalTimeoutConstant; }
  280.             set { m_timeouts.WriteTotalTimeoutConstant = value; }
  281.         }

  282.         #endregion

  283.         #region 事件。

  284.         public event DataArrivalEventHandler DataArrivalEvent;
  285.         public event EngineEventHandler EngineEvent;

  286.         #endregion

  287.         #region 基本操作方法。

  288.         public void Close()
  289.         {
  290.             m_keepLooping = false;
  291.             if (IsOpen)
  292.             {
  293.                 /* 使WaitCommEvent立即返回,用于通知CommEventMonitor线程 */
  294.                 NativeAPI.SetCommMask(m_serialPort, 0);
  295.                 /* 使重叠IO立即结束,用于通知BackgroundDataReceiver线程 */
  296.                 DiscardAllBuffers();   
  297.                 /* 关闭端口的设备句柄 */
  298.                 m_serialPort.Close();
  299.                 m_serialPort = null;
  300.             }
  301.         }

  302.         private void Dispose(bool explicitDisposing)
  303.         {
  304.             Close();
  305.             if (explicitDisposing)
  306.             {
  307.                 GC.SuppressFinalize(this);
  308.             }
  309.         }

  310.         public void Dispose()
  311.         {
  312.             Dispose(true);
  313.         }

  314.         ~SerialEngine()
  315.         {
  316.             Dispose(false);
  317.         }

  318.         public bool DiscardInBuffer()
  319.         {
  320.             return NativeAPI.PurgeComm(m_serialPort, (NativeAPI.PurgeValue.RXABORT | NativeAPI.PurgeValue.RXCLEAR));
  321.         }

  322.         public bool DiscardOutBuffer()
  323.         {
  324.             return NativeAPI.PurgeComm(m_serialPort, (NativeAPI.PurgeValue.TXABORT | NativeAPI.PurgeValue.TXCLEAR));
  325.         }

  326.         public bool DiscardAllBuffers()
  327.         {
  328.             NativeAPI.PurgeValue flags = 0;
  329.             flags |= (NativeAPI.PurgeValue.RXABORT | NativeAPI.PurgeValue.RXCLEAR);
  330.             flags |= (NativeAPI.PurgeValue.TXABORT | NativeAPI.PurgeValue.TXCLEAR);
  331.             return NativeAPI.PurgeComm(m_serialPort, flags);
  332.         }

  333.         public bool TransmitCommChar(byte c)
  334.         {
  335.             return NativeAPI.TransmitCommChar(m_serialPort, c);
  336.         }

  337.         public bool SetCommMask(CommEvMask mask)
  338.         {
  339.             m_commEventMask = mask;
  340.             return NativeAPI.SetCommMask(m_serialPort, m_commEventMask);
  341.         }

  342.         public bool ClearCommError(ref CommErrors errors, ref COMSTAT stat)
  343.         {
  344.             if (m_serialPort == null)
  345.             {
  346.                 return false;
  347.             }
  348.             return NativeAPI.ClearCommError(m_serialPort, out errors, out stat);
  349.         }

  350.         public bool GetCommModemStatus(ref ModemStats stat)
  351.         {
  352.             if (m_serialPort == null)
  353.             {
  354.                 return false;
  355.             }
  356.             return NativeAPI.GetCommModemStatus(m_serialPort, out stat);
  357.         }

  358.         public bool EscapeCommFunction(CommEscape cmd)
  359.         {
  360.             return NativeAPI.EscapeCommFunction(m_serialPort, cmd);
  361.         }

  362.         public bool CommBreakControl(bool setBreak)
  363.         {
  364.             if (setBreak)
  365.             {
  366.                 return NativeAPI.SetCommBreak(m_serialPort);
  367.             }
  368.             return NativeAPI.ClearCommBreak(m_serialPort);
  369.         }

  370.         #endregion

  371.         #region 主体功能方法。

  372.         public void Open(bool isAsyncMode)
  373.         {
  374.             if (string.IsNullOrEmpty(m_portName) || !m_portName.StartsWith("COM", StringComparison.OrdinalIgnoreCase))
  375.             {
  376.                 throw new ApplicationException("端口名称不对");
  377.             }
  378.             if (IsOpen)
  379.             {
  380.                 throw new ApplicationException("端口已经打开");
  381.             }
  382.             SafeFileHandle _handle = NativeAPI.CreateFile(@"\\." + m_portName,
  383.                 (NativeAPI.GENERIC_READ | NativeAPI.GENERIC_WRITE), NativeAPI.FileShare.None, IntPtr.Zero,
  384.                 NativeAPI.FileMode.OpenExisting, NativeAPI.FILE_FLAG_OVERLAPPED, IntPtr.Zero);
  385.             if (_handle.IsInvalid)
  386.             {
  387.                 throw new ApplicationException("无法打开端口");
  388.             }
  389.             try
  390.             {
  391.                 int fileType = NativeAPI.GetFileType(_handle);
  392.                 if ((NativeAPI.FILE_TYPE_CHAR != fileType) && (NativeAPI.FILE_TYPE_UNKNOWN != fileType))
  393.                 {
  394.                     throw new ApplicationException("打开的端口不受支持");
  395.                 }
  396.                 this.m_serialPort = _handle; /* 端口的文件句柄保存到私有字段,就靠它来操作硬件的 */
  397.                 if (!NativeAPI.SetupComm(m_serialPort, m_readBufferSize, m_writeBufferSize))
  398.                 {
  399.                     throw new ApplicationException("缓冲区容量设置失败");
  400.                 }
  401.                 ModemStats modemStat = 0;
  402.                 NativeAPI.COMMPROP commProp = new NativeAPI.COMMPROP();
  403.                 commProp.wPacketLength = (ushort)Marshal.SizeOf(commProp);
  404.                 bool b1 = NativeAPI.GetCommProperties(m_serialPort, ref commProp);
  405.                 if ((!b1) || (commProp.wPacketLength != Marshal.SizeOf(commProp)))
  406.                 {
  407.                     if (commProp.wPacketLength == 0)
  408.                     {
  409.                         throw new ApplicationException("COMMPROP长度错误");
  410.                     }
  411.                     IntPtr packet = Marshal.AllocHGlobal(commProp.wPacketLength);
  412.                     try
  413.                     {
  414.                         Marshal.StructureToPtr(commProp, packet, false/* packet为新分配内存块,所以fDeleteOld为false即可 */);
  415.                         b1 = NativeAPI.GetCommProperties(m_serialPort, packet);
  416.                         Marshal.PtrToStructure(packet, commProp);
  417.                     }
  418.                     finally
  419.                     {
  420.                         /* 无论如何别忘了释放非托管内存 */
  421.                         Marshal.FreeHGlobal(packet);
  422.                     }
  423.                 }
  424.                 bool b2 = NativeAPI.GetCommModemStatus(m_serialPort, out modemStat);
  425.                 if ((!b1) || (!b2))
  426.                 {
  427.                     int errorCode = Marshal.GetLastWin32Error();
  428.                     throw new ApplicationException("端口功能不全:" + errorCode.ToString());
  429.                 }
  430.                 if ((commProp.dwMaxBaud & SettableBauds.BAUD_USER) == 0)
  431.                 {
  432.                     /* 波特率不能用户自定义,只能采用预定义的值,则检查取值是否正确 */
  433.                     if (!CheckBaudSettable(ref commProp, this.BaudRate))
  434.                     {
  435.                         throw new ApplicationException("波特率不受支持");
  436.                     }
  437.                 }
  438.                 this.m_commProp = commProp; /* 将端口设备性能数据保存起来备用 */
  439.                 if (!NativeAPI.SetCommState(m_serialPort, ref m_dcb))
  440.                 {
  441.                     throw new ApplicationException("端口配置失败");
  442.                 }
  443.                 if (!NativeAPI.SetCommTimeouts(m_serialPort, ref m_timeouts))
  444.                 {
  445.                     throw new ApplicationException("超时设置失败");
  446.                 }
  447.                 if (!NativeAPI.SetCommMask(m_serialPort, m_commEventMask))
  448.                 {
  449.                     throw new ApplicationException("事件侦听标志设置失败");
  450.                 }
  451.                 this.m_keepLooping = true;  /* 事件检测线程和后台接收线程循环标志 */
  452.                 this.m_isAsyncMode = isAsyncMode;
  453.                 if (this.m_isAsyncMode)
  454.                 {
  455.                     /* 如果是异步模式,就创建后台读取线程 */
  456.                     AutoResetEvent m_rxReady = new AutoResetEvent(false);
  457.                     ThreadPool.QueueUserWorkItem(new WaitCallback(BackgroundDataReceiver), m_rxReady);
  458.                     m_rxReady.WaitOne();
  459.                     m_rxReady.Close();
  460.                 }
  461.                 /* 创建串口事件侦听线程,捕捉串口事件 */
  462.                 AutoResetEvent m_evReady = new AutoResetEvent(false);
  463.                 ThreadPool.QueueUserWorkItem(new WaitCallback(CommEventMonitor), m_evReady);
  464.                 m_evReady.WaitOne();
  465.                 m_evReady.Close();
  466.             }
  467.             catch
  468.             {
  469.                 m_keepLooping = false;
  470.                 m_serialPort = null;
  471.                 _handle.Close();
  472.                 throw;
  473.             }
  474.         }

  475.         private int WriteFileInternal(byte* pbuf, int num, ref NativeAPI.NativeOverlapped ov)
  476.         {
  477.             int numBytesWrite = 0;
  478.             if (NativeAPI.WriteFile(m_serialPort, pbuf, num, out numBytesWrite, ref ov) == 0)
  479.             {
  480.                 int iResult = Marshal.GetLastWin32Error();
  481.                 if (iResult != NativeAPI.ERROR_IO_PENDING)
  482.                 {
  483.                     throw new ApplicationException("WIN32ERROR=" + iResult.ToString());
  484.                 }
  485.                 if (!NativeAPI.GetOverlappedResult(m_serialPort, ref ov, out numBytesWrite, true))
  486.                 {
  487.                     iResult = Marshal.GetLastWin32Error();
  488.                     throw new ApplicationException("WIN32ERROR=" + iResult.ToString());
  489.                 }
  490.             }
  491.             return numBytesWrite;
  492.         }

  493.         public void SendData(byte[] data, int index, int count)
  494.         {
  495.             ManualResetEvent mev = new ManualResetEvent(false);
  496.             try
  497.             {
  498.                 SendData(data, index, count, mev);
  499.             }
  500.             catch
  501.             {
  502.                 throw;
  503.             }
  504.             finally
  505.             {
  506.                 mev.Close();
  507.             }
  508.         }

  509.         public void SendData(byte[] data, int index, int count, WaitHandle waitObj)
  510.         {
  511.             if (!IsOpen)
  512.             {
  513.                 throw new ApplicationException("端口未打开不能发送数据");
  514.             }
  515.             NativeAPI.NativeOverlapped ovl = new NativeAPI.NativeOverlapped();
  516.             GCHandle objPin = GCHandle.Alloc(waitObj);
  517.             try
  518.             {
  519.                 ovl.EventHandle = waitObj.SafeWaitHandle.DangerousGetHandle();
  520.                 fixed (byte* pdata = &data[index])
  521.                 {
  522.                     WriteFileInternal(pdata, count, ref ovl);
  523.                 }
  524.             }
  525.             catch
  526.             {
  527.                 throw;
  528.             }
  529.             finally
  530.             {
  531.                 objPin.Free();
  532.             }
  533.         }

  534.         private int ReadFileInternal(byte* pbuf, int num, ref NativeAPI.NativeOverlapped ov)
  535.         {
  536.             int numBytesRead = 0;
  537.             if (NativeAPI.ReadFile(m_serialPort, pbuf, num, out numBytesRead, ref ov) == 0)
  538.             {
  539.                 int iResult = Marshal.GetLastWin32Error();
  540.                 if (iResult != NativeAPI.ERROR_IO_PENDING)
  541.                 {
  542.                     throw new ApplicationException("WIN32ERROR=" + iResult.ToString());
  543.                 }
  544.                 if (!NativeAPI.GetOverlappedResult(m_serialPort, ref ov, out numBytesRead, true))
  545.                 {
  546.                     iResult = Marshal.GetLastWin32Error();
  547.                     throw new ApplicationException("WIN32ERROR=" + iResult.ToString());
  548.                 }
  549.             }
  550.             return numBytesRead;
  551.         }

  552.         public int ReadData(byte[] data, int index, int num)
  553.         {
  554.             ManualResetEvent mev = new ManualResetEvent(false);
  555.             try
  556.             {
  557.                 return ReadData(data, index, num, mev);
  558.             }
  559.             catch
  560.             {
  561.                 throw;
  562.             }
  563.             finally
  564.             {
  565.                 mev.Close();
  566.             }
  567.         }

  568.         public int ReadData(byte[] data, int index, int num, WaitHandle waitObj)
  569.         {
  570.             if (IsAsyncMode)
  571.             {
  572.                 throw new ApplicationException("异步模式端口不能同步操作");
  573.             }
  574.             if (!IsOpen)
  575.             {
  576.                 throw new ApplicationException("端口未打开不能读取数据");
  577.             }
  578.             NativeAPI.NativeOverlapped ovl = new NativeAPI.NativeOverlapped();
  579.             GCHandle objPin = GCHandle.Alloc(waitObj);
  580.             int numBytesRead = 0;
  581.             try
  582.             {
  583.                 ovl.EventHandle = waitObj.SafeWaitHandle.DangerousGetHandle();
  584.                 fixed (byte* pbuf = &data[index])
  585.                 {
  586.                     numBytesRead = ReadFileInternal(pbuf, num, ref ovl);
  587.                 }
  588.             }
  589.             catch
  590.             {
  591.                 throw;
  592.             }
  593.             finally
  594.             {
  595.                 objPin.Free();
  596.             }
  597.             return numBytesRead;
  598.         }

  599.         private void BackgroundDataReceiver(object state)
  600.         {
  601.             AutoResetEvent readyEvent = state as AutoResetEvent;
  602.             byte[] rxBuffer = new byte[2048];

  603.             readyEvent.Set();
  604.             readyEvent = null;

  605.             Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;

  606.             NativeAPI.NativeOverlapped ovl = new NativeAPI.NativeOverlapped();
  607.             ManualResetEvent mev = new ManualResetEvent(false);
  608.             ovl.EventHandle = mev.SafeWaitHandle.DangerousGetHandle();

  609.         __loop:
  610.             try
  611.             {
  612.                 while (m_keepLooping)
  613.                 {
  614.                     int numBytesRead = 0;
  615.                     fixed (byte* pbuf = rxBuffer)
  616.                     {
  617.                         numBytesRead = ReadFileInternal(pbuf, rxBuffer.Length, ref ovl);
  618.                     }
  619.                     if (m_keepLooping)
  620.                     {
  621.                         // 不管有没有收到数据,都回调数据到达函数,这个特性很有用!
  622.                         if (DataArrivalEvent != null)
  623.                         {
  624.                             DataArrivalEvent(rxBuffer, numBytesRead);
  625.                         }
  626.                     }
  627.                 }
  628.             }
  629.             catch (ThreadAbortException)
  630.             {
  631.                 Thread.ResetAbort();
  632.             }
  633.             catch (Exception ex)
  634.             {
  635.                 if (m_keepLooping)
  636.                 {
  637.                     if (EngineEvent != null)
  638.                     {
  639.                         EngineEvent(EngineEventType.EngineReadError, ex.Message);
  640.                     }
  641.                     if (IsOpen)
  642.                     {
  643.                         Thread.Sleep(10);
  644.                         goto __loop;
  645.                     }
  646.                 }
  647.             }
  648.             mev.Close();
  649.         }

  650.         private void CommEventMonitor(object state)
  651.         {
  652.             AutoResetEvent readyEvent = state as AutoResetEvent;
  653.             readyEvent.Set();
  654.             readyEvent = null;

  655.             Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;

  656.             NativeAPI.NativeOverlapped ovl = new NativeAPI.NativeOverlapped();
  657.             ManualResetEvent mev = new ManualResetEvent(false);
  658.             ovl.EventHandle = mev.SafeWaitHandle.DangerousGetHandle();

  659.         __loop:
  660.             try
  661.             {
  662.                 while (m_keepLooping)
  663.                 {
  664.                     CommEvMask evMask = CommEvMask.NONE;
  665.                     if (!NativeAPI.WaitCommEvent(m_serialPort, out evMask, ref ovl))
  666.                     {
  667.                         int iResult = Marshal.GetLastWin32Error();
  668.                         if (iResult != NativeAPI.ERROR_IO_PENDING)
  669.                         {
  670.                             throw new ApplicationException("WIN32ERROR=" + iResult.ToString());
  671.                         }
  672.                         if (!NativeAPI.GetOverlappedResult(m_serialPort, ref ovl, out iResult, true))
  673.                         {
  674.                             iResult = Marshal.GetLastWin32Error();
  675.                             throw new ApplicationException("WIN32ERROR=" + iResult.ToString());
  676.                         }
  677.                     }
  678.                     if (m_keepLooping)
  679.                     {
  680.                         // 发送侦测到的端口事件。
  681.                         if (EngineEvent != null)
  682.                         {
  683.                             EngineEvent(EngineEventType.CommEventNormal, evMask);
  684.                         }
  685.                     }
  686.                 }
  687.             }
  688.             catch (ThreadAbortException)
  689.             {
  690.                 Thread.ResetAbort();
  691.             }
  692.             catch (Exception ex)
  693.             {
  694.                 if (m_keepLooping)
  695.                 {
  696.                     if (EngineEvent != null)
  697.                     {
  698.                         EngineEvent(EngineEventType.EngineEventError, ex.Message);
  699.                     }
  700.                     if (IsOpen)
  701.                     {
  702.                         Thread.Sleep(10);
  703.                         goto __loop;
  704.                     }
  705.                 }
  706.             }
  707.             mev.Close();
  708.         }

  709.         public bool DefaultEngineEventCallback(EngineEventType ev, object arg)
  710.         {
  711.             CommEvMask commEvent;
  712.             switch (ev)
  713.             {
  714.                 case EngineEventType.EngineEventError:
  715.                 case EngineEventType.EngineReadError:
  716.                     if (arg != null)
  717.                     {
  718.                         string msg = arg as string;
  719.                         if (msg.StartsWith("WIN32ERROR="))
  720.                         {
  721.                             int lastErr = Convert.ToInt32(msg.Substring(11));
  722.                             if (lastErr == NativeAPI.ERROR_ACCESS_DENIED)
  723.                             {
  724.                                 this.Close();
  725.                                 return true;
  726.                             }
  727.                             if (lastErr == NativeAPI.ERROR_INVALID_HANDLE)
  728.                             {
  729.                                 this.Close();
  730.                                 return true;
  731.                             }
  732.                         }
  733.                     }
  734.                     break;
  735.                 case EngineEventType.CommEventNormal:
  736.                     commEvent = (CommEvMask)arg;
  737.                     if ((commEvent & CommEvMask.ERR) != 0)
  738.                     {
  739.                         CommErrors errors;
  740.                         if (NativeAPI.ClearCommError(m_serialPort, out errors, IntPtr.Zero))
  741.                         {
  742.                             return true;
  743.                         }
  744.                     }
  745.                     break;
  746.             }
  747.             return false;
  748.         }
  749.         
  750.         #endregion

  751.         #region 辅助工具。

  752.         public readonly static PortNameComparer pnc = new PortNameComparer();

  753.         public static string[] GetPortNames()
  754.         {
  755.             RegistryKey localMachine = null;
  756.             RegistryKey serialInfoKey = null;
  757.             List<string> portNames = new List<string>();
  758.             new RegistryPermission(RegistryPermissionAccess.Read, @"HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM").Assert();
  759.             try
  760.             {
  761.                 localMachine = Registry.LocalMachine;
  762.                 serialInfoKey = localMachine.OpenSubKey(@"HARDWARE\DEVICEMAP\SERIALCOMM", false);
  763.                 if (serialInfoKey != null)
  764.                 {
  765.                     string[] valueNames = serialInfoKey.GetValueNames();
  766.                     for (int i = 0; i < valueNames.Length; i++)
  767.                     {
  768.                         string name = (string)serialInfoKey.GetValue(valueNames[i]);
  769.                         if (name.StartsWith("COM", StringComparison.OrdinalIgnoreCase))
  770.                         {
  771.                             portNames.Add(name);
  772.                         }
  773.                     }
  774.                 }
  775.             }
  776.             finally
  777.             {
  778.                 if (localMachine != null)
  779.                 {
  780.                     localMachine.Close();
  781.                 }
  782.                 if (serialInfoKey != null)
  783.                 {
  784.                     serialInfoKey.Close();
  785.                 }
  786.                 CodeAccessPermission.RevertAssert();
  787.             }
  788.             if (portNames.Count > 1)
  789.             {
  790.                 portNames.Sort(pnc);
  791.             }
  792.             return portNames.ToArray();
  793.         }

  794.         public static bool CheckBaudSettable(ref NativeAPI.COMMPROP prop, uint baud)
  795.         {
  796.             if ((prop.dwSettableBaud & SettableBauds.BAUD_USER) != 0)
  797.             {
  798.                 return true;
  799.             }
  800.             uint settableBits = (uint)prop.dwSettableBaud;
  801.             for (int i = 0; i < SettableBaudTable.Length; i++)
  802.             {
  803.                 if ((settableBits & (1u << i)) != 0)
  804.                 {
  805.                     uint allowed = SettableBaudTable[i];
  806.                     if ((baud > (allowed - 3)) && (baud < (allowed + 3)))
  807.                     {
  808.                         return true;
  809.                     }
  810.                 }
  811.             }
  812.             return false;
  813.         }

  814.         public readonly static uint[] SettableBaudTable = new uint[19]
  815.         {
  816.             75,
  817.             110,
  818.             134,
  819.             150,
  820.             300,
  821.             600,
  822.             1200,
  823.             1800,
  824.             2400,
  825.             4800,
  826.             7200,
  827.             9600,
  828.             14400,
  829.             19200,
  830.             38400,
  831.             56000,
  832.             128000,
  833.             115200,
  834.             57600,
  835.         };

  836.         #endregion
  837.     }

  838.     #region 串口名称排序比较器。

  839.     public class PortNameComparer : IComparer<string>
  840.     {
  841.         public int Compare(string x, string y)
  842.         {
  843.             int ix = Convert.ToInt32(x.Substring(3));
  844.             int iy = Convert.ToInt32(y.Substring(3));
  845.             return (ix - iy);
  846.         }
  847.     }

  848.     #endregion

  849.     #region 枚举类型。

  850.     public enum ParityValue : byte
  851.     {
  852.         /// <summary>
  853.         /// 无奇偶校验
  854.         /// </summary>
  855.         NO = 0,
  856.         /// <summary>
  857.         /// 奇校验
  858.         /// </summary>
  859.         ODD = 1,
  860.         /// <summary>
  861.         /// 偶校验
  862.         /// </summary>
  863.         EVEN = 2,
  864.         /// <summary>
  865.         /// Mark parity
  866.         /// </summary>
  867.         MARK = 3,
  868.         /// <summary>
  869.         /// Space parity
  870.         /// </summary>
  871.         SPACE = 4,
  872.     }

  873.     public enum StopBitsValue : byte
  874.     {
  875.         /// <summary>
  876.         /// 1 stop bit
  877.         /// </summary>
  878.         ONE = 0,
  879.         /// <summary>
  880.         /// 1.5 stop bits
  881.         /// </summary>
  882.         ONE5 = 1,
  883.         /// <summary>
  884.         /// 2 stop bits
  885.         /// </summary>
  886.         TWO = 2,
  887.     }

  888.     public enum DtrControlValue
  889.     {
  890.         DISABLE = 0,
  891.         ENABLE = 1,
  892.         HANDSHAKE = 2,
  893.     }

  894.     public enum RtsControlValue
  895.     {
  896.         DISABLE = 0,
  897.         ENABLE = 1,
  898.         HANDSHAKE = 2,
  899.         TOGGLE = 3,
  900.     }

  901.     [Flags]
  902.     public enum CommEvMask : uint
  903.     {
  904.         NONE = 0,
  905.         BREAK = 0x0040,
  906.         CTS = 0x0008,
  907.         DSR = 0x0010,
  908.         ERR = 0x0080,
  909.         RING = 0x0100,
  910.         RLSD = 0x0020,
  911.         RXCHAR = 0x0001,
  912.         RXFLAG = 0x0002,
  913.         TXEMPTY = 0x0004,
  914.     }

  915.     [Flags]
  916.     public enum ModemStats : uint
  917.     {
  918.         CTS_ON = 0x0010,
  919.         DSR_ON = 0x0020,
  920.         RING_ON = 0x0040,
  921.         RLSD_ON = 0x0080,
  922.     }

  923.     [StructLayout(LayoutKind.Sequential)]
  924.     public struct COMSTAT
  925.     {
  926.         public uint Flags;
  927.         public uint cbInQue;
  928.         public uint cbOutQue;

  929.         public bool GetFlag(COMSTATFlags shift)
  930.         {
  931.             int nshift = (int)shift;
  932.             return ((Flags & (1u << nshift)) != 0u);
  933.         }

  934.         public void SetFlag(COMSTATFlags shift, bool stat)
  935.         {
  936.             int nshift = (int)shift;
  937.             if (stat)
  938.             {
  939.                 Flags |= (1u << nshift);
  940.             }
  941.             else
  942.             {
  943.                 Flags &= ~(1u << nshift);
  944.             }
  945.         }
  946.     }

  947.     public enum COMSTATFlags : int
  948.     {
  949.         fCtsHold = 0,
  950.         fDsrHold = 1,
  951.         fRlsdHold = 2,
  952.         fXoffHold = 3,
  953.         fXoffSent = 4,
  954.         fEof = 5,
  955.         fTxim = 6,
  956.     }

  957.     [Flags]
  958.     public enum CommErrors : uint
  959.     {
  960.         NONE = 0,
  961.         RXOVER = 1,
  962.         OVERRUN = 2,
  963.         RXPARITY = 4,
  964.         FRAME = 8,
  965.         BREAK = 16,
  966.     }

  967.     public enum CommEscape : uint
  968.     {
  969.         CLRBREAK = 9,
  970.         CLRDTR = 6,
  971.         CLRRTS = 4,
  972.         SETBREAK = 8,
  973.         SETDTR = 5,
  974.         SETRTS = 3,
  975.         SETXOFF = 1,
  976.         SETXON = 2,
  977.     }

  978.     public enum EngineEventType
  979.     {
  980.         None = 0,
  981.         CommEventNormal,
  982.         EngineReadError,
  983.         EngineEventError,

  984.     }

  985.     public enum BaudRateValue : uint
  986.     {
  987.         CBR_110 = 110,
  988.         CBR_300 = 300,
  989.         CBR_600 = 600,
  990.         CBR_1200 = 1200,
  991.         CBR_2400 = 2400,
  992.         CBR_4800 = 4800,
  993.         CBR_9600 = 9600,
  994.         CBR_14400 = 14400,
  995.         CBR_19200 = 19200,
  996.         CBR_38400 = 38400,
  997.         CBR_57600 = 57600,
  998.         CBR_115200 = 115200,
  999.         CBR_128000 = 128000,
  1000.         CBR_256000 = 256000,
  1001.     }

  1002.     [Flags]
  1003.     public enum SettableBauds : uint
  1004.     {
  1005.         BAUD_075 = 0x00000001,
  1006.         BAUD_110 = 0x00000002,
  1007.         BAUD_134_5 = 0x00000004,
  1008.         BAUD_150 = 0x00000008,
  1009.         BAUD_300 = 0x00000010,
  1010.         BAUD_600 = 0x00000020,
  1011.         BAUD_1200 = 0x00000040,
  1012.         BAUD_1800 = 0x00000080,
  1013.         BAUD_2400 = 0x00000100,
  1014.         BAUD_4800 = 0x00000200,
  1015.         BAUD_7200 = 0x00000400,
  1016.         BAUD_9600 = 0x00000800,
  1017.         BAUD_14400 = 0x00001000,
  1018.         BAUD_19200 = 0x00002000,
  1019.         BAUD_38400 = 0x00004000,
  1020.         BAUD_56K = 0x00008000,
  1021.         BAUD_57600 = 0x00040000,
  1022.         BAUD_115200 = 0x00020000,
  1023.         BAUD_128K = 0x00010000,
  1024.         BAUD_USER = 0x10000000,
  1025.     }

  1026.     public enum ProvSubType : uint
  1027.     {
  1028.         PST_FAX = 0x00000021,
  1029.         PST_LAT = 0x00000101,
  1030.         PST_MODEM = 0x00000006,
  1031.         PST_NETWORK_BRIDGE = 0x00000100,
  1032.         PST_PARALLELPORT = 0x00000002,
  1033.         PST_RS232 = 0x00000001,
  1034.         PST_RS422 = 0x00000003,
  1035.         PST_RS423 = 0x00000004,
  1036.         PST_RS449 = 0x00000005,
  1037.         PST_SCANNER = 0x00000022,
  1038.         PST_TCPIP_TELNET = 0x00000102,
  1039.         PST_UNSPECIFIED = 0x00000000,
  1040.         PST_X25 = 0x00000103,
  1041.     }

  1042.     [Flags]
  1043.     public enum ProvCapabilities : uint
  1044.     {
  1045.         PCF_16BITMODE = 0x0200,
  1046.         PCF_DTRDSR = 0x0001,
  1047.         PCF_INTTIMEOUTS = 0x0080,
  1048.         PCF_PARITY_CHECK = 0x0008,
  1049.         PCF_RLSD = 0x0004,
  1050.         PCF_RTSCTS = 0x0002,
  1051.         PCF_SETXCHAR = 0x0020,
  1052.         PCF_SPECIALCHARS = 0x0100,
  1053.         PCF_TOTALTIMEOUTS = 0x0040,
  1054.         PCF_XONXOFF = 0x0010,
  1055.     }

  1056.     [Flags]
  1057.     public enum SettableParams : uint
  1058.     {
  1059.         SP_BAUD = 0x0002,
  1060.         SP_DATABITS = 0x0004,
  1061.         SP_HANDSHAKING = 0x0010,
  1062.         SP_PARITY = 0x0001,
  1063.         SP_PARITY_CHECK = 0x0020,
  1064.         SP_RLSD = 0x0040,
  1065.         SP_STOPBITS = 0x0008,
  1066.     }

  1067.     [Flags]
  1068.     public enum SettableData : ushort
  1069.     {
  1070.         DATABITS_5 = 0x0001,
  1071.         DATABITS_6 = 0x0002,
  1072.         DATABITS_7 = 0x0004,
  1073.         DATABITS_8 = 0x0008,
  1074.         DATABITS_16 = 0x0010,
  1075.         DATABITS_16X = 0x0020,
  1076.     }

  1077.     [Flags]
  1078.     public enum SettableStopParity : ushort
  1079.     {
  1080.         STOPBITS_10 = 0x0001,
  1081.         STOPBITS_15 = 0x0002,
  1082.         STOPBITS_20 = 0x0004,
  1083.         PARITY_NONE = 0x0100,
  1084.         PARITY_ODD = 0x0200,
  1085.         PARITY_EVEN = 0x0400,
  1086.         PARITY_MARK = 0x0800,
  1087.         PARITY_SPACE = 0x1000,
  1088.     }

  1089.     #endregion
  1090. }
复制代码

出870入263汤圆

发表于 2015-2-3 17:11:57 | 显示全部楼层
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;

  4. namespace SerialEngineLibrary
  5. {
  6.     using System.Security.Permissions;
  7.     using Microsoft.Win32.SafeHandles;
  8.     using System.Runtime.InteropServices;
  9.     using System.Runtime.ConstrainedExecution;

  10.     public unsafe class NativeAPI
  11.     {
  12.         #region 常数。

  13.         public const uint FILE_FLAG_OVERLAPPED = 0x40000000u;

  14.         public const uint GENERIC_READ = 0x80000000u;

  15.         public const uint GENERIC_WRITE = 0x40000000u;

  16.         public const int ERROR_OPERATION_ABORTED = 995;

  17.         public const int ERROR_ACCESS_DENIED = 5;

  18.         public const int ERROR_INVALID_PARAMETER = 87;

  19.         public const int ERROR_INVALID_HANDLE = 6;

  20.         public const int ERROR_IO_INCOMPLETE = 996;

  21.         public const int ERROR_IO_PENDING = 997;

  22.         public const int ERROR_GEN_FAILURE = 31;

  23.         public const int FILE_TYPE_CHAR = 2;

  24.         public const int FILE_TYPE_UNKNOWN = 0;

  25.         #endregion

  26.         #region 结构体。

  27.         [StructLayout(LayoutKind.Sequential)]
  28.         public struct DCB
  29.         {
  30.             public uint DCBlength;
  31.             public uint BaudRate;
  32.             public uint Flags;
  33.             public ushort wReserved;
  34.             public ushort XonLim;
  35.             public ushort XoffLim;
  36.             public byte ByteSize;
  37.             public byte Parity;
  38.             public byte StopBits;
  39.             public byte XonChar;
  40.             public byte XoffChar;
  41.             public byte ErrorChar;
  42.             public byte EofChar;
  43.             public byte EvtChar;
  44.             public ushort wReserved1;

  45.             public void SetFlag(DcbFlags shift, int width, uint val)
  46.             {
  47.                 int nshift = (int)shift;
  48.                 uint mask;
  49.                 if (width >= 32)
  50.                 {
  51.                     mask = 0xffffffffu;
  52.                 }
  53.                 else
  54.                 {
  55.                     mask = ((1u << width) - 1);
  56.                 }
  57.                 mask <<= nshift;
  58.                 val <<= nshift;
  59.                 uint flags = Flags;
  60.                 flags &= ~mask;
  61.                 flags |= (val & mask);
  62.                 Flags = flags;
  63.             }

  64.             public uint GetFlag(DcbFlags shift, int width)
  65.             {
  66.                 int nshift = (int)shift;
  67.                 uint mask;
  68.                 if (width >= 32)
  69.                 {
  70.                     mask = 0xffffffffu;
  71.                 }
  72.                 else
  73.                 {
  74.                     mask = ((1u << width) - 1);
  75.                 }
  76.                 uint flags = Flags;
  77.                 return ((flags >> nshift) & mask);
  78.             }
  79.         }

  80.         public enum DcbFlags : int
  81.         {
  82.             fBinary = 0,
  83.             fParity = 1,
  84.             fOutxCtsFlow = 2,
  85.             fOutxDsrFlow = 3,
  86.             fDtrControl = 4,
  87.             fDsrSensitivity = 6,
  88.             fTXContinueOnXoff = 7,
  89.             fOutX = 8,
  90.             fInX = 9,
  91.             fErrorChar = 10,
  92.             fNull = 11,
  93.             fRtsControl = 12,
  94.             fAbortOnError = 14,
  95.             fDummy2 = 15,
  96.         }

  97.         [StructLayout(LayoutKind.Sequential)]
  98.         public struct COMMPROP
  99.         {
  100.             public ushort wPacketLength;
  101.             public ushort wPacketVersion;
  102.             public uint dwServiceMask;
  103.             public uint dwReserved1;
  104.             public uint dwMaxTxQueue;
  105.             public uint dwMaxRxQueue;
  106.             public SettableBauds dwMaxBaud;
  107.             public ProvSubType dwProvSubType;
  108.             public ProvCapabilities dwProvCapabilities;
  109.             public SettableParams dwSettableParams;
  110.             public SettableBauds dwSettableBaud;
  111.             public SettableData wSettableData;
  112.             public SettableStopParity wSettableStopParity;
  113.             public uint dwCurrentTxQueue;
  114.             public uint dwCurrentRxQueue;
  115.             public uint dwProvSpec1;
  116.             public uint dwProvSpec2;
  117.             public char wcProvChar;
  118.         }

  119.         [StructLayout(LayoutKind.Sequential)]
  120.         public struct COMMTIMEOUTS
  121.         {
  122.             public uint ReadIntervalTimeout;
  123.             public uint ReadTotalTimeoutMultiplier;
  124.             public uint ReadTotalTimeoutConstant;
  125.             public uint WriteTotalTimeoutMultiplier;
  126.             public uint WriteTotalTimeoutConstant;
  127.         }

  128.         [StructLayout(LayoutKind.Sequential), ComVisible(true)]
  129.         public struct NativeOverlapped
  130.         {
  131.             public IntPtr publicLow;
  132.             public IntPtr publicHigh;
  133.             public int OffsetLow;
  134.             public int OffsetHigh;
  135.             public IntPtr EventHandle;
  136.         }

  137.         [StructLayout(LayoutKind.Sequential)]
  138.         public class SECURITY_ATTRIBUTES
  139.         {
  140.             public int nLength;
  141.             public byte* pSecurityDescriptor = null;
  142.             public int bInheritHandle;
  143.         }

  144.         public enum FileShare : uint
  145.         {
  146.             Delete = 4,
  147.             Inheritable = 0x10,
  148.             None = 0,
  149.             Read = 1,
  150.             ReadWrite = 3,
  151.             Write = 2
  152.         }

  153.         public enum FileMode : uint
  154.         {
  155.             Append = 6,
  156.             CreateAlways = 2,
  157.             CreateNew = 1,
  158.             OpenExisting = 3,
  159.             OpenOrCreate = 4,
  160.             Truncate = 5
  161.         }

  162.         [Flags]
  163.         public enum PurgeValue: uint
  164.         {
  165.             NONE = 0,
  166.             TXABORT = 1,
  167.             RXABORT = 2,
  168.             TXCLEAR = 4,
  169.             RXCLEAR = 8,
  170.         }

  171.         #endregion

  172.         #region 方法。

  173.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  174.         public static extern bool GetCommState(SafeFileHandle hFile, ref DCB lpDCB);
  175.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  176.         public static extern bool SetCommState(SafeFileHandle hFile, ref DCB lpDCB);

  177.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  178.         public static extern bool ClearCommBreak(SafeFileHandle hFile);
  179.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  180.         public static extern bool SetCommBreak(SafeFileHandle hFile);


  181.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  182.         public static extern bool ClearCommError(SafeFileHandle hFile, out CommErrors lpErrors, out COMSTAT lpStat);
  183.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  184.         public static extern bool ClearCommError(SafeFileHandle hFile, out CommErrors lpErrors, IntPtr lpStat);

  185.         [DllImport("kernel32.dll", SetLastError = true)]
  186.         public static extern bool EscapeCommFunction(SafeFileHandle hFile, CommEscape dwFunc);

  187.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  188.         public static extern bool FlushFileBuffers(SafeFileHandle hFile);

  189.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  190.         public static extern bool GetCommMask(SafeFileHandle hFile, out CommEvMask lpEvtMask);
  191.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  192.         public static extern bool SetCommMask(SafeFileHandle hFile, CommEvMask dwEvtMask);
  193.         
  194.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  195.         public static extern bool GetCommModemStatus(SafeFileHandle hFile, out ModemStats lpModemStat);
  196.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  197.         public static extern bool GetCommProperties(SafeFileHandle hFile, ref COMMPROP lpCommProp);
  198.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  199.         public static extern bool GetCommProperties(SafeFileHandle hFile, IntPtr lpCommProp);

  200.         [DllImport("kernel32.dll", SetLastError = true)]
  201.         public static extern int GetFileSize(SafeFileHandle hFile, out int highSize);
  202.         [DllImport("kernel32.dll")]
  203.         public static extern int GetFileType(SafeFileHandle handle);
  204.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  205.         public static extern int GetWindowsDirectory(StringBuilder sb, int length);


  206.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  207.         public static extern bool GetCommTimeouts(SafeFileHandle hFile, ref COMMTIMEOUTS lpCommTimeouts);
  208.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  209.         public static extern bool SetCommTimeouts(SafeFileHandle hFile, ref COMMTIMEOUTS lpCommTimeouts);

  210.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  211.         public static extern bool PurgeComm(SafeFileHandle hFile, PurgeValue dwFlags);

  212.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  213.         public static extern bool SetupComm(SafeFileHandle hFile, int dwInQueue, int dwOutQueue);

  214.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  215.         public static extern bool TransmitCommChar(SafeFileHandle hFile, byte cChar);

  216.         [DllImport("kernel32.dll", SetLastError = true)]
  217.         public static extern unsafe bool WaitCommEvent(SafeFileHandle hFile, out CommEvMask lpEvtMask, ref NativeOverlapped lpOverlapped);

  218.         [DllImport("kernel32.dll", SetLastError = true)]
  219.         public static extern unsafe int ReadFile(SafeFileHandle handle, byte* bytes, int numBytesToRead, IntPtr numBytesRead, ref NativeOverlapped lpOverlapped);
  220.         [DllImport("kernel32.dll", SetLastError = true)]
  221.         public static extern unsafe int ReadFile(SafeFileHandle handle, byte* bytes, int numBytesToRead, out int numBytesRead, ref NativeOverlapped overlapped);

  222.         [DllImport("kernel32.dll", SetLastError = true)]
  223.         public static extern unsafe int WriteFile(SafeFileHandle handle, byte* bytes, int numBytesToWrite, IntPtr numBytesWritten, ref NativeOverlapped lpOverlapped);
  224.         [DllImport("kernel32.dll", SetLastError = true)]
  225.         public static extern unsafe int WriteFile(SafeFileHandle handle, byte* bytes, int numBytesToWrite, out int numBytesWritten, ref NativeOverlapped lpOverlapped);

  226.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  227.         public static extern SafeFileHandle CreateFile(string lpFileName, uint dwDesiredAccess, FileShare dwShareMode, IntPtr securityAttrs, FileMode dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);

  228.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  229.         public static extern SafeHandleZeroOrMinusOneIsInvalid CreateFileMapping(IntPtr hFile, SECURITY_ATTRIBUTES lpFileMappingAttributes, int flProtect, int dwMaximumSizeHigh, int dwMaximumSizeLow, string lpName);
  230.         [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
  231.         public static extern IntPtr MapViewOfFile(SafeHandleZeroOrMinusOneIsInvalid handle, uint dwDesiredAccess, uint dwFileOffsetHigh, uint dwFileOffsetLow, UIntPtr dwNumerOfBytesToMap);
  232.         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), DllImport("kernel32.dll", ExactSpelling = true)]
  233.         public static extern bool UnmapViewOfFile(IntPtr lpBaseAddress);


  234.         [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  235.         public static extern IntPtr lstrcpy(IntPtr dst, string src);
  236.         [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  237.         public static extern IntPtr lstrcpy(StringBuilder dst, IntPtr src);
  238.         [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  239.         public static extern int lstrlen(sbyte[] ptr);
  240.         [DllImport("kernel32.dll", CharSet = CharSet.Auto)]
  241.         public static extern int lstrlen(IntPtr ptr);
  242.         [DllImport("kernel32.dll", CharSet = CharSet.Ansi)]
  243.         public static extern int lstrlenA(IntPtr ptr);
  244.         [DllImport("kernel32.dll", CharSet = CharSet.Unicode)]
  245.         public static extern int lstrlenW(IntPtr ptr);


  246.         [DllImport("ole32.dll")]
  247.         public static extern IntPtr CoTaskMemAlloc(int cb);
  248.         [DllImport("ole32.dll")]
  249.         public static extern void CoTaskMemFree(IntPtr ptr);
  250.         [DllImport("ole32.dll")]
  251.         public static extern IntPtr CoTaskMemRealloc(IntPtr pv, int cb);

  252.         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), DllImport("kernel32.dll", SetLastError = true)]
  253.         public static extern IntPtr LocalAlloc(int flags, IntPtr countOfBytes);
  254.         [DllImport("kernel32.dll")]
  255.         public static extern IntPtr LocalReAlloc(IntPtr handle, IntPtr sizetcbBytes, int uFlags);
  256.         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), DllImport("kernel32.dll", SetLastError = true)]
  257.         public static extern IntPtr LocalFree(IntPtr handle);

  258.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  259.         public static extern IntPtr GetCurrentProcess();
  260.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  261.         public static extern uint GetCurrentProcessId();

  262.         [DllImport("kernel32.dll", SetLastError = true)]
  263.         public static extern uint WaitForMultipleObjects(uint nCount, IntPtr[] handles, bool bWaitAll, uint dwMilliseconds);
  264.         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), DllImport("kernel32.dll", SetLastError = true)]
  265.         public static extern int WaitForMultipleObjectsEx(uint nCount, IntPtr lpHandles, bool bWaitAll, uint dwMilliseconds, bool bAlertable);
  266.         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail), DllImport("kernel32.dll")]
  267.         public static extern int WaitForSingleObjectEx(IntPtr lpHandles, uint dwMilliseconds, bool bAlertable);
  268.         [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
  269.         public static extern int WaitForSingleObject(SafeHandleZeroOrMinusOneIsInvalid handle, int timeout);
  270.         [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true)]
  271.         public static extern int MsgWaitForMultipleObjectsEx(int nCount, IntPtr pHandles, int dwMilliseconds, int dwWakeMask, int dwFlags);

  272.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  273.         public static extern unsafe bool GetOverlappedResult(SafeFileHandle hFile, ref NativeOverlapped lpOverlapped, out int lpNumberOfBytesTransferred, bool bWait);

  274.         [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success), DllImport("kernel32.dll")]
  275.         public static extern void ZeroMemory(IntPtr dest, IntPtr length);
  276.         [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory", CharSet = CharSet.Ansi)]
  277.         public static extern void CopyMemoryAnsi(IntPtr pdst, string psrc, IntPtr sizetcb);
  278.         [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory", CharSet = CharSet.Ansi)]
  279.         public static extern void CopyMemoryAnsi(StringBuilder pdst, IntPtr psrc, IntPtr sizetcb);
  280.         [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory", CharSet = CharSet.Unicode)]
  281.         public static extern void CopyMemoryUni(IntPtr pdst, string psrc, IntPtr sizetcb);
  282.         [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory", CharSet = CharSet.Unicode)]
  283.         public static extern void CopyMemoryUni(StringBuilder pdst, IntPtr psrc, IntPtr sizetcb);

  284.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  285.         public static extern bool MoveFile(string src, string dst);
  286.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  287.         public static extern bool CopyFile(string src, string dst, bool failIfExists);
  288.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  289.         public static extern bool DeleteFile(string path);
  290.         [DllImport("advapi32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  291.         public static extern bool EncryptFile(string path);
  292.         [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
  293.         public static extern int GetCurrentDirectory(int nBufferLength, StringBuilder lpBuffer);

  294.         #endregion
  295.     }
  296. }
复制代码

出870入263汤圆

发表于 2015-2-3 17:13:15 | 显示全部楼层
上面两层楼,涉及到你所需要的串口编程全部了,我自己写的,经过多年验证其稳定、高效;叫我红领巾!

出870入263汤圆

发表于 2015-2-3 17:17:26 | 显示全部楼层
附上编译好的dll,就是用上面的代码,加入项目直接调用吧。用法通过上面的代码,你自己会明白的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2015-2-3 18:02:27 | 显示全部楼层
mubei 发表于 2014-11-24 19:15
我给的链接资料很全奥,比你那个还多,无意中看到的

杜洋,好久以前就听传闻,杜大虾 佩服

出0入0汤圆

发表于 2015-2-3 19:51:37 | 显示全部楼层
如何没有c++基础要多久才能精通c#?

出0入0汤圆

发表于 2015-2-3 21:01:44 | 显示全部楼层
armstrong 发表于 2015-2-3 17:17
附上编译好的dll,就是用上面的代码,加入项目直接调用吧。用法通过上面的代码,你自己会明白的。
...

可以把上面的code也打一包嗎?
這樣比較方便,謝謝。

出0入0汤圆

 楼主| 发表于 2015-2-3 21:02:00 | 显示全部楼层
armstrong 发表于 2015-2-3 17:17
附上编译好的dll,就是用上面的代码,加入项目直接调用吧。用法通过上面的代码,你自己会明白的。
...

你的心和你的头像一样,大大的好

出0入0汤圆

发表于 2015-2-4 09:49:57 | 显示全部楼层
diyeyuye 发表于 2014-11-24 16:43
链接: http://pan.baidu.com/s/1qWmGT7e 密码: fx53
杜洋的C#视屏教程和源码,里面主要讲的就是用C#写串口 ...

感谢,最近正好在学C#准备做一个串口通信

出0入0汤圆

发表于 2015-2-4 16:07:36 | 显示全部楼层
armstrong 发表于 2015-2-3 17:17
附上编译好的dll,就是用上面的代码,加入项目直接调用吧。用法通过上面的代码,你自己会明白的。
...

对俺们菜鸟来说看起来鸭梨山大

出0入0汤圆

发表于 2015-2-4 16:53:50 | 显示全部楼层
armstrong 发表于 2015-2-3 17:17
附上编译好的dll,就是用上面的代码,加入项目直接调用吧。用法通过上面的代码,你自己会明白的。
...

红领巾,还能给个范例参考下呢?简单点的就行了,实现基本的读写就OK了

出0入0汤圆

发表于 2015-2-4 17:33:45 | 显示全部楼层
C#也能做串口啊

出10入4汤圆

发表于 2015-2-4 17:39:39 | 显示全部楼层
听说C#不是很难,哎,用到再说吧

出0入0汤圆

 楼主| 发表于 2015-2-4 18:10:04 | 显示全部楼层
yklstudent 发表于 2015-2-4 16:53
红领巾,还能给个范例参考下呢?简单点的就行了,实现基本的读写就OK了

你的头像好可爱

出0入0汤圆

 楼主| 发表于 2015-2-4 18:10:39 | 显示全部楼层

基本上能在PC上运行的,都可以做串口

出0入0汤圆

 楼主| 发表于 2015-2-4 18:11:01 | 显示全部楼层
慢慢懂 发表于 2015-2-4 09:49
感谢,最近正好在学C#准备做一个串口通信

好好看把,嘿嘿

出0入0汤圆

发表于 2015-2-4 18:41:08 | 显示全部楼层

2个月了吧,你学会了吗?会搞串口了吧!

出0入0汤圆

 楼主| 发表于 2015-2-4 19:01:56 | 显示全部楼层
kinsno 发表于 2015-2-4 18:41
2个月了吧,你学会了吗?会搞串口了吧!

哥们,串口手法没问题。只是一些复杂的弄不好

出0入0汤圆

发表于 2015-2-4 19:06:45 | 显示全部楼层
霸气侧漏 发表于 2015-2-4 19:01
哥们,串口手法没问题。只是一些复杂的弄不好

那就够了,剩下的是你该干的事情吗?,还想摇身变成挨踢?

出0入0汤圆

 楼主| 发表于 2015-2-4 19:13:27 | 显示全部楼层
kinsno 发表于 2015-2-4 19:06
那就够了,剩下的是你该干的事情吗?,还想摇身变成挨踢?

想弄弄一些复杂的,比如说春风电源的界面,表示有点难度

出870入263汤圆

发表于 2015-2-4 20:14:22 | 显示全部楼层
yklstudent 发表于 2015-2-4 16:53
红领巾,还能给个范例参考下呢?简单点的就行了,实现基本的读写就OK了

随便写了一点,大多数是混淆视听的代码,有用部分只有那么几行,你看看吧,用起来挺简单的。
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Text;
  7. using System.Windows.Forms;

  8. namespace SerialEngineDemo
  9. {
  10.     using SerialEngineLibrary;

  11.     public partial class FormDemo : Form
  12.     {
  13.         private readonly SerialEngine engine;

  14.         public FormDemo()
  15.         {
  16.             InitializeComponent();
  17.             timer1.Stop();
  18.             engine = new SerialEngine();
  19.             engine.DataArrivalEvent += engineDataArrival;
  20.             engine.EngineEvent += engineEngineEvent;
  21.             string[] ports = SerialEngine.GetPortNames();
  22.             comboBox1.Items.AddRange(ports);
  23.             if (ports.Length > 0)
  24.             {
  25.                 comboBox1.SelectedIndex = 0;
  26.             }
  27.             checkBox1.Checked = true;
  28.         }

  29.         private void button1_Click(object sender, EventArgs e)
  30.         {
  31.             if (!engine.IsOpen)
  32.             {
  33.                 engine.PortName = comboBox1.SelectedItem.ToString();
  34.                 engine.Open(checkBox1.Checked);
  35.                 timer1.Interval = 1000;
  36.                 timer1.Start();
  37.             }
  38.             else
  39.             {
  40.                 timer1.Stop();
  41.                 engine.Close();
  42.             }
  43.             button1.Text = engine.IsOpen.ToString();
  44.         }

  45.         protected override void OnClosed(EventArgs e)
  46.         {
  47.             base.OnClosed(e);
  48.             engine.Dispose();
  49.         }

  50.         private void engineDataArrival(byte[] data, int count)
  51.         {
  52.             if (this.InvokeRequired)
  53.             {
  54.                 this.Invoke(new SerialEngine.DataArrivalEventHandler(engineDataArrival), data, count);
  55.             }
  56.             else
  57.             {
  58.                 textBox1.AppendText(Encoding.Default.GetString(data, 0, count));
  59.             }
  60.         }

  61.         private void engineEngineEvent(EngineEventType ev, object arg)
  62.         {
  63.             if (this.InvokeRequired)
  64.             {
  65.                 this.Invoke(new SerialEngine.EngineEventHandler(engineEngineEvent), ev, arg);
  66.             }
  67.             else
  68.             {
  69.                 try
  70.                 {
  71.                     
  72.                     if (ev == EngineEventType.CommEventNormal)
  73.                     {
  74.                         CommEvMask evmask = (CommEvMask)arg;
  75.                         CommErrors err = CommErrors.NONE;
  76.                         COMSTAT stat = new COMSTAT();
  77.                         textBox1.AppendText(evmask.ToString() + "\r\n");
  78.                         if (engine.ClearCommError(ref err, ref stat))
  79.                         {
  80.                             StringBuilder sb = new StringBuilder(100);
  81.                             sb.AppendLine("COMSTAT:");
  82.                             sb.AppendLine("CTS:" + stat.GetFlag(COMSTATFlags.fCtsHold).ToString());
  83.                             sb.AppendLine("DSR:" + stat.GetFlag(COMSTATFlags.fDsrHold).ToString());
  84.                             sb.AppendLine("RLSD:" + stat.GetFlag(COMSTATFlags.fRlsdHold).ToString());
  85.                             sb.AppendLine("XOffHold:" + stat.GetFlag(COMSTATFlags.fXoffHold).ToString());
  86.                             sb.AppendLine("XoffSent:" + stat.GetFlag(COMSTATFlags.fXoffSent).ToString());
  87.                             sb.AppendLine("EOF:" + stat.GetFlag(COMSTATFlags.fEof).ToString());
  88.                             sb.AppendLine("Txim:" + stat.GetFlag(COMSTATFlags.fTxim).ToString());
  89.                             sb.AppendLine("BytesToRead:" + stat.cbInQue.ToString());
  90.                             sb.AppendLine("bytesToWrite:" + stat.cbOutQue.ToString());
  91.                             textBox1.AppendText(sb.ToString());
  92.                         }
  93.                         else
  94.                         {
  95.                             textBox1.AppendText("ClearCommError Failed\r\n");
  96.                         }
  97.                     }
  98.                     else
  99.                     {
  100.                         textBox1.AppendText(ev.ToString() + "\r\n");
  101.                         textBox1.AppendText(arg + "\r\n");
  102.                         engine.DefaultEngineEventCallback(ev, arg);
  103.                     }
  104.                 }
  105.                 catch(Exception ex)
  106.                 {
  107.                     textBox1.AppendText(ex.Message + "\r\n");
  108.                 }
  109.             }
  110.         }

  111.         private int cCount = 0;

  112.         private void button2_Click(object sender, EventArgs e)
  113.         {
  114.             cCount = 0;
  115.             textBox1.Clear();
  116.             this.Text = cCount.ToString();
  117.         }

  118.         private void timer1_Tick(object sender, EventArgs e)
  119.         {
  120.             byte[] testdata = Encoding.Default.GetBytes("hello, world!\r\n");
  121.             try
  122.             {
  123.                 engine.SendData(testdata, 0, testdata.Length);
  124.             }
  125.             catch
  126.             { }
  127.         }

  128.         private void button3_Click(object sender, EventArgs e)
  129.         {
  130.             if (!engine.IsAsyncMode)
  131.             {
  132.                 try
  133.                 {
  134.                     byte[] buf = new byte[512];
  135.                     int num = engine.ReadData(buf, 0, buf.Length);
  136.                     engine.SendData(buf, 0, num);
  137.                     cCount += num;
  138.                     textBox1.AppendText(Encoding.Default.GetString(buf, 0, num));
  139.                     this.Text = cCount.ToString();
  140.                 }
  141.                 catch
  142.                 { }
  143.             }
  144.         }
  145.     }
  146. }
复制代码

订阅数据接收到的事件:
engine.DataArrivalEvent += engineDataArrival;
订阅串口状态事件,包括但不限于enum CommEvMask类型列举出来的事件,比如你用USB串口,打开的串口被你拔除了,也会产生该事件的:
engine.EngineEvent += engineEngineEvent;

下面这些例子就是对串口的配置:
  1. if (engine.IsOpen)
  2.             {
  3.                 engine.Close();
  4.             }
  5.             engine.PortName = portName;
  6.             // 很重要的串口超时设置,设置为:使用字符间隔超时!
  7.             engine.ReadIntervalTimeout = 20;            /* 接收间隔超时 */
  8.             engine.ReadTotalTimeoutMultiplier = 0;      /* 接收超时系数 */
  9.             engine.ReadTotalTimeoutConstant = (uint)200;/* 接收超时常数 */
  10.             engine.WriteTotalTimeoutMultiplier = 0;
  11.             engine.WriteTotalTimeoutConstant = (uint)1000;
  12.             engine.DtrControl = DtrControlValue.DISABLE;
  13.             engine.RtsControl = RtsControlValue.DISABLE;
  14.             engine.TXContinueOnXoff = true;
  15.             engine.OutXEnable = false;
  16.             engine.InXEnable = false;
  17.             engine.NullDiscarded = false;
  18.             engine.XoffChar = 0;
  19.             engine.XonChar = 0;
  20.             engine.EventChar = 0;
  21.             engine.EofChar = 0;
  22.             engine.BinaryMode = true;
  23.             engine.EventMask = CommEvMask.TXEMPTY;
  24.             // SerialEngine打开的状态下,切换波特率可以立即生效;
  25.             // 同时,SetCommState()函数也使其它DCB结构成员生效。
  26.             engine.BaudRate = m_baudrate;
  27.             engine.Open(true);
复制代码

出870入263汤圆

发表于 2015-2-4 20:17:58 | 显示全部楼层
本帖最后由 armstrong 于 2015-2-4 20:19 编辑

要注意的是,异步工作方式下,数据接收事件和串口状态事件都是在一个单独的线程中执行的,所以不要在该事件中直接操作UI控件。关于跨线程操作UI控件的知识,自己参考MSDN即可。

出0入0汤圆

 楼主| 发表于 2015-2-4 20:23:24 | 显示全部楼层
armstrong 发表于 2015-2-4 20:17
要注意的是,异步工作方式下,数据接收事件和串口状态事件都是在一个单独的线程中执行的,所以不要在该事件 ...

哥们建议你上一段工程代码,嘿嘿

出0入0汤圆

发表于 2015-2-4 21:53:58 | 显示全部楼层
armstrong 发表于 2015-2-4 20:14
随便写了一点,大多数是混淆视听的代码,有用部分只有那么几行,你看看吧,用起来挺简单的。

订阅数据接 ...

谢谢了

出0入0汤圆

发表于 2015-2-4 22:19:28 来自手机 | 显示全部楼层
非常感谢 度样那个源码比较简单

出0入0汤圆

发表于 2015-3-4 10:25:08 | 显示全部楼层
diyeyuye 发表于 2014-11-24 16:43
链接: http://pan.baidu.com/s/1qWmGT7e 密码: fx53
杜洋的C#视屏教程和源码,里面主要讲的就是用C#写串口 ...

十分感谢。正好用c#

出0入0汤圆

发表于 2015-3-4 22:46:14 | 显示全部楼层
感谢分享,学习c#.

出0入0汤圆

发表于 2015-8-13 23:02:38 | 显示全部楼层
diyeyuye 发表于 2014-11-24 16:43
链接: http://pan.baidu.com/s/1qWmGT7e 密码: fx53
杜洋的C#视屏教程和源码,里面主要讲的就是用C#写串口 ...

非常谢谢您的分享。资料非常有用。谢谢

出0入0汤圆

发表于 2015-8-25 22:18:30 | 显示全部楼层
armstrong,对你来说已经很简单了,但对初学来说也很迷惑,能否大概注释一下。

出0入0汤圆

发表于 2015-8-26 14:42:08 | 显示全部楼层
很好很强大,真的需要

出0入42汤圆

发表于 2015-8-26 15:11:56 | 显示全部楼层
不少好东西

出0入0汤圆

发表于 2016-9-12 17:11:41 | 显示全部楼层
mark  不少好东西

出0入0汤圆

发表于 2016-9-12 18:32:19 | 显示全部楼层
http://www.amobbs.com/thread-5545906-1-1.html


这里有个不错的例子

出0入0汤圆

发表于 2016-9-13 10:57:57 | 显示全部楼层
C#自带串口类,不能再简单了

出0入0汤圆

 楼主| 发表于 2016-9-13 11:20:35 | 显示全部楼层
guzhongqi 发表于 2016-9-13 10:57
C#自带串口类,不能再简单了

C#  串口很简单的

出0入0汤圆

发表于 2016-9-13 14:50:05 | 显示全部楼层
不错的资料,收藏了,谢谢楼主
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 05:48

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表