对于从事工控和单片机工作的人来说串口编程是很常用的和很重要的。事实上在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\0]
[HKEY_LOCAL_MACHINE\Software\CLASSES\TypeLib\{648A5603-2C6E-101B-82B6-000000000014}\1.1\0\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中没什么太大的不同,你可以自己试试。
MSComm控件
MSComm控件提供了两种处理通信的方法:
1.事件驱动通信,是一种功能很强的处理串口活动的方法。在大多数情况下,用户需要获知事件发生的时间,例如,在CD(Carrier
Detect)线或RTS(Request To
Send)线上有字符到达或发生了改变等。在这种情况下,使用MSComm控件的OnComm事件捕获和处理这些通信事件。OnComm也可以捕获和处理通信中的错误。要获取所有事件和通信错误的完整清单,请参阅CommEvent属性。
2.用户也可以在每个重要的程序功能之后检查CommEvent属性的值来检测事件和通信错误。这对小的自含程序可能比较常用。例如,如果编写一个简单的电话拨号程序,那么在接收了每个字符后都产生一个事件并没有意义,因为你只打算从调制解调器中接收OK响应信息。
使用的每个MSComm控件都与一个串口对应。如果在应用程序中需要访问多个串口,必须使用多个MSComm控件。可以在Windows
控制面板中修改串口地址的中断地址。
MSComm 控件有很多重要的属性,但首先必须熟悉几个属性。
属性 描述
CommPort 设置并返回通讯端口号。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向传输缓冲区写一个字符串。
VB联机帮助上的内容,摘录下了看看有帮助没?
MSComm 控件
MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
语法
MSComm
说明
MSComm 控件提供下列两种处理通讯的方式:
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在程序的每个关键功能之后,可以通过检查 CommEvent
属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
每个使用的 MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。可以在
Windows“控制面板”中改变端口地址和中断地址。
尽管 MSComm 控件有很多重要的属性,但首先必须熟悉几个属性。
属性 描述
CommPort 设置并返回通讯端口号。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向传输缓冲区写一个字符串。
MSComm 控件示例
下面这个简单的例子演示了用调制解调器进行基本的串行通讯:
Private Sub Form_Load ()
Dim Instring As String
' 使用 COM1。
MSComm1.CommPort = 1
' 9600 波特,无奇偶校验,8 位数据,一个停止位。
MSComm1.Settings = "9600,N,8,1"
' 告诉控件读入整个缓冲区。
MSComm1.InputLen = 0
MSComm1.PortOpen = True
' 将 attention 命令送到调制解调器。
MSComm1.Output = "ATV1Q0" & Chr$(13) ' 确保
' 调制解调器以"OK"响应。
Do
DoEvents
Buffer$ = Buffer$ & MSComm1.Input
Loop Until InStr(Buffer$, "OK" & vbCRLF)
' 从串行端口读 "OK" 响应。
' 关闭串行端口。
MSComm1.PortOpen = False
End Sub
注意 MSComm 控件可以采用轮询或事件驱动的方法从端口获取数据。这个简单的例子使用了轮询方法。关于事件驱动方法的例子请参阅 OnComm 事件的帮助。
为什么我的VB6.0的部件中找不到MSCOMM控件,还有要怎么用这个控件啊?我的饿任务是用VB对串行口输入3组8位数据,希望VB的高手能够指教一下,有源代码的更好。谢谢
部件-控件-浏览-c:/windows/system32/mscomm32.ocx regsrv32 c:/windows/system32/mscomm32.ocx
我是初学者,看一些介绍MSComm控件属性的教程都有介绍PortOpen,Input,Output属性,而我的电脑上vb没有这3个属性,MSComm控件可以添加,就是其中的属性不全,为什么?我用的大企业集成版,谢谢~
MSComm控件的属性
PortOpen
Input
Output
假如你添加的MSComm控件NAME为MSComm1,你可在代码窗口键入MSComm1.
VB即在后出现各属性等名称,你可一一选择。
可以通过在控件面板上右键添加新的控件来将MsComm图标加到控件面板上,将图标拖放到VB面板上,通过其属性窗口或者右键的属性设置设置通讯协议。双击MsComm控件,在代码窗口中应该会自动显示位OnComm事件,然后就可以编写显示代码了。