如何使用mscomm串口控件在.net中编程

来源:互联网 发布:python turtle 国旗 编辑:程序博客网 时间:2024/03/29 14:04
 如何使用mscomm串口控件在.net中编程
对于从事工控和单片机工作的人来说串口编程是很常用的和很重要的。事实上在VB.net和C#中对串口的操作和VS6里没有大的区别。你仍然可以直接调用API或者使用MSComm或其他第三方控件。这里只介绍大家常用的MSComm。例子使用2、3脚跳过线的串口将COM1和COM2连接。

首先,你必须有MSComm.ocx文件在你的Windows的System32目录下,而且它必须正确的注册。你可以装VS6来获得,微软也指出这样不会有冲突。当然我们可以自己注册而不用装庞大的VS6。先将MSComm.ocx复制到System32目录下,然后使用edit工具编辑一个以.reg扩展名的文件,在文件里输入以下的文字:

REGEDIT4

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}]
@="Microsoft Communications Control, version 6.0"

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/InprocServer32]
@="C://WINNT//SYSTEM//MSCOMM32.OCX"
"ThreadingModel"="Apartment"

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/VersionIndependentProgID]
@="MSCOMMLib.MSComm"

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/ProgID]
@="MSCOMMLib.MSComm.1"

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/TypeLib]
@="{648A5603-2C6E-101B-82B6-000000000014}"

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/Version]
@="1.1"

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/Implemented Categories]

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/Implemented Categories/{40FC6ED5-2438-11CF-A3DB-080036F12502}]

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/Implemented Categories/{40FC6ED4-2438-11CF-A3DB-080036F12502}]

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/Implemented Categories/{0DE86A57-2BAA-11CF-A229-00AA003D7352}]

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/Implemented Categories/{0DE86A53-2BAA-11CF-A229-00AA003D7352}]

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/Implemented Categories/{0DE86A52-2BAA-11CF-A229-00AA003D7352}]

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/Implemented Categories/{7DD95802-9882-11CF-9FA9-00AA006C42C4}]

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/Programmable]

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/Control]

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/MiscStatus]
@="0"

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/MiscStatus/1]
@="132497"

[HKEY_CLASSES_ROOT/CLSID/{648A5600-2C6E-101B-82B6-000000000014}/ToolboxBitmap32]
@="C://WINNT//SYSTEM//MSCOMM32.OCX, 1"

[HKEY_CLASSES_ROOT/MSCOMMLib.MSComm]
@="Microsoft Communications Control, version 6.0"

[HKEY_CLASSES_ROOT/MSCOMMLib.MSComm/CLSID]
@="{648A5600-2C6E-101B-82B6-000000000014}"

[HKEY_CLASSES_ROOT/MSCOMMLib.MSComm/CurVer]
@="MSCOMMLib.MSComm.1"

[HKEY_CLASSES_ROOT/MSCOMMLib.MSComm.1]
@="Microsoft Communications Control, version 6.0"

[HKEY_CLASSES_ROOT/MSCOMMLib.MSComm.1/CLSID]
@="{648A5600-2C6E-101B-82B6-000000000014}"

[HKEY_LOCAL_MACHINE/Software/CLASSES/TypeLib/{648A5603-2C6E-101B-82B6-000000000014}]

[HKEY_LOCAL_MACHINE/Software/CLASSES/TypeLib/{648A5603-2C6E-101B-82B6-000000000014}/1.1]
@="Microsoft Comm Control 6.0"

[HKEY_LOCAL_MACHINE/Software/CLASSES/TypeLib/{648A5603-2C6E-101B-82B6-000000000014}/1.1/FLAGS]
@="2"

[HKEY_LOCAL_MACHINE/Software/CLASSES/TypeLib/{648A5603-2C6E-101B-82B6-000000000014}/1.1]

[HKEY_LOCAL_MACHINE/Software/CLASSES/TypeLib/{648A5603-2C6E-101B-82B6-000000000014}/1.1/win32]
@="C://WINNT//SYSTEM//MSCOMM32.OCX"

[HKEY_LOCAL_MACHINE/Software/CLASSES/TypeLib/{648A5603-2C6E-101B-82B6-000000000014}/1.1/HELPDIR]
@="C://WINNT//HELP"

[HKEY_CLASSES_ROOT/Licenses/4250E830-6AC2-11cf-8ADB-00AA00C00905]
@="kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun"



然后,存盘。双击文件就完成了注册。

现在,我们介绍一下MSComm在VB.net和C#中和VS6里的不同和实际的应用。在VB.net或C#中建立一个窗口Form1。加入两个MSComm控件,你会发现这里MSComm的默认名字是axMSComm,有点奇怪吧。同时因为命名空间的问题你不能给axMSComm1.InputMode赋0或1这样的值。你只能这样来做如axMSComm1.InputMode=MSCommLib.InputModeConstants.comInputModeBinary或者axMSComm1.InputMode=MSCommLib.InputModeConstants.comInputModeText。

现在我们在窗口中加入textBox和button控件。在Form1_Load中加入以下的代码(C#版本):
         try  
         {  
            axMSComm1.PortOpen =true;
            axMSComm2.PortOpen =true;

            }
         catch  
         {
            MessageBox.Show ("串口操作失败");
         }
(VB.net版本)
            Try
                axMSComm1.PortOpen = True
       axMSComm2.PortOpen = True
            Catch
                MsgBox("串口操作失败", MsgBoxStyle.Critical)
            End Try


在button的Click事件中加入以下代码:
(C#版本)
         byte[] bytOut=new byte[1];
         bytOut[0]=255;
         axMSComm2.Output=bytOut;
//这里我们只发一字节0ffh如果发更多可以定义更大的数组

(VB.net版本)
         Dim bytOut as byte=255
         axMSComm2.Output=bytOut

现在在axMSComm1_OnComm中加入

(C#版本)
   string strIn="" ;
   byte[] bytIn;
   object objIn;
   int i;
   
   axMSComm1.InputMode=MSCommLib.InputModeConstants.comInputModeBinary;
   axMSComm1.InputLen = 0;
   objIn=axMSComm1.Input ; //这里注意axMSComm1.Input返回的是一个object的
   bytIn =(byte[])objIn;   //类型,所以必须使用显式的类型转换,这点和VB不同
   for (i=0;i<=(bytIn.Length-1);i++ )
   {
   strIn +="/r/n"+ " "+bytIn[i].ToString("X"); //转换为16进制显示
   }
   textBox1.Text+=strIn;

(VB.net版本)

   Dim strIn as string =””
   Dim bytIn() as byte
   Dim I as Integer
      
   axMSComm1.InputMode=MSCommLib.InputModeConstants.comInputModeBinary
   axMSComm1.InputLen = 0
   bytIn=axMSComm1.Input  
   For i = 0 To UBound(bytInput)
   
   strIn +="/r/n"+ " "+Hex(bytIn[i])
   Next
   textBox1.Text+=strIn
这里请注意C#在接收的时候与VB的不同。

将axMSComm1的属性RThreshold设置为1,axMSComm1和axMSComm2的SThreshold 设置为0。现在可以编译运行了,请用一条2、3脚跳过线的NullModem线连接计算机的COM1和COM2,运行后,点击button你应该在textBox中看到FF并换行。

这里使用axMSComm1接收axMSComm2发送,只发了一个字节,但更多的字节发送也没什么问题,只要定义更大的数组就可以了,当然如果你感觉MSComm不够强大你可以调用api或者自己定义一个控制串口的类。
MSComm的其他的属性和VS6中没什么太大的不同,你可以自己试试。