精华内容
下载资源
问答
  • VB 6.0串口编程实例

    2017-07-19 17:21:20
    vb6.0 串口调试程序源码,真实可靠
  • Visual Basic串口通信及编程实例
  • VB485通信串口通信实例

    热门讨论 2011-06-02 10:57:03
    VB串口通信实例 含源代码,有与仪表 PLC 单片机,5166卡通信,都含源码,希望对大家有用
  • VB2010串口编程实例

    2016-06-01 15:40:18
    vb2010编写的串口通信实例,可以将接收的数据以ascii,16进制,10进制的方式显示。测试时可以短接串口2,3pin,形成回环测试。
  • vb串口通讯25个实例

    2015-12-18 15:18:32
    vb串口通讯25个实例。利用VB COMMCOM控件读串口数据源码。利用上位机(VB)界面,控制下位机(单片机)彩灯运行。巧用VB.net编写串口程序。三菱FX系列PLC编程通讯和VB源程序范例。实现计算机串口通信,用vb编写,可以...
  • VB串口通信程序设计典型实例[教程]

    热门讨论 2012-08-08 18:37:10
    利用VB开发串口通信程序既可以使用MSComm控件也可以调用Windows API函数实现。不过,只要MSComm控件可以被选用,我们推荐选择此控件实现,因为MSComm控件的功能和API调用一样强,甚至比它还好且使用起来更加简单。 ...
  • VISUAL BASIC串口通信及编程实例
  • vb串口通信编程.pdf

    2019-12-29 14:27:43
    Visual Basic 中有一个名为 Microsoft Communication Control(简称MSComm)...我们只要通 过对此控件的属性和事件进行相应编程操作, 就可以轻松地实现串口通讯。 下面,笔者就简要地介绍一下MSComm 控件的使用方法。
  • 利用Visual Basic 6.0开发Windows平台串口通信程序的常用方法,并结合实际应用给出利用各种方法开发通信程序的关键代码。
  • 在VS2008环境下开发,配置config.ini文件,一个设置为“发送端",另一个设置为"接收端”,用串口线链接两个PC机串口,可通信。其实是一个半成品,仅供菜鸟学习参考,如有不足之处,也请批评指正!
  • vb实现串口通讯的详细说明和实例,Visual Basic6.0( 以 下 简 称VB) 以 其 简 单 易 学、32 位 面 向 对 象 的 程 序 设 计 等 特 点, 倍 受 广 大 计 算 机 开 发 者 的 青 睐, 已 广 泛 地 应 用 于 各 个 领 域...
  • 串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口,现在配电脑好像只有一个。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也...

    这是我3年前的一个例子,最近翻出来回忆一下。

    串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口,现在配电脑好像只有一个。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。串口通信在工控领域用途很广。

    串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。

    典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配:

    a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的vb.net教程波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。

    b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。

    c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

    d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

    串口通信还有一个参数是单工、半双工和双工。

    如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。

    如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。

    如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。

    电话线就是二线全双工信道。 由于采用了回波抵消技术,双向的传输信号不致混淆不清。双工信道有时也将收、发信道分开,采用分离的线路或频带传输相反方向的信号,如回线传输。

    在调试时可以用串口助手和windows的超级终端,不要带电插拔串口,容易烧毁。

    在VB.NET中提供了IO.Ports类,是我们的编程变得很简单,下面是我的例子:

    Form1.vb

    Imports System.IO.Ports
    
    Public Class Form1
    
    Dim WithEvents RS232 As SerialPort
    
    Delegate Sub SetTextCallback(ByVal InputString As String) ? ? ? ‘声明一个代理
    
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    
    For Each sp As String In SerialPort.GetPortNames()
    
    cmbCom.Items.Add(sp)
    
    Next
    
    cmbCom.Sorted = True
    
    cmbCom.SelectedIndex = 0
    
    End Sub
    
    Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click
    
    Dim mBaudRate As Integer
    
    Dim mParity As IO.Ports.Parity
    
    Dim mDataBit As Integer
    
    Dim mStopBit As IO.Ports.StopBits
    
    Dim mPortName As String
    
    mPortName = cmbCom.SelectedItem.ToString
    
    mBaudRate = 9600
    
    mParity = Parity.None
    
    mDataBit = 8
    
    mStopBit = StopBits.One
    
    RS232 = New IO.Ports.SerialPort(mPortName, mBaudRate, mParity, mDataBit, mStopBit)
    
    If Not RS232.IsOpen Then
    
    RS232.Open()
    
    btnSend.Enabled = True
    
    RS232.ReceivedBytesThreshold = 1 ? ? ? ?’设置引发事件的门限值
    
    Else
    
    MsgBox(“通讯端口打开错误!”, MsgBoxStyle.Critical)
    
    End If
    
    End Sub
    
    Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived
    
    Dim InByte() As Byte, ReadCount As Integer, strRead As String
    
    If RS232.BytesToRead <= 0 Then Exit Sub
    
    ReDim InByte(RS232.BytesToRead – 1)
    
    ReadCount = RS232.Read(InByte, 0, RS232.BytesToRead)
    
    strRead = “”
    
    If ReadCount = 0 Then
    
    Exit Sub
    
    Else
    
    For Each bData As Byte In InByte
    
    strRead += bData.ToString & vbCrLf ? ? ‘若有数据则加到接收文本框
    
    DisplayText(strRead)
    
    Next
    
    End If
    
    End Sub
    
    ‘*************************************************
    
    ‘代理子程序
    
    ‘处理上述通信端口的接收事件
    
    ‘由于欲将数据显示到接收文本框中,因此必须检查
    
    ‘是否由另外得Thread所调用的,若是,则必须先
    
    ‘建立代理对象
    
    ‘Invoke用于在拥有控件基础窗口控制代码的线程上
    
    ‘运行代理
    
    ‘*************************************************
    
    Private Sub DisplayText(ByVal comData As String)
    
    ‘如果调用txtReceive的另外的线程,返回true
    
    If Me.txtReceive.InvokeRequired Then
    
    ‘利用代理类型建立对象,并指定代理的函数
    
    Dim d As New SetTextCallback(AddressOf
    
    展开全文
  • fx1n 232通信程序,网上分想的,有时会死机。我也不知是什么 问题,
  • VB串口通信编程源码.rar

    热门讨论 2010-07-05 10:48:08
    VB串口通信编程源码.rar GE plc 串口通讯,VB编制,读取内存单元 HD 6P RFID发卡器、考勤卡钟 串口通讯接口程序 VB 源码 master440变频器的上位机程序,vb编写的源码 PC机与51单片机之间的串口通讯,VB编的,分PC和...
  • 一个VB实现串口通讯的经典示例.非常简明
  • VB-串口通信详解

    千次阅读 2019-09-26 05:03:16
     MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行...MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。Microsoft Communicati...

           转载:https://blog.csdn.net/dongyue786/article/details/8177047

      MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi等语言中均可使用。 Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。

      1.MSComm控件两种处理通讯的方式 

      1.1 事件驱动方式

         事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。这种方法的优点是程序响应及时,可靠性高。每个MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。

      1.2 查询方式 

         查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。 

     

      2.MSComm控件的常用属性

       MSComm1.Settings:=’9600,n,8,1’  //设置波特率 ,校验位,数据位,停止位

       Settings属性: 设置串口的波特率 ,校验位,数据位,停止位, ’9600,n,8,1’表示波特率为9600,无奇偶校验,数据位为8为,1位停止位   

       MSComm1.InBufferSize:=1024  //接受缓冲区大小 

       InBufferSize 属性:接收缓冲区的大小,默认值为1024,也可以自己设定,比如, MSComm1.InBufferSize:=2000,则接收缓冲区的大小为2000字节   

       MSComm1.OutBufferSize:=1024  //发送缓冲区大小 

       OutBufferSize属性:发送缓冲区的大小,默认值为1024,也可以自己设定。  

       MSComm1.InBufferCount:=0  //清空接受缓冲区 

       InBufferCount属性:当前接收缓冲区接收到的数据的长度, count:=MSComm1.InBufferCount,count值接收缓冲区接收到的数据的长度,对InBufferCount赋值      

       MSComm1.InBufferCount:=0  //可以清空接受缓冲区

       MSComm1.OutBufferCount:=0  //清空发送缓冲区 

       OutBufferCount属性:当前发送缓冲区中数据的长度,对OutBufferCount 赋值 

               MSComm1. OutBufferCount:=0  //可以清空发送缓冲区

       MSComm1.InputMode:=comInputModeText  // 以文本方式取回数据 

          MSComm1.InputMode:=comInputModeBinary  //设置接收数据模式为二进制形式 

       InputMode属性:串口接收数据的模式, comInputModeText(0)表示以文本(ASCII)方式取回数据,

               comInputModeBinary(1)表示以二进制方式取回数据

               comInputModeText, comInputModeBinary为预定义常量,分别表示0,1

       RcvByte:=MSComm1.Input 

       Input属性:通过Input属性可以读取串口中接收到的数据,RcvByte:=MSComm1.Input表示读取串口接收到的数据 ,其中RcvByte的数据类型为: array of  Byte 或array  of  Variant.

       在读取之前先设置RcvByte的长度:SetLength(RcvByte,len),如果一次读取所有数据,则SetLength(RcvByte, MSComm1.InBufferCount)

       MSComm1.Output:= OutputDat

       Output属性:通过Output属性可以发送数据, MSComm1.Output:=OutputDat,将OutputDat中的数据发送出去,其中OutputDat数据类型array of  Byte,

       发送前要设置OutputDat的长度, SetLength(OutputDat,len),然后向OutputDat中填入数据,再清空发送缓冲区MSComm1.OutBufferCount:=0,然后再发送MSComm1.Output:=OutputDat

       MSComm1.InputLen:=0  // 一次读取所有数据 

       InputLen属性:一次从Input属性中读取数据的长度, MSComm1.InputLen:=1,表示一次读取一个字节,如果MSComm1.InputLen:=0,则表示一次读取全部数据

       MSComm1.SThreshold:=0  //一次发送所有数据 ,发送数据时不产生OnComm 事件

       SThreshold属性:通过该属性设置产生OnComm 事件(发送时产生)的阀值,若MSComm1.SThreshold:=0, 则一次发送所有数据 ,发送数据时不产生OnComm 事件

       若MSComm1.SThreshold:=5,当发送缓冲区的字节数从5字节减少到4字节时, 产生OnComm 事件

       MSComm1.RThreshold:=1  //每接收1个字节就产生一个OnComm 事件 

       RThreshold属性: 通过该属性设置产生OnComm 事件(接收时产生)的阀值,若MSComm1.RThreshold:=0,不产生OnComm 事件,

       若MSComm1.RThreshold:=5,接收缓冲区每收到5字节时,则产生OnComm 事件

       MSComm1.PortOpen:=True  //打开串口

       PortOpen属性:设置端口的打开与关闭,打开端口MSComm1.PortOpen:=True,

       MSComm1.PortOpen:=False  //关闭端口

       MSComm1.CommPort:=CommPort 

       CommPort属性:设置端口号, MSComm1.CommPort:=1, 设置端口号为COM1

       CommEvent属性: 常用的两个comEvReceive, comEvSend


      3.常数   

    HandShake 常数
    常数描述
    comNone0无握手
    comXonXoff1XOn/Xoff 握手
    comRTS2Request-to-send/clear-to-send 握手
    comRTSXOnXOff3Request-to-send 和 clear-to-send 握手皆可

     

    OnComm 常数
    常数描述
    comEvSend1发送事件
    comEvReceive2接收事件
    comEvCTS3clear-to-send 线变化
    comEvDSR 4data-set ready 线变化
    comEvCD5carrier detect 线变化
    comEvRing6振铃检测
    comEvEOF7文件结束

     

    Error常数
    常数描述
    comEventBreak1001接收到中断信号 
    comEventCTSTO1002Clear-to-send 超时 
    comEventDSRTO1003Data-set ready 超时
    comEventFrame1004帧错误
    comEventOverrun1006端口超速 
    comEventCDTO1007Carrier detect 超时
    comEventRxOver1008接收缓冲区溢出
    comEventRxParity1009Parity 错误 
    comEventTxFull1010传输缓冲区满 
    comEventDCB1011检索端口 设备控制块 (DCB) 时的意外错误 

     

    InputMode常数
    常数描述
    comInputModeText0(缺省)通过 Input 属性以文本方式取回数据
    comInputModeBinary1通过 Input 属性以二进制方式检取回数据

     

      4.属性及应用说明
        CDHolding属性:通过查询 Carrier Detect (CD) 线的状态确定当前是否有传输。Carrier Detect 是从调制解调器发送到相联计算机的一个信号,指示调制解调器正在联机。

        该属性在设计时无效,在运行时为只读。语法 object.CDHolding 设置值:CDHolding

        属性的设置值为: 

        设置           描述 

        True Carrier Detect   线为高电平 

        False Carrier Detect   线为低电平 
        说明:注意当 Carrier Detect 线为高电平 (CDHolding = True) 且超时时,MSComm 控件设置CommEvent 属性为 comEventCDTO(Carrier Detect 超时错误),并产生 OnComm 事件。

        注意 在主机应用程序中捕获一个丢失的传输是特别重要的,例如一个公告板,因为呼叫者可以随时挂起(放弃传输)。Carrier Detect 也被称为 Receive Line Signal Detect (RLSD)。

        数据类型 Boolean

        DSRHolding属性:确定 Data Set Ready (DSR) 线的状态。Data Set Ready 信号由调制解调器发送到相连计算机,指示作好操作准备。该属性在设计时无效,在运行时为只读。
        语法:object.DSRHolding
        object 所在处表示对象表达式,其值是“应用于”列表中的对象。
        DSRHolding 属性返回以下值:
        值            描述 
        True Data Set Ready   线高 
        False Data Set Ready     线低 
        说明:当 Data Set Ready 线为高电平 (DSRHolding = True) 且超时时,MSComm 控件设置 CommEvent 属性为 comEventDSRTO(数据准备超时)并产生 OnComm 事件。
        当为 Data Terminal Equipment (DTE) 机器写 Data Set Ready/Data Terminal Ready 握手例程时该属性是十分有用的。数据类型:Boolean

        Setting属性: 设置并返回波特率、奇偶校验、数据位、停止位参数。
        语法: object.Settings[ = value]
        说明:当端口打开时,如果 value 非法,则 MSComm 控件产生错误 380(非法属性值)。
        Value 由四个设置值组成,有如下的格式:
        "BBBB,P,D,S"
        BBBB 为波特率,P 为奇偶校验,D 为数据位数,S 为停止位数。value 的缺省值是:"9600,N,8,1"

        InputLen属性:设置并返回 Input 属性从接收缓冲区读取的字符数。
        语法 object.InputLen [ = value]
        InputLen 属性语法包括下列部分:
        value 整型表达式,说明 Input 属性从接收缓冲区中读取的字符数。 
        说明:InputLen 属性的缺省值是 0。设置 InputLen 为 0 时,使用 Input 将使 MSComm 控件读取接收缓冲区中全部的内容。
        若接收缓冲区中 InputLen 字符无效,Input 属性返回一个零长度字符串 ("")。在使用 Input 前,用户可以选择检查 InBufferCount 属性来确定缓冲区中是否已有需要数目的字符。

        该属性在从输出格式为定长数据的机器读取数据时非常有用。

        EofEnable属性:确定在输入过程中 MSComm 控件是否寻找文件结尾 (EOF) 字符。如果找到 EOF 字符,将停止输入并激活 OnComm 事件,此时 CommEvent 属性设置为 comEvEOF,
        语法:object.EOFEnable [ = value ]
        EOFEnable 属性语法包括下列部分:
        value 布尔表达式,确定当找到 EOF 字符时,OnComm 事件是否被激活,如“设置值”中所描述。 
        value 的设置值:
        True     当 EOF 字符找到时 OnComm 事件被激活。 
        False (缺省)当 EOF 字符找到时 OnComm 事件不被激活。 
        说明:当 EOFEnable 属性设置为 False,OnComm 控件将不在输入流中寻找 EOF 字符。

      5.错误消息
       下表列出 MSComm 控件可以捕获的错误:

    描述
    380     无效属性值 comInvalidPropertyValue
    383     属性为只读 comSetNotSupported
    394     属性为只读 comGetNotSupported 
    8000   端口打开时操作不合法 comPortOpen
    8001   超时值必须大于 0 
    8002   无效端口号 comPortInvalid
    8003   属性只在运行时有效 
    8004   属性在运行时为只读 
    8005   端口已经打开 comPortAlreadyOpen
    8006   设备标识符无效或不支持该标识符 
    8007   不支持设备的波特率 
    8008   指定的字节大小无效 
    8009   缺省参数错误 
    8010     硬件不可用(被其它设备锁定)
    8011   函数不能分配队列 
    8012   设备没有打开 comNoOpen 
    8013   设备已经打开 
    8014   不能使用 comm 通知 
    8015   不能设置 comm 状态 comSetCommStateFailed
    8016     不能设置 comm 事件屏蔽
    8018   仅当端口打开时操作才有效 comPortNotOpen 
    8019     设备忙 
    8020     读 comm 设备错误 comReadError
    8021     为该端口检索设备控制块时的内部错误 comDCBError

    转载于:https://www.cnblogs.com/ricoo/p/10028166.html

    展开全文
  • Visual Basic串口通信及编程实例
  • VB NET串口通信例子--我的回忆录

    千次阅读 2019-02-13 17:49:06
    VB NET串口通信例子--我的回忆录
                   

    这是我3年前的一个例子,最近翻出来回忆一下。

    串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口,现在配电脑好像只有一个。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。串口通信在工控领域用途很广。

    串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。

    典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配:
    a,波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
    b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
    c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
    d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

    串口通信还有一个参数是单工、半双工和双工。

    如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。

    如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。

    如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。

    电话线就是二线全双工信道。 由于采用了回波抵消技术,双向的传输信号不致混淆不清。双工信道有时也将收、发信道分开,采用分离的线路或频带传输相反方向的信号,如回线传输。

    在调试时可以用串口助手和windows的超级终端,不要带电插拔串口,容易烧毁。

    在VB.NET中提供了IO.Ports类,是我们的编程变得很简单,下面是我的例子:

    Form1.vb

    Imports System.IO.PortsPublic Class Form1    Dim WithEvents RS232 As SerialPort    Delegate Sub SetTextCallback(ByVal InputString As String)       '声明一个代理    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load        For Each sp As String In SerialPort.GetPortNames()            cmbCom.Items.Add(sp)        Next        cmbCom.Sorted = True        cmbCom.SelectedIndex = 0    End Sub    Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click        Dim mBaudRate As Integer        Dim mParity As IO.Ports.Parity        Dim mDataBit As Integer        Dim mStopBit As IO.Ports.StopBits        Dim mPortName As String        mPortName = cmbCom.SelectedItem.ToString        mBaudRate = 9600        mParity = Parity.None        mDataBit = 8        mStopBit = StopBits.One        RS232 = New IO.Ports.SerialPort(mPortName, mBaudRate, mParity, mDataBit, mStopBit)        If Not RS232.IsOpen Then            RS232.Open()            btnSend.Enabled = True            RS232.ReceivedBytesThreshold = 1        '设置引发事件的门限值        Else            MsgBox("通讯端口打开错误!", MsgBoxStyle.Critical)        End If    End Sub    Private Sub RS232_DataReceived(ByVal sender As Object, ByVal e As System.IO.Ports.SerialDataReceivedEventArgs) Handles RS232.DataReceived        Dim InByte() As Byte, ReadCount As Integer, strRead As String        If RS232.BytesToRead <= 0 Then Exit Sub        ReDim InByte(RS232.BytesToRead - 1)        ReadCount = RS232.Read(InByte, 0, RS232.BytesToRead)        strRead = ""        If ReadCount = 0 Then            Exit Sub        Else            For Each bData As Byte In InByte                strRead += bData.ToString & vbCrLf     '若有数据则加到接收文本框                DisplayText(strRead)            Next        End If    End Sub    '*************************************************    '代理子程序    '处理上述通信端口的接收事件    '由于欲将数据显示到接收文本框中,因此必须检查    '是否由另外得Thread所调用的,若是,则必须先    '建立代理对象    'Invoke用于在拥有控件基础窗口控制代码的线程上    '运行代理    '*************************************************    Private Sub DisplayText(ByVal comData As String)        '如果调用txtReceive的另外的线程,返回true        If Me.txtReceive.InvokeRequired Then            '利用代理类型建立对象,并指定代理的函数            Dim d As New SetTextCallback(AddressOf DisplayText)            Me.Invoke(d, New Object() {comData})    '以指定的自变量列表调用函数        Else '相同的线程            'showstring(comData)     '将收到的数据填入接收文本框中            Me.txtReceive.Text += comData        End If    End Sub    Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click        If RS232 Is Nothing OrElse Not RS232.IsOpen Then   '尚未打开            MsgBox("通讯端口尚未打开", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel)        Else            RS232.Close()            btnStart.Enabled = False            btnClose.Enabled = False            RS232 = Nothing        End If    End Sub    Private Sub btnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnd.Click        If Not RS232 Is Nothing Then            If RS232.IsOpen Then RS232.Close()        End If        End    End Sub    Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click        Dim bDataOut(0) As Byte        Try            bDataOut(0) = CType(Me.txtSend.Text, Byte)        '将类型转换为字节            RS232.Write(bDataOut, 0, 1)        Catch ex As Exception            MessageBox.Show("输入数值错误:" + ex.ToString, "错误通知:", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)        End Try    End Sub    Private Sub cmbCom_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles cmbCom.KeyPress        e.KeyChar = ChrW(0)             '禁止用户在其中输入任何文字    End Sub    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click        Me.Hide()        Form2.Show()    End SubEnd Class
    Form2.vb

    '**************************************************************'时间:2008-11-08'作者:lincyang'实际应用中,串行通信的数据可能一次发送大量的数据,'发送之前就必须将数据先编码,'将其编成我们需要的字节数组数据,'才能将这些数据以字节的方式发送出去'目前操作系统使用的字符数据是Unicode:所有的字符均使用'两个字节来表示一个字符'**************************************************************Imports System.IO.PortsImports System.TextPublic Class Form2    Dim RS232 As SerialPort    Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load        For Each sp As String In SerialPort.GetPortNames()            cmbCom.Items.Add(sp)        Next        cmbCom.Sorted = True        cmbCom.SelectedIndex = 0    End Sub    Private Sub btnStart_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStart.Click        Dim mBaudRate As Integer        Dim mParity As IO.Ports.Parity        Dim mDataBit As Integer        Dim mStopBit As IO.Ports.StopBits        Dim mPortName As String        mPortName = cmbCom.SelectedItem.ToString        mBaudRate = 9600        mParity = Parity.None        mDataBit = 8        mStopBit = StopBits.One        RS232 = New IO.Ports.SerialPort(mPortName, mBaudRate, mParity, mDataBit, mStopBit)        If Not RS232.IsOpen Then            RS232.Open()            btnSend.Enabled = True            Timer1.Interval = 100            Timer1.Enabled = True        Else            MsgBox("通讯端口打开错误!", MsgBoxStyle.Critical)        End If    End Sub    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick        Dim InByte() As Byte, ReadCount As Integer        If RS232.BytesToRead <= 0 Then Exit Sub        ReDim InByte(RS232.BytesToRead - 1)        ReadCount = RS232.Read(InByte, 0, RS232.BytesToRead)        If ReadCount = 0 Then            Exit Sub        Else            For Each bData As Byte In InByte                Me.txtReceive.Text += bData.ToString & vbCrLf     '若有数据则加到接收文本框            Next        End If    End Sub    Private Sub btnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnClose.Click        If RS232 Is Nothing OrElse Not RS232.IsOpen Then   '尚未打开            MsgBox("通讯端口尚未打开", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel)        Else            RS232.Close()            btnStart.Enabled = False            btnClose.Enabled = False            Timer1.Enabled = False            RS232 = Nothing        End If    End Sub    Private Sub btnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnSend.Click        Dim bDataOut() As Byte, Buf As String        Dim iSentCount As Integer        Dim Encode1 As Encoding = Encoding.ASCII         '声明编码对象,使用ASCII        Try            Buf = txtSend.Text.Trim()            bDataOut = Encode1.GetBytes(Buf)      '将字符串转换为字节数组            iSentCount = bDataOut.GetLength(0)     '发送总字节数            '显示出总字节数            lblSentCount.Text = "总传输量:" & iSentCount.ToString & "字节"            RS232.Write(bDataOut, 0, iSentCount)        Catch ex As Exception            MessageBox.Show("输入数值错误:" + ex.ToString, "错误通知", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)        End Try    End Sub    Private Sub btnEnd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnEnd.Click        If Not RS232 Is Nothing Then            If RS232.IsOpen Then RS232.Close()        End If        End    End Sub    Private Sub cmbCom_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles cmbCom.KeyPress        e.KeyChar = ChrW(0)             '禁止用户在其中输入任何文字    End SubEnd Class

    开发环境是VB2008,源码下载 猛击这里

               

    再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow

    展开全文
  • VB串口通信源码210个

    千次下载 热门讨论 2013-10-15 11:32:27
    069、VB利用Mscomm控件编写的通讯终端,可做串口通讯编程参考示例 070、VB平台单片机与PC机串口通信的PC端程序。小巧易用,功能丰富 071、VB嵌入式串口通讯波形分析显示软件 072、VB实现串口调试LED信息显示屏设备...
  • 三菱FXPLC编程通讯实例,可以快速实现对与PLC的控制。注意:采用的是编程通信,而不是采用的通信模块进行通信
  • 前言:在上一篇文章中,笔者向大家初步介绍了VB6.0中MSComm控件的安装和它的基本属性,今天带大家来动手写一写代码,毕竟开发中实践是一个极其重要的环节。 ...

    MSComm控件串口通信开发

    1. MSComm控件的处理流程

      MSComm在适当时候引发控件的处理流程主要分为两步:

    1)通过事件驱动处理连接端口通信
      在收发一个字符或者生一个事件时,不管是产生一个事件还是错误(这取决于CommEvent的属性值),都会执行控件的事件程序OnComm()。我们需要预先将处理事件或者错误的逻辑代码输入在控件事件区。

    2)检查CommEvent的属性值
      通过检查CommEvent的值来判断是事件还是错误,并根据触发事件时CommEvent不同的值编写不同的分支来处理对应事件。对于处理串口收发数据,最常用的事件属性值有comEvSend(发送数据)comEvReceive(接收数据)

    2.上位机和下位机之间连接

      在早期,上位机和下位机之间经常使用的通信方式是RS-232的串行通信控制。直到今天,在USB通信普遍使用的方式下,PC端的应用软件依然是应用RS-232通信,保护了原有的软件开发投入。本次实验用的接口是较为常见USB接口,板子上采用了USB转串口芯片进行信号的转换。


    局部功能

    1.检查当前可用的串口

      上篇文章中讲到,VB6.0中MSComm控件的端口号仅限于1~16,并且大多数情况下用于插拔的USB都不是一个固定值,因此,我们首先需要获取PC机当前状态下可用于连接的串口端口号。

      代码如下:

    On Error Resume Next	'打开端口出错时,程序不会中断
        Dim I As Integer 
        For I = 1 To 16 Step 1 '依次打开1~16的端口
    	MSComm1.CommPort = I
           	MSComm1.PortOpen = True
           	If Err.Number <> comPortInvalid Then
                Combo1.AddItem "COM" & I  '获取能够正确打开的端口号
            End If
            MSComm1.PortOpen = False
         Next
       Combo1.Text = Combo1.List(0)  '将可用串口展示在在下拉菜单中

      效果如下图:
    在这里插入图片描述
    相关代码

    (1)On Error Resume Next
      加上这句语句后,若当程序运行到某处出错时,不会中断,而是会存储出错信息到某处,然后继续执行后面的代码。在这里使用它的原因是,如果当时上位机并没有相应的串口设备注册,那么当我们企图打开一个串口时,会因错误中断而导致程序无法进行下去。加上这句话后,再结合MSComm1.PortOpen属性判断串口是否正确打开,以便于进行接下来的不同操作。

    (2)Err.Number <> comPortInvalid
      这句代码配合前面的On Error Resume Next使用。当发现打开串口出错时,继续执行后续代码,但这时已经将错误码存储于Err.Number之中,检查其是否和comPortInvalid相等,可判断该端口是否可用于串行通信。是,则将其加入下拉列表中。

    2.串口打开按钮

      在找到对应的可打开串口后,选择其中一个串口打开,这时候,也需要检查串口是否能够正确打开,如果出错,则对用户进行提示。针对打开按钮的单击操作如下:

    On Error Resume Next  ’打开出错时不中断
        If MSComm1.PortOpen = False Then
            MSComm1.CommPort = Right(Combo1.Text, Len(Combo1.Text) - 3) 
            MSComm1.PortOpen = True
            If Err.Number = comPortInvalid Then
                MsgBox "无法打开串口,请检查串口是否有效", vbOKOnly, "串口打开错误"
            Else
                Command1.Caption = "关闭"
            End IF
        Else
            MSComm1.PortOpen = False
            Command1.Caption = "打开"
        End If

      在上述代码中,如果不能 正确打开串口,会弹出消息框(MsgBox)报错,如下图:
    在这里插入图片描述

    3.串口通信的设置

      在使用串口通信前,或者说打开串口前,应该对串口通信参数进行基础配置。这些配置参数可以在添加控件时的属性栏中进行编辑,也可以独自在代码中列出,如下:

     MSComm1.Settings = "9600,o,82"    '设置串口通信波特率
     MSComm1.InBufferSize = 1024	'接收缓冲区大小
     MSComm1.OutBufferSize = 512	'发送缓冲区大小
     MSComm1.InputLen = 32		'每次从接收缓冲区中取出的字节数
     MSComm1.InputMode = comInputModeBinary  '设置为字节流传送
     MSComm1.RThreshold = 9		'接收阈值,当接收字节数>=9时,触发接收事件
     MSComm1.RTSEnable = True       '接收功能使能
     MSComm1.SThreshold = 0         '设置为0,不会触发comEvSend事件

    4.接收数据帧展示(十六进制)

      我们可以采用一个Text文本框进行接收数据的显示,将二进制字节数据转化为十六进制数据并以空格分隔显示在文本框当中。
    1)对于文本框的设置
      对于文本框,我们希望其可以将每一帧数据进行滚动显示,并且每次都显示最后一帧数据,于是进行如下设置:

    Text28.MultiLine = True  	   '允许多行显示
    Text28.ScrollBars = 2    	   '垂直滚动显示
    Text28.SelStart = Len(Text28.Text) '光标移到最后,每次显示最后一行

    2)进制转换代码

    Public Function ReceiveToHex(bytInput() As Byte) As String
        Dim I As Integer
        Dim strData As String
        For I = 0 To UBound(bytInput)   '遍历接收数组
            If Len(Hex(bytInput(I))) = 1 Then '无效0填充
                strData = strData & "0" & Hex(bytInput(I)) & " " 
            Else
                strData = strData & Hex(bytInput(I)) & " " 
            End If
        Next
        ReceiveToHex = strData & vbCrLf '末尾插入换行符
    End Function

      效果图如图所示:
    在这里插入图片描述

    5.发送数据设置

      数据的发送使用了一个50ms的定时器,对发送数组进行内容填充更新,然后将该数组的值送入发送缓冲区。在定时器执行过程中有如下代码:

     PackTranData		    '自定义数据填充更新函数
     MSComm1.Output = bytOutput '将更新后的数组送入发送缓冲区

      **注:**由于数据发送缓冲区的数据填充过程并不是每次都从头开始存放数据,而是采用游标移动添加数据,所以每次数据帧在传送字节流的具体位置并不固定,比如:这次发送的数据是:

    00 00 5A A5 06 00 00 00 00 00 00 00 00 00 00 00 00 00 

    下一次的数据很可能是:

    00 00 00 00 00 00 00 00 00 00 5A A5 06 00 00 00 00 00 

    所以这时候,在下位机的接收端找到对应的数据帧十分重要,帧头和帧尾的重要性凸显。

    展开全文
  • 此资源是使用VB进行串口程序设计的经典实例,包括以下内容: 1、PC机与PC机串口通信程序设计 2、PC机与单片机串口通信程序设计 3、PC机与智能仪器串口通信程序设计 4、PC机与PLC串口通信程序设计 5、PC机与PLC串口...
  • 该程序是在VS2010用VB写的串口通信程序(串口调试助手),已通过测试,基本功能完整。
  • VB.NET串口通信例子--我的回忆录

    万次阅读 多人点赞 2011-11-13 19:16:38
    串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口,现在配电脑好像只有一个。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也...
  • VB网络编程实例

    千次下载 热门讨论 2007-05-29 15:46:04
    ◆ 88.htm 用VB创建自己的通信程序 ◆ 89.htm 用VB构建Internet的应用[微软提供] ◆ 90.htm 用VB开发标准CGI程序 ◆ 91.htm 用VB实现客户——服务器(TCP IP)编程实例 ◆ 92.htm 用VB实现...
  • 串口编程(python串口通信实例)

    千次阅读 2021-03-05 14:11:07
    串口编程用于工业控制,PC侧可利用MSCOMM控件或WIN API函数操作串口(RS232口)与外设进行通信,命令外设执行某种操作,获取外设返回的数据,进行数据处理.我想通过串口调试助手给单片机发1-30的数,然后在单片机里有...
  • vb串口通信编程

    千次阅读 2009-09-26 14:25:00
    提到串口通讯编程,人们往往立刻想到C、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。 实际上,只要我们借助相关ActiveX控件的帮助,即使是在底层操作一向不被人看好的VB中,一样能够实现串口通 ...
  • VB上位机程序以及串口通信的相关资料!
  • (2019-05-15更新)VB串口通信源码411例+数据采集与串口通信测控应用实战PDF电子书+源代码,2019-05-15最新整理411例,还带有PDF测控应用实战PDF电子书 和源代码!学习VB实例多多,总有适合你学习提高的实例!学习VB...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,444
精华内容 577
关键字:

vb串口通信及编程实例

友情链接: rewubiao.rar