VB串口通信程序代码

合集下载

一个简单的VB串口发送程序(源码)

一个简单的VB串口发送程序(源码)

一个简单的VB串口发送程序(源码)!-----发送按钮Click事件子程序-----------Private Sub Fasong_Click()Dim JIHAO(0) As Byte ’机号Dim head_data(4) As Byte ’5 Byte控制字Dim end_data(0) As Byte '1 Byte 结束字JIHAO(0) = Val(Text3.Text)head_data(0) = Val(Text4.Text)head_data(2) = &HEE 'TIMHhead_data(3) = &HEE 'TIMLhead_data(4) = Val(Combo1.Text) 'INMODend_data(0) = &HFFIf Combo2.Text = "增加" Then head_data(1) = &H99If Combo2.Text = "清空" Then head_data(1) = &H33If Combo2.Text = "删除" Then head_data(1) = &H32Ready = 0: ErrCount = 0On Error GoTo ERRORCOM ’打开错误处理'----------------------------------------------------------If com1.Value Then mPort = 1 'Use com1If com2.Value Then mPort = 2 'Use com2MSComm1.Settings = bo3.Text + ",M,8,2" '设定波特率和置校验和位为1MSComm1.InputLen = 0 'MSComm1.PortOpen = -1 'Open the portMSComm1.OutBufferCount = 0MSComm1.Output = JIHAO ‘发送机号MSComm1.PortOpen = False ’关闭串口MSComm1.Settings = bo3.Text + ",S,8,2" '设定波特率和置校验和位为空MSComm1.OutBufferCount = 0MSComm1.PortOpen = TrueMSComm1.Output = head_dataMSComm1.Output = Text2.TextMSComm1.Output = end_dataMSComm1.PortOpen = FalseText1.Text = "发送成功!" + Chr(13) & Chr(10) + "发送至" + Text3.Text + "屏体," + "信息编号:" + Text4.Text + Chr(13) & Chr(10) + Chr(13) & Chr(10) + Text1.TextGoTo comendERRORCOM:Text1.Text = "ERROR!请重新选择COM口!" + Chr(13) & Chr(10) + Chr(13) & Chr(10) + Text1.Textcomend:On Error GoTo 0End Sub。

VB串口通信程序代码

VB串口通信程序代码

vb中怎样用mscomm控件实现串口通信本问分两部分均来自第一部分jessezappy(晶晶)================================================================================== If MSComm1.PortOpen Then MSComm1.PortOpen = FalsemPort = 1 '假定是用COM1口' 设定传输速率等,可依照您的需求更改MSComm1.Settings = "9600,N,8,1"MSComm1.PortOpen = True'---------初始化Modem-------------MSComm1.Output = "ATZ"MSComm1.Output = "AT&F"MSComm1.Output = "ATE0"MSComm1.Output = "ATM1"MSComm1.Output = "ATQ0"MSComm1.Output = "ATV0"'--------------------------拨号-------------MSComm1.Output ="ATDT163" '拨163'---------------------------接通后MSComm1.Output ="SDFJDKSJLKFA" '发送字符串'---------------------Private Sub MSComm1_OnComm() '用串口事件捕捉数据..If MSComm1.InBufferCount Then' 通讯埠中假如有资料的话, 则读取进来InStringB = InStringB & MSComm1.Input' 如果资料中有Chr(13) 和Chr(10) 的话, 则显示出来If InStr(InStringB, vbCrLf) Theninstring = instring & InStringBAddText Text3, InStringB, FalseInStringB = ""End IfEnd IfEND SUB'-------------------------挂断--------MSComm1.PortOpen = False '这个挂断方法不能适用所有MODEM,我正在研究...通用办法================================================================================================第二部分:===========================================================================最后借你一篇文章看,作者不是我,里面的不一定都对..'-----------------------------------------------------------VB Mscomm控件应用江苏戚墅堰机车车辆厂设计处(213011) 李秉璋--------------------------------------------------------------------------------Visual Basic 6.0(以下简称VB) 是一种功能强大、简单易学的程序设计语言。

VB6 实时 串口通信 数据采集代码

VB6 实时 串口通信 数据采集代码

VB6 实时串口通信数据采集代码介绍VB6.0利用MSComm通信控件,开发微机通过串口对工业仪表进行实时数据采集的编程技术。

给出的程序代码具有通用性,并有详细的注释,可以直接或稍加改动后用于其他数据采集或实时控制程序中。

----一台工业专用实时检测仪表,接高精度位移传感器,用于测量微小形变或微量位移,仪表测量精度为0.01毫米,测量范围最大值为50毫米。

该仪表带有一个9针的RS-232C 串口,能与微机进行串口数据通信,实时传送检测数据,通过微机软件处理可实现工业实时监控。

----该仪表的串口数据通信协议是:数据传输速率为9600bps,1位开始位,8位数据位,1位停止位,无奇偶校验位。

仪表每秒发送50帧检测数据,每帧数据由4个字节组成。

第一个字节定义为二进制常数0F0H,是每帧数据开始的标志字节;后面连续2个字节为数据字节,采用压缩的BCD码编码方式,高位在前,低位在后,即一个字节表示两位十进制数,则两个字节表示四位十进制数,小数点采用固定形式,定义在两字节中间;第四个字节为符号字节,该字节第八位为1,即:1 x x x x x x x 则为负数;第八位为0,即:0 x x x x x x x 则为正数。

----例如:0F0H 26H 87H 80H 0F0H 34H 62H 00H 表示-26.87 34.62。

----通信传输速率为9600bps,则最快速度1.04ms发送一帧数据。

9600bps = 1200Bps这样计算出来的结果相当于8bits/Frame,现在串口中协议是10bits/Frame,求解方程1200 * 8 = x * 10得到x = 960Frame/s。

1000/960 = 1.04167Frame/ms。

仪表每秒发送50帧数据,每帧数据有4个字节,即每秒发送200个字节,平均5.0ms 发送一个字节,连续读取串口数据时要在程序中添加循环等待程序。

----为了实现实时监测功能,接收数据的读取要尽可能的快速,则设置MSComm1的属性如下:RThreshold = 1 接收缓冲区收到一个字节产生OnComm事件InputLen = 1 每次读取一个字节----仪表每秒发送50帧数据,微机收到一帧完整数据至少需要20 ms 时间(1000/50=20),然后再进行数据处理。

VB中串口通讯的实现

VB中串口通讯的实现

VB中串口通讯的实现在VB中实现串口通讯需要借助于SerialPort类,该类提供了一系列方法和属性用于串口的配置和通讯操作。

接下来,定义一个SerialPort对象和一个字节数组,用于接收和发送数据。

在窗体加载事件中初始化SerialPort对象,并设置串口的一些属性,如波特率、数据位、校验位等,根据实际需求进行配置。

还可以设置数据接收和发送的事件处理函数。

例如,下面的代码演示了如何配置串口:```vbImports System.IO.PortsPublic Class Form1Dim serialPort As New SerialPortDim receiveBuffer(255) As BytePrivate Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load'配置串口属性serialPort.PortName = "COM1"serialPort.BaudRate = 9600serialPort.DataBits = 8serialPort.Parity = Parity.NoneserialPort.StopBits = StopBits.One'数据接收事件处理函数AddHandler serialPort.DataReceived, AddressOfSerialPort_DataReceived'打开串口serialPort.OpenEnd SubPrivate Sub SerialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs)'接收数据Dim bytesToRead As Integer = serialPort.BytesToReadDim bytesRead As Integer = serialPort.Read(receiveBuffer, 0, bytesToRead)'处理接收到的数据If bytesRead > 0 ThenDim receivedData As String =Encoding.ASCII.GetString(receiveBuffer, 0, bytesRead) '显示接收到的数据UpdateReceivedData(receivedData)End IfEnd SubPrivate Sub btnSend_Click(sender As Object, e As EventArgs) Handles btnSend.Click'发送数据Dim sendData As String = txtSendData.TextDim sendBuffer As Byte( = Encoding.ASCII.GetBytes(sendData) serialPort.Write(sendBuffer, 0, sendBuffer.Length)'清空发送框txtSendData.Text = ""End SubPrivate Sub UpdateReceivedData(data As String)'更新接收数据的显示If Me.InvokeRequired Then ' 跨线程调用控件Me.Invoke(Sub( UpdateReceivedData(data))ElselblReceivedData.Text = dataEnd IfEnd SubEnd Class```在上述代码中,我们主要关注Form1_Load事件处理函数和btnSend_Click事件处理函数。

vb串口通信编程

vb串口通信编程

vb串口通信编程一、概述串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于PC间的通讯以及PC和单片机之间的通讯之中。

提到串口通讯的编程,人们往往立刻想到C、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。

实际上,只要我们借助相关ActiveX控件的帮助,即使是在底层操作一向不被人看好的VB 中,一样能够实现串口通讯,甚至其实现方法和C、汇编相比,要更加快捷方便。

下面,笔者就介绍一下在VB中实现串口通讯的方法。

在Visual Basic中有一个名为Microsoft Communication Control(简称MSComm)的通讯控件。

我们只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。

下面,笔者就简要地介绍一下MSComm控件的使用方法。

二、MSComm控件的主要属性、事件1、MSComm的属性由于MSComm控件属性很多,在此笔者仅介绍与实现串口通讯密切相关的核心属性。

Commport:设置通讯所占用的串口号。

如设成1(默认值),表示对Com1进行操作。

Setting:对串口通讯的相关参数。

包括串口通讯的比特率,奇偶校验,数据位长度、停止位等。

其默认值是“9600,N,8,1”,表示串口比特率是9600bit/s,不作奇偶校验,8位数据位,1个停止位。

Portopen:设置串口状态,值为True时打开串口,值为False时关闭串口。

Input:从输入寄存器读取数据,返回值为从串口读取的数据内容,同时输入寄存器将被清空。

Ouput:发送数据到输出寄存器。

InBufferCount:设置输入寄存器所存储的字符数,当将其值设为0时,则输入寄存器将被清空。

InputMode:设置从输入寄存器中读取数据的形式。

若值为0,则表示以文本形式读取;值为1,则表示以二进制形式读取。

OutBufferCount:设置输出寄存器所存储的字符数,当将其值设为0时,则输出寄存器将被清空。

VB串口通信(附图教程)

VB串口通信(附图教程)

界面如下:代码如下:Private Sub Form_Load()If MSComm1.PortOpen = True Then MSComm1.PortOpen = False ElseEnd IfCombo1.AddItem "COM1"Combo1.AddItem "COM2"Combo1.AddItem "COM3"Combo1.AddItem "COM4"Combo1.AddItem "COM5"Combo1.AddItem "COM6"Combo1.AddItem "COM7"Combo1.AddItem "COM8"Combo1.AddItem "COM9"Combo1.AddItem "COM10" Combo1.AddItem "COM11" Combo1.AddItem "COM12"Combo1.AddItem "COM13"Combo1.AddItem "COM14"Combo1.AddItem "COM15"Combo1.AddItem "COM16"Combo1.ListIndex = 2Combo2.AddItem "256000"Combo2.AddItem "128000"Combo2.AddItem "115200"Combo2.AddItem "57600"Combo2.AddItem "38400"Combo2.AddItem "28800"Combo2.AddItem "19200"Combo2.AddItem "14400"Combo2.AddItem "12800"Combo2.AddItem "11520"Combo2.AddItem "9600"Combo2.AddItem "4800"Combo2.AddItem "2400"Combo2.AddItem "1200"Combo2.AddItem "600"Combo3.AddItem "无None"Combo3.AddItem "奇Odd"Combo3.AddItem "偶Even"Combo4.AddItem "4"Combo4.AddItem "5"Combo4.AddItem "6"Combo4.AddItem "7"Combo4.AddItem "8"Combo5.AddItem "1"Combo5.AddItem "2"mPort = Combo1.ListIndex + 1 MSComm1.Settings = "9600,n,8,1"ComOpen.Caption = "打开串口"Shape1.FillColor = &HFFFFC0End SubPrivate Sub ComOpen_Click()On Error GoTo uerror '发现错误跳转到错误处理If ComOpen.Caption = "关闭串口" ThenMSComm1.PortOpen = FalseComOpen.Caption = "打开串口" '按钮文字改变Shape1.FillColor = &HFFFFC0 '灯颜色改变ElseMSComm1.PortOpen = TrueComOpen.Caption = "关闭串口"Shape1.FillColor = &HFFEnd IfExit Subuerror:msg$ = "无效端口号" '错误显示Title$ = "串口调试助手"X = MsgBox(msg$, 48, Title$) '48标示显示警告图标End SubPrivate Sub MSComm1_OnComm()Dim BytReceived() As ByteDim strBuff As StringDim i As IntegerSelect Case mEvent '事件发生Case 2ClsMSComm1.InputLen = 0 '读入缓冲区全部内容strBuff = MSComm1.Input '读入到缓冲区Label10.Caption = Label10.Caption + Len(strBuff) '接收计数If MSComm1.InputMode = comInputModeBinary ThenBytReceived() = strBuff '如果是二进制接收模式则进行数据处理,否则直接显示字符串For i = 0 To UBound(BytReceived)If Len(Hex(BytReceived(i))) = 1 ThenstrData = strData & "0" & Hex(BytReceived(i)) & " " '如果只有一个字符,则前补0,如F显示0F,最后补空格Else '方便显示观察如:00 0F FEstrData = strData & Hex(BytReceived(i)) & " "End IfNextTextReceive = TextReceive & strDatastrData = ""ElseTextReceive = TextReceive & strBuffEnd IfEnd SelectEnd SubPrivate Sub ComSend1_Click() '手动发送Dim Temp(0) As ByteDim strBuff As StringIf Option1.Value = True Then '如果显示16进制发送则进行16进制处理,这里只发送一个Temp(0) = "&H" & TextSendMSComm1.Output = Temp '发送一个16进制ElsestrBuff = TextSendEnd IfIf MSComm1.PortOpen = False ThenMsgBox "请打开串口"End IfOn Error GoTo uerrorMSComm1.Output = strBuffLabel11.Caption = Label11.Caption + Len(strBuff) '发送计数uerror:End SubPrivate Sub ComSend2_Click()If ComSend2.Caption = "自动发送" ThenComSend2.Caption = "关闭自动发送"Timer1.Interval = TextTime.TextTimer1.Enabled = TrueElseComSend2.Caption = "自动发送"Timer1.Enabled = FalseEnd IfEnd SubPrivate Sub ComClean1_Click()TextSend.Text = "" '清空发送窗口End SubPrivate Sub Option3_Click()MSComm1.InputMode = comInputModeBinary '选择接收方式End SubPrivate Sub Option4_Click()MSComm1.InputMode = comInputModeText '选择接收方式End SubPrivate Sub Timer1_Timer()Call ComSend1_Click '定时调用手动发送End SubPrivate Sub Timer2_Timer()If Combo3 = "无None" ThenMSComm1.Settings = Str(Combo2) + "N" + Str(Combo4) + Str(Combo5) ElseIf Combo3 = "奇Odd" ThenMSComm1.Settings = Str(Combo2) + "O" + Str(Combo4) + Str(Combo5) ElseIf Combo3 = "偶Even" ThenMSComm1.Settings = Str(Combo2) + "E" + Str(Combo4) + Str(Combo5) End IfEnd SubPrivate Sub Combo1_Click()If MSComm1.PortOpen = True Then '如果串口打开先关闭后再进行其他操作MSComm1.PortOpen = FalseEnd IfmPort = Combo1.ListIndex + 1 '读取com口号End SubPrivate Sub ComClean3_Click()Label10.Caption = 0Label11.Caption = 0End SubPrivate Sub ComClean2_Click()TextReceive.Text = "" '接收窗口End Sub功能上:实现了字符串的发送和接收,8位数据的十六进制发送和接收,有端口,波特率等设置。

VB通讯源代码

VB通讯源代码

VB与串行通信编程实例代码如下:Private Sub Command1_Click()MSComm1.Output = "123456"End SubPrivate Sub Form_Load()MSComm1.PortOpen = TrueMSComm1.RThreshold = 1MSComm1.SThreshold = 1MSComm1.InputMode = comInputModeText Text1 = ""End SubPrivate Sub MSComm1_OnComm()Select Case mEventCase comEvSendText1 = "comEvSend"Case comEvReceiveText1 = "comEvReceive"Case comEvCTSText1 = "comEvCTS"Case comEvDSRText1 = "comEvDSR"Case comEvCDText1 = "comEvCD"Case comEvRingText1 = "comEvRing"Case comEvEOFText1 = "comEvEOF"End SelectEnd Sub以下参考MSDN:OnComm 常数常数值描述comEvSend 1 发送事件。

comEvReceive 2 接收事件。

comEvCTS 3 clear-to-send 线变化。

comEvDSR 4 data-set ready 线变化。

comEvCD 5 carrier detect 线变化。

comEvRing 6 振铃检测。

comEvEOF 7 文件结束。

MSComm 控件提供下列两种处理通讯的方式:事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。

VB串口通信程序实例

VB串口通信程序实例

VB 串口通信程序设计典型实例利用 VB 开发串口通信程序既可以使用 MSComm 控件也可以调用 Windows API 函数实 现。

不过,只要 MSComm 控件可以被选用,我们推荐选择此控件实现,因为 MSComm 控 件的功能和 API 调用一样强,甚至比它还好且使用起来更加简单。

在本章提供的串口通信程序设计中,除了 PC 与 PC 串口通信外,PC 与单片机、PC 与 智能仪表、PC 与 PLC、PC 与 GSM 短信模块等串口通信任务的实现均采用 MSComm 控件。

6.1 PC 与 PC 串口通信程序设计当两台串口设备通信距离较近时,可以直接连接,最简单的情况,在通信中只需 3 根线 (发送线、接收线、信号地线)便可实现全双工异步串行通信。

本设计通过两台 PC 串口 3 线连接,介绍了利用 API 函数和 MSComm 控件设计串口通 信程序的方法,包括字符与文件的发送与接收。

6.1.1 PC 与 PC 串口通信程序设计目的(1)掌握 PC 与 PC 串口通信的线路连接方法。

(2)利用 MSComm 控件和 API 函数实现 PC 与 PC 串口通信的程序设计方法。

6.1.2 PC 与 PC 串口通信程序设计用软、硬件本设计用到的硬件和软件清单如表 6-1 所示。

表 6-1 序 1 2 3 号 PC 或 IPC 串口通信线(三线制) Visual Basic 6.0 设计用软、硬件 名 称 数 2 1 1 量6.1.3 PC 与 PC 串口通信程序硬件线路图线路说明,在计算机通电前,按图 6-1 所示将两台 PC 通过串口线连接起来:计算机 A 串口 COM1 端口的 TXD 与计算机 B 串口 COM1 端口的 RXD 相连, 计算机 A 串口 COM1 端 口的 RXD 与计算机 B 串口 COM1 端口的 TXD 相连, 计算机 A 串口 COM1 端口的 GND 与 计算机 B 串口 COM1 端口的 GND 相连。

VB串口通信源程序[1]

VB串口通信源程序[1]

Private Sub Form_Load()'设置打开端口If OpenPort(3) = False ThenMsgBox "串口打开失败!"End IfEnd SubPrivate Sub Command1_Click()Dim sBuf(2) As BytesBuf(0) = &H55sBuf(1) = &H31sBuf(2) = &HFFIf SendByte(sBuf) = False ThenEnd IfEnd Sub'收到数据产生MSComm事件Private Sub MSComm1_OnComm()Dim i As IntegerDim rBuf() As ByterBuf = MSComm1.InputFor i = 0 To UBound(rBuf)Debug.Print rBuf(i)Next iEnd Sub'串口初始化Private Function OpenPort(PortNum As Integer) As BooleanOn Error GoTo ErrExit '出错转移到ErrExit处理With Me.MSComm1.CommPort = PortNum '端口号.Settings = "9600,n,8,1" '波特率=9600bps;n(无奇偶校验)e(偶校验)o(奇校验);8位数据位;1位停止位.InputMode = 1 '采用二进制数据传输.NullDiscard = False 'NULL字符从端口传送到接受缓冲区.DTREnable = False 'DTR线无效.EOFEnable = False '不寻找EOF符.RTSEnable = False 'RTS线无效.InBufferCount = 0 '清空接受缓冲区.OutBufferCount = 0 '清空传输缓冲区.SThreshold = 0 '不产生MSComm事件.RThreshold = 1 '产生MSComm事件.InputLen = 0 '当输入占用时,告诉控件读入整个缓冲区。

vb串口通讯代码

vb串口通讯代码

严重同意ZZJ1382的观点,可是在wincc里使用VBS还是还是很困难,不知道哪位能说明白一点。

下面是我在VB里的代码,已经测试过,可以读取串口数据,希望有一位高手帮忙研究在wincc中使用,谢谢!Dim SMSType As IntegerDim Senddata() As ByteDim Readsmsno As ByteSub opentestnote()wrap$ = Chr$(13) & Chr$(10)CommonDialog1.Filter = "text filer (*.txt)|*.txt"CommonDialog1.FileName = ""CommonDialog1.ShowOpen '使用通用对话框对象提示用户输入路径名'If Err = cdlCancel Then Exit SubIf CommonDialog1.FileName <> "" ThenForm1.MousePointer = 11Open CommonDialog1.FileName For Input As #1 '打开用户所指定的输入文件(Open...For Input)On Error GoTo toobig ' 处理所有可能发生的错误Do Until EOF(1) '复制过程直至达到文件尾(EOF)或者字符串空间全部被占满为止Line Input #1, lineoftext$ '将文件逐行复制到名为AllText$的字符串中(Line Input)alltext$ = alltext$ & lineoftext$ & wrap$ '在文本框中显示AllText$字符串,并提供滚动条'LoopClose #1Form1.MousePointer = 0Text3.Text = alltext$End IfGoTo nextfiletoobig:nextfile:End SubSub savetestnote()wrap$ = Chr$(13) & Chr$(10)CommonDialog1.Filter = "text filer (*.txt)|*.txt"CommonDialog1.ShowSave '使用通用对话框对象提示用户输入路径名If CommonDialog1.FileName <> "" ThenOpen CommonDialog1.FileName For Output As #3 'COPY到记录Print #3, Text1.TextClose #3End IfEnd SubSub cleartestnote()Form1.Text1.Text = ""End SubFunction ASCNUM(TXT As String) As Bytei = Asc(TXT)Select Case Asc(TXT)Case 48 ASCNUM = 0 Case 49 ASCNUM = 1 Case 50 ASCNUM = 2 Case 51 ASCNUM = 3 Case 52 ASCNUM = 4 Case 53 ASCNUM = 5 Case 54 ASCNUM = 6 Case 55 ASCNUM = 7 Case 56 ASCNUM = 8 Case 57 ASCNUM = 9Case 65ASCNUM = 10Case 66ASCNUM = 11Case 67ASCNUM = 12Case 68ASCNUM = 13Case 69ASCNUM = 14Case 70ASCNUM = 15Case ElseASCNUM = 16End SelectEnd FunctionPrivate Sub Cls_Click() frmProperties.Show vbModal End SubPrivate Sub Print_Click() Form1.Text1 = bufferEnd SubPrivate Sub Init_Click()sign = 0mPort = 1If MSComm1.PortOpen = False ThenMSComm1.Settings = "9600,n,8,1"MSComm1.PortOpen = TrueEnd IfMSComm1.OutBufferCount = 0MSComm1.InBufferCount = 0MSComm1.Output = Chr$(2) & Chr$(27) & "]R" & Chr$(3) MSComm1.Output = Chr$(2) & Chr$(27) & "ZB1" & Chr$(3)buffer = ""End SubPrivate Sub Form_Load()'设置串口Settings = GetSetting(App.Title, "属性", "设置", "") ' frmTerminal.MSComm1.Settings] If Settings <> "" Then MSComm1.Settings = SettingsIf Err ThenMsgBox Error$, 48Exit SubEnd IfElseMSComm1.Settings = "2400,N,8,1"End IfCommPort = GetSetting(App.Title, "属性", "通信端口", "") ' mPortIf CommPort <> "" ThenmPort = CommPortElsemPort = 1End IfHandshaking = GetSetting(App.Title, "属性", "握手", "") 'frmTerminal.MSComm1.HandshakingIf Handshaking <> "" ThenMSComm1.Handshaking = HandshakingIf Err ThenMsgBox Error$, 48Exit SubEnd IfElseMSComm1.Handshaking = 0End IfTHESMSTYPE = GetSetting(App.Title, "属性", "SMS", "") ' mPortIf THESMSTYPE <> "" ThenSMSType = Val(THESMSTYPE)ElseSMSType = 1End IfTHENUMBER = GetSetting(App.Title, "属性", "NUMBER", "") ' mPortIf THENUMBER <> "" ThenEnd IfReadsmsno = 1'显示状态栏With Form1.StatusBar1.Panels.Item(1).Text = "串口状态:" & "COM" & mPort & " Set=" & Form1.MSComm1.Settings & " " & Form1.MSComm1.PortOpenEnd WithEnd SubPrivate Sub mnuclear_Click()cleartestnoteEnd SubPrivate Sub mnuclrdistxt_Click()Form1.Text1.Text = ""End SubPrivate Sub mnucommopen_Click()MSComm1.PortOpen = Not MSComm1.PortOpenmnucommopen.Checked = MSComm1.PortOpenWith Form1.StatusBar1.Panels.Item(1).Text = "串口状态:" & "COM" & mPort & " Set=" & Form1.MSComm1.Settings & " " & Form1.MSComm1.PortOpenEnd WithEnd SubPrivate Sub mnucommseting_Click()frmProperties.Show vbModalEnd SubPrivate Sub mnuexit_Click()Unload MeEnd SubPrivate Sub mnuopen_Click()opentestnoteEnd SubPrivate Sub mnusave_Click()savetestnoteEnd SubPrivate Sub MSComm1_OnComm()Dim buffer() As ByteDim Bufferlength As IntegerSelect Case mEvent' Handle each event or error by placing' code below each case statement' 错误Case comEventBreak ' 收到Break。

vb.net串口编程

vb.net串口编程

Imports System.IO.PortsImports System.TextPublic Class JCFrmDim RS232 As SerialPortPrivate Sub JCFrm_Load(ByV al sender As System.Object, ByV al e As System.EventArgs) Handles MyBase.LoadDim mBaudRate As IntegerDim mParity As IO.Ports.ParityDim mDataBit As IntegerDim mStopbit As IO.Ports.StopBitsDim mPortName As StringmPortName = "com1" '欲开启的通讯端口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() '开启通讯端口ElseMsgBox("~~通讯端口已开启~~", MsgBoxStyle.Critical Or MsgBoxStyle.OkCancel)EndEnd IfPrivate Sub readBtn1_Click(ByV al sender As System.Object, ByV al e As System.EventArgs) Handles readBtn1.ClickTryIf readBtn1.Text = "读取" ThenTimer1.Interval = 100Timer1.Enabled = TruereadBtn1.Text = "确定"readBtn2.Enabled = False '检测A W1的值,不能同时检测A W2的值。

vb串口通信源代码

vb串口通信源代码

Private Declare Function ShellExecute Lib"shell32.dll"Alias "ShellExecuteA"(ByVal hwnd As Long,ByVal lpOperation As String,ByVal lpFile As String,ByVal lpParameters As String,ByVal lpDirectory As String,ByVal nShowCmd As Long)As LongPrivate Sub Combo1_Click()If MSComm1.PortOpen=True Then'如果串口打开先关闭后再进行其他操作MSComm1.PortOpen=FalseEnd IfmPort=Combo1.ListIndex+1'读取com口号End SubPrivate Sub Command1_Click()'发送到窗口现在时间time1=Timedate1=Datenow1=NowText1.Text=Hour(Time)&"时"&Minute(Time)&"分"& Second(Time)&"秒"&vbNewLine&Year(Date)&"年"& Month(Date)&"月"&Day(Date)&"日"End SubPrivate Sub Command2_Click()Text1.Text="详情参考"&vbNewLine&"淘宝店铺:/"'说明内容输出End SubPrivate Sub Command3_Click()'清空文本内容Text1.Text=""'接收窗口End SubPrivate Sub Command4_Click()'清空文本内容Text2.Text=""'发送窗口End SubPrivate Sub Command5_Click()On Error GoTo uerror'发现错误跳转到错误处理If Command5.Caption="关闭串口"ThenMSComm1.PortOpen=FalseCommand5.Caption="打开串口"'按钮文字改变Shape1.FillColor=&HFFFFC0'灯颜色改变ElseMSComm1.PortOpen=TrueCommand5.Caption="关闭串口"Shape1.FillColor=&HFFEnd IfExit Subuerror:msg$="无效端口号"'错误显示Title$="串口调试助手"x=MsgBox(msg$,48,Title$)'48标示显示警告图标End SubPrivate Sub Command6_Click()Dim Temp(0)As ByteDim strBuff As StringIf Option5.Value=True Then'如果显示16进制发送则进行16进制处理,这里只发送一个Temp(0)="&H"&Text2MSComm1.Output=Temp'发送一个16进制ElsestrBuff=Text2End IfIf MSComm1.PortOpen=False ThenMsgBox"请打开串口"End IfOn Error GoTo uerrorMSComm1.Output=strBuffLabel11.Caption=Label11.Caption+Len(strBuff)'发送计数uerror:End SubPrivate Sub Command7_Click()'自动发送If Command7.Caption="自动发送"Then Command7.Caption="关闭自动发送"Timer2.Interval=Text3.TextTimer2.Enabled=TrueElseCommand7.Caption="自动发送"Timer2.Enabled=FalseEnd IfEnd SubPrivate Sub Command8_Click()'清零计数器Label10.Caption=0Label11.Caption=0End SubPrivate Sub Form_Load()If MSComm1.PortOpen=True ThenMSComm1.PortOpen=FalseElseEnd IfCombo1.AddItem"COM1"Combo1.AddItem"COM2"Combo1.AddItem"COM3"Combo1.AddItem"COM4"Combo1.AddItem"COM5"Combo1.AddItem"COM6"Combo1.AddItem"COM7"Combo1.AddItem"COM8"Combo1.AddItem"COM9"Combo1.AddItem"COM10"Combo1.AddItem"COM11"Combo1.AddItem"COM12"Combo1.AddItem"COM13"Combo1.AddItem"COM14"Combo1.AddItem"COM15"Combo1.AddItem"COM16"Combo1.ListIndex=0mPort=Combo1.ListIndex+1MSComm1.Settings="9600,n,8,1"Command5.Caption="打开串口"Shape1.FillColor=&HFFFFC0Option2.Value=TrueOption3.Value=TrueCombo2.AddItem"256000"Combo2.AddItem"128000"Combo2.AddItem"115200"Combo2.AddItem"57600"Combo2.AddItem"38400"Combo2.AddItem"28800"Combo2.AddItem"19200"'Combo2.AddItem"14400"'Combo2.AddItem"12800"'Combo2.AddItem"11520"Combo2.AddItem"9600"Combo2.AddItem"4800"Combo2.AddItem"2400"Combo2.AddItem"1200"Combo2.AddItem"600"Combo3.AddItem"无None"Combo3.AddItem"奇Odd"Combo3.AddItem"偶Even"Combo4.AddItem"4"Combo4.AddItem"5"Combo4.AddItem"6"Combo4.AddItem"7"Combo4.AddItem"8"Combo5.AddItem"1"Combo5.AddItem"2"End SubPrivate Sub Label12_Click()ShellExecute Me.hwnd,"open","",0,0,5End SubPrivate Sub Label13_Click()ShellExecute Me.hwnd,"open","", 0,0,SW_SHOWMAXIMIZEDEnd SubPrivate Sub MSComm1_OnComm()Dim BytReceived()As ByteDim strBuff As StringDim i As IntegerSelect Case mEvent'事件发生Case2ClsMSComm1.InputLen=0'读入缓冲区全部内容strBuff=MSComm1.Input'读入到缓冲区Label10.Caption=Label10.Caption+Len(strBuff)'接收计数If MSComm1.InputMode=comInputModeBinary Then BytReceived()=strBuff'如果是二进制接收模式则进行数据处理,否则直接显示字符串For i=0To UBound(BytReceived)If Len(Hex(BytReceived(i)))=1ThenstrData=strData&"0"& Hex(BytReceived(i))&""'如果只有一个字符,则前补0,如F显示0F,最后补空格Else'方便显示观察如:000F FEstrData=strData&Hex(BytReceived(i))&" "End IfNextText1=Text1&strDatastrData=""ElseText1=Text1&strBuffEnd IfEnd SelectEnd SubPrivate Sub Option1_Click()MSComm1.InputMode=comInputModeBinary'选择接收方式End SubPrivate Sub Option2_Click()MSComm1.InputMode=comInputModeTextEnd SubPrivate Sub Text3_Change()'Timer2.Interval=Text3.TextEnd SubPrivate Sub Timer1_Timer()If Combo3="无None"ThenMSComm1.Settings=Str(Combo2)+"N"+Str(Combo4)+ Str(Combo5)ElseIf Combo3="奇Odd"ThenMSComm1.Settings=Str(Combo2)+"O"+Str(Combo4)+ Str(Combo5)ElseIf Combo3="偶Even"ThenMSComm1.Settings=Str(Combo2)+"E"+Str(Combo4)+ Str(Combo5)End IfEnd SubPrivate Sub Timer2_Timer()Call Command6_Click'定时调用手动发送End Sub。

使用VB开发串口USB通信软件

使用VB开发串口USB通信软件

使用VB开发串口USB通信软件串口和USB通信软件是一种用于在计算机和外部设备之间进行数据传输的工具。

VB语言是一种适用于Windows平台的编程语言,可以使用VB 开发串口、USB通信软件。

串口通信是一种常见的数据传输方式,它通过计算机的串口(串行通信口)与外部设备进行连接。

在VB中,可以使用SerialPort类来实现串口通信。

下面是一个使用VB编写的串口通信软件的示例代码:```vbImports System.IO.PortsPrivate WithEvents SerialPort As New SerialPortPublic Sub New'设置串口参数SerialPort.PortName = "COM1"SerialPort.BaudRate = 9600SerialPort.Parity = Parity.NoneSerialPort.DataBits = 8SerialPort.StopBits = StopBits.OneEnd SubPublic Sub Open'打开串口SerialPort.OpenEnd SubPublic Sub Close'关闭串口SerialPort.CloseEnd SubPublic Sub WriteData(ByVal data As String)'向串口写入数据SerialPort.WriteLine(data)End SubPrivate Sub SerialPort_DataReceived(ByVal sender As Object, ByVal e As SerialDataReceivedEventArgs) HandlesSerialPort.DataReceived'串口接收到数据时触发的事件Dim data As String = SerialPort.ReadLine'处理接收到的数据Console.WriteLine("Received data: " & data)End SubEnd Class```USB通信是另一种常用的数据传输方式,它通过计算机的USB接口与外部设备进行连接。

visualbasic串口通信及编程实例

visualbasic串口通信及编程实例

visualbasic串口通信及编程实例Visual Basic串口通信及编程实例在实际的工业控制、机器人控制、智能家居等领域中,使用串口通信是一种非常广泛的方式。

Visual Basic (VB) 是一种微软公司开发的高级编程语言,它不仅易于学习,而且拥有丰富的图形界面设计和数据处理功能。

在本篇文章中,我们将深入介绍如何使用VB实现串口通信。

1. 建立串口通信首先,我们需要在VB中创建一个新的窗口(Form),然后打开工具箱,从中拖拽出一个SerialPort(串口)控件。

在控件属性中,我们需要为其指定相关的参数,例如串口名称、波特率、数据位、停止位、校验位等。

通常情况下,这些参数需要根据硬件设备的配置来进行调整。

在VB中实现串口通信的核心部分是对于SerialPort控件的事件监控。

具体来讲,当SerialPort收到一个数据包时,它会触发一个DataReceived事件。

对于这个事件,我们可以在程序中编写回调函数进行处理。

例如:Private Sub SerialPort1_DataReceived(ByVal sender As System.Object, ByVal e AsSystem.IO.Ports.SerialDataReceivedEventArgs) HandlesSerialPort1.DataReceived'在这里实现对于数据包的解析和处理End Sub2. 数据读取和发送在SerialPort控件中,有几种方法可以实现数据的读取和发送。

下面我们将介绍其中两种方法:(1) ReadExisting这个方法可以从串口中读取所有现有的数据,例如:Dim data As String = SerialPort1.ReadExisting()(2) Write这个方法可以向串口发送数据,例如:SerialPort1.Write("Hello World")注意,这个函数只能发送字符串数据。

VB11第五章串口通信方法与实现1

VB11第五章串口通信方法与实现1

说 明: ◆当接收字符后,若 Rthreshold 属性设 置为 0(缺省值)则不产生 OnComm 事件。 ◆设置 Rthreshold 为 1, 接收缓冲区收 到每一个字符都会产生 OnComm 事件。
5. 状态控制 (13) DTREnabled; (14) RTSEnabled; (15) DSRHolding; (16) CTSHolding; (17) CDHolding。 以上五个属性均取值 True / False,用于 读取或控制串口管脚的状态。
(7) SThreshold 属性 语 法: MSComm1.SThreshold [=Value] 作 用:设置或返回发送缓冲区中允许的 最 小 字 符 数 。 该 属 性 和 MSComm 控 件 的 OnComm 事件有关联。Sthreshold 属性为 0(缺省值),数据传输事件不会产生 OnComm 事件。 类 型:Integer型 取 值:发送缓冲区中允许的最小字符数
(3) Handshaking 属性 语 法:
MSComm1.Handshaking [=Value] 作 用:设置或返回硬件握手协议。 类 型:Integer 取 值: 0 - 没有握手协议(默认); 1 - XON/XOFF; 2 - RTS/CTS; 3 - XON/XOFF和RTS/CTS两者皆可。
(6) OutBufferSize属性 语 法: MSComm1.OutBufferSize [= Value] 作 用: 设置或返回输出缓冲区大小。 类 型: Integer型。 取 值: 输出缓冲区的字节数,默认值为 512字节。 OutBufferSize 属 性 的 最 大 值 为 : 32767字节。 OutBufferSize属性值应根据需要选取。

VB串口调试助手源代码

VB串口调试助手源代码

VB串口调试助手源代码Dim OutputAscii As BooleanDim InputString As StringDim OutputString As String'============================================================================== =======' 变量定义'============================================================================== =======Option Explicit ’强制显式声明Dim ComSwitch As Boolean ’串口开关状态判断Dim FileData As String ’要发送的文件暂存Dim SendCount As Long ’发送数据字节计数器Dim ReceiveCount As Long ’接收数据字节计数器Dim InputSignal As String ’接收缓冲暂存Dim OutputSignal As String ’发送数据暂存Dim DisplaySwitch As Boolean ’显示开关Dim ModeSend As Boolean ’发送方式判断Dim Savetime As Single ’时间数据暂存延时用Dim SaveTextPath As String ’保存文本路径' 网页超链接申明Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPrivate Sub CloseCom() '关闭串口On Error GoTo ErrIf MSComm.PortOpen = True ThenMSComm.PortOpen = False’先判断串口是否打开,如果打开则先关闭txtstatus.Text = "STATUS:COM Port Cloced" ’串口状态显示mnuconnect.Caption = "断开串口"cmdswitch.Caption = "打开串口"'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\guan.jpg") ' 显示串口已经关闭的图标ImgSwitchoff.Visible = TrueImgSwitchon.Visible = FalseErr:End SubPrivate Sub UpdateStatus()If MSComm.PortOpen ThenStatusBar1.Panels(1).Text = "Connected"mnuautosend.Caption = "自动发送"mnuconnect.Caption = "断开串口"ElseStatusBar1.Panels(1).Text = "断开串口"mnuautosend.Caption = "disautosend"mnuconnect.Caption = "打开串口"End IfStatusBar1.Panels(2).Text = "COM" & mPortStatusBar1.Panels(3).Text = MSComm.SettingsIf (OutputAscii) ThenStatusBar1.Panels(4) = "ASCII"ElseStatusBar1.Panels(4) = "HEX"End If'On Error GoTo ErrIf ChkAutoSend.Value = 1 Then ’如果有效则,自动发送If MSComm.PortOpen = True Then ’串口状态判断mnuautosend.Caption = "Dis&autosend"TmrAutoSend.Interval = Val(TxtAutoSendTime) ’设置自动发送时间TmrAutoSend.Enabled = True ’打开自动发送定时器Elsemnuautosend.Caption = "autosend"ChkAutoSend.Value = 0 ’串口没有打开去掉自动发送MsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfElseIf ChkAutoSend.Value = 0 Then ’如果无效,不发送mnuautosend.Caption = "autosend"TmrAutoSend.Enabled = False ’关闭自动发送定时器End IfErr:End SubPrivate Sub CmdSendFile_Click() '发送文件On Error GoTo ErrIf MSComm.PortOpen = True Then ’如果串口打开了,则可以发送数据If FileData = "" Then ’判断发送数据是否为空MsgBox "发送的文件为空", 16, "串口调试助手" ’发送数据为空则提示ElseIf ChkHexReceive.Value = 1 Then ’如果按十六进制接收时,按二进制发送,否则按文本发送MSComm.InputMode = comInputModeBinary ’二进制发送ElseMSComm.InputMode = comInputModeText ’文本发送End IfMSComm.Output = Trim(FileData) ’发送数据ModeSend = True ’设置文本发送方式End IfElseMsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfErr:End SubPrivate Sub Comm_initial(Port As Byte, BaudRate As String, ParityBit As String, DataBit As Integer, StopBit As Integer)On Error GoTo ErrorTrap ' 错误则跳往错误处理If MSComm.PortOpen = True Then MSComm.PortOpen = False’先判断串口是否打开,如果打开则先关闭mPort = Port ’设定端口MSComm.Settings = BaudRate & "," & ParityBit & "," & DataBit & "," & StopBit ' 设置波特率,无校验,8位数据位,1位停止位MSComm.InBufferSize = 1024 ’设置接收缓冲区为1024字节MSComm.OutBufferSize = 4096 ’设置发送缓冲区为4096字节MSComm.InBufferCount = 0 ’清空输入缓冲区MSComm.OutBufferCount = 0 ’清空输出缓冲区MSComm.SThreshold = 1 ’发送缓冲区空触发发送事件MSComm.RThreshold = 1 ’每X个字符到接收缓冲区引起触发接收事件MSComm.OutBufferCount = 0 ’清空发送缓冲区MSComm.InBufferCount = 0 ’滑空接收缓冲MSComm.PortOpen = True ’打开串口If MSComm.PortOpen = True Thentxtstatus.Text = "STATUS:" & cbocom.Text & " OPEND," & cbobaudrate.Text & "," &Left(cboparitybit.Text, 1) & "," & cbodatabit.Text & "," & cbostopbit.TextElsetxtstatus.Text = "STATUS:COM Port Cloced" ’串口没打开时,提示串口关闭状态End IfExit SubErrorTrap: ’错误处理Select Case Err.NumberCase comPortAlreadyOpen ’如果串口已经打开,则提示MsgBox "没有发现此串口或被占用", 49, "串口调试助手"CloseComCase ElseMsgBox "没有发现此串口或被占用", 49, "串口调试助手"CloseComEnd SelectErr.ClearEnd SubPrivate Sub Comm_reSet(Port As Byte, BaudRate As String, ParityBit As String, DataBit As Integer, StopBit As Integer)On Error GoTo ErrorHint ’错误则跳往错误处理If MSComm.PortOpen = True Then MSComm.PortOpen = False’先判断串口是否打开,如果打开则先关闭mPort = Port ’设定端口MSComm.Settings = BaudRate & "," & ParityBit & "," & DataBit & "," & StopBit ' 设置波特率,无校验,8位数据位,1位停止位MSComm.PortOpen = True ’打开串口If MSComm.PortOpen = True Thencmdswitch.Caption = "关闭串口"'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\kai.jpg") ' 显示串口已经打开的图标ImgSwitchoff.Visible = Falsemnuconnect.Caption = "disconnect"ImgSwitchon.Visible = Truetxtstatus.Text = "STATUS:" & cbocom.Text & " OPEND," & cbobaudrate.Text & "," &Left(cboparitybit.Text, 1) & "," & cbodatabit.Text & "," & cbostopbit.TextElsecmdswitch.Caption = "打开串口"'ImgSwitch.Picture = LoadPicture("f:\我的VB\串口调试软件\图片\guan.jpg") ' 显示串口已经关闭的图标ImgSwitchon.Visible = FalseImgSwitchoff.Visible = Truetxtstatus.Text = "STATUS:COM Port Cloced"End IfExit SubErrorHint: ’错误处理Select Case Err.NumberCase comPortAlreadyOpen ’如果串口已经打开,则提示MsgBox "没有成功,请重试", vbExclamation, "串口调试助手"CloseCom ’调用关闭串口函数Case ElseMsgBox "没有成功,请重试", vbExclamation, "串口调试助手"CloseCom ’调用关闭串口函数End SelectErr.Clear ’清除Err 对象的属性End SubPrivate Sub Command1_Click()End SubPrivate Sub cbobaudrate_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbocom_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbodatabit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cboparitybit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub cbostopbit_Change()Call Comm_reSet(Val(Mid(cbocom.Text, 4, 2)), cbobaudrate.Text, Left(cboparitybit.Text, 1), cbodatabit.Text, cbostopbit.Text) '串口设置End SubPrivate Sub chkautosend_Click()On Error GoTo ErrIf ChkAutoSend.Value = 1 Then ’如果有效则,自动发送If MSComm.PortOpen = True Then ’串口状态判断mnuautosend.Caption = "取消自动发送"TmrAutoSend.Interval = Val(TxtAutoSendTime) ’设置自动发送时间TmrAutoSend.Enabled = True ’打开自动发送定时器ElseChkAutoSend.Value = 0 ’串口没有打开去掉自动发送MsgBox "串口没有打开,请打开串口", 48, "串口调试助手" ' 如果串口没有被打开,提示打开串口End IfElseIf ChkAutoSend.Value = 0 Then ’如果无效,不发送mnuautosend.Caption = "自动发送数据"TmrAutoSend.Enabled = False ’关闭自动发送定时器End IfErr:End SubPrivate Sub cmdamend_Click()Dim spShell As Object ’定义存放引用对象的变量Dim spFolder As Object ’定义存放引用对象的变量Dim spFolderItem As Object ’定义存放引用对象的变量Dim spPath As String ’定义存放的变量On Error GoTo Err ’错误处理,防止取消打开文件夹时报错Const WINDOW_HANDLE = 0Const NO_OPTIONS = 0Set spShell = CreateObject("Shell.Application")Set spFolder = spShell.BrowseForFolder(WINDOW_HANDLE, "选择目录:", NO_OPTIONS,"C:\Scripts")Set spFolderItem = spFolder.SelfspPath = spFolderItem.PathspPath = Replace(spPath, "\", "\") ’ Replace函数的返回值是一个字符串txtsavepath.Text = spPath ’把文件夹路径显示在标签上SaveTextPath = txtsavepath.Text ’路径暂存Err:End SubPrivate Sub CmdClearCounter_Click()On Error GoTo ErrSendCount = 0 ’发送计数器清零ReceiveCount = 0 ’接收计数器清零txtRXcount.Text = "RX:" & 0 ’接收计数txtTXcount.Text = "TX:" & 0 ’发送计数Err:End SubPrivate Sub cmdclearrecieve_Click()TxtReceive.Text = ""End SubPrivate Sub cmdclearsend_Click()txtsend.Text = ""End SubPrivate Sub CmdHelp_Click()FrmHelp.ShowEnd SubPrivate Sub CmdQuit_Click()If MSComm.PortOpen = True Then MSComm.PortOpen = False’先判断串口是否打开,如果打开则先关闭Unload Me ’卸载窗体,并退出程序EndEnd SubPrivate Sub cmdsavedisp_Click()On Error GoTo Err ’错误处理SaveTextPath = txtsavepath ’路径暂存Open txtsavepath & "\1.txt" For Output As #1 ’打开文件’不存在的话会创建文件,如已存在会覆盖’ output 改为append 为追加’改为input 则只读Print #1, Year(Date) & "年" & Month(Date) & "月" & Day(Date) & _"日" & Hour(Time) & "时" & Minute(Time) & "分" & Second(Time) & _"秒" & vbCrLf & TxtReceive.Text + vbCrLf ’把接收区的文本保存文本前加上保存时间(0000年00月00日00时00分00秒)’ vbcrlf 为回车换行Close #1 ’关闭文件txtsavepath = "OK,1.txt Save" ’提示保存成功cmdsavedisp.Enabled = FalseSavetime = Timer ’记下开始的时间While Timer < Savetime + 5 ’循环等待5 - 要延时的时间DoEvents ’转让控制权,以便让操作系统处理其它的事件。

利用API进行串口通信VB代码.

利用API进行串口通信VB代码.

01. Private Sub cmdSend_Click( 02. '定义文件读写属性结构 03. Dim sa As SECURITY_ATTRIBUTES 04. '定义串口状态结构 05. Dim typCommStat As COMSTAT 06. '定义串口状态错误 07. Dim lngError As Long 08. 09. '********打开串口******** 10. Dim hCF As Long 11. hCF = CreateFile("COM4", _ 12. GENERIC_READ Or GENERIC_WRITE, 0, sa, _ 13. OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL Or FILE_FLAG_OVERLAPPED, 0 14. Debug.Print "打开串口:" & hCF 15. 16. '********获取出错信息******** 17. Dim errNum As Long 18. errNum = GetLastError( 19. Debug.Print "出错信息:" & errNum 20. 21. '定义标志值 22. Dim flag As Long 23. 24. '定义设备控制块 25. Dim typDCB As DCB 26.27. '********获取设备控制块******** 28. flag = GetCommState(hCF, typDCB 29. Debug.Print "获取串口DCB:" & flag 30. 31. typDCB.BaudRate = 2500 '定义波特率32. typDCB.Parity = NOPARITY '无校验位 33. typDCB.ByteSize = 8 '数据位 34. typDCB.StopBits = 0 '停止位 0/1/2 = 1/1.5/2 35. 36. '********设置串口参数******** 37. flag = SetCommState(hCF, typDCB 38. Debug.Print "设置串口参数:" &flag 39.40. '********设置缓冲区大小******** 41. flag = SetupComm(hCF, 1024, 1024 42. 'Debug.Print "设置缓冲区:" & flag 43. 44. '********清空读写缓冲区******** 45. flag = PurgeComm(hCF, PURGE_RXABORT Or PURGE_RXCLEAROrPURGE_TXABORT Or PURGE_TXCLEAR 46. 'Debug.Print "强制清空缓冲区:" & flag 47. 48. '定义超时结构体 49. Dim typCommTimeouts As COMMTIMEOUTS 50. typCommTimeouts.ReadIntervalTimeout = 0 '相邻两字节读取最大时间间隔(为0表示不使用该超时间隔) 51. typCommTimeouts.ReadTotalTimeoutMultiplier = 0 '一个读操作的时间常数 52. typCommTimeouts.ReadTotalTimeoutConstant = 0 '读超时常数53. typCommTimeouts.WriteTotalTimeoutMultiplier = 0 '一个写操作的时间常数(为0表示不使用该超时间隔) 54. typCommTimeouts.WriteTotalTimeoutConstant = 0 '写超时常数(为0表示不使用该超时间隔) 55. 56. '********超时设置******** 57. flag = SetCommTimeouts(hCF, typCommTimeouts 58. 'Debug.Print "超时设置:" & flag 59. 60. '********发送数据******** 61. '定义要发送字节数 62. Dim lngNumberofBytesToWrite As Long 63. '定义实际发送字节数 64. DimlngNumberofBytesToWritten As Long 65. '定义重叠结构体 66. Dim typOverLapped As OVERLAPPED 67. 68. '定义发送数据 69. Dim arrbytTest(0 To 23 As Byte 70. '载波收发器同步头 71. arrbytTest(0 = CByte(&H53 72. arrbytTest(1 = CByte(&H4E 73. arrbytTest(2 = CByte(&H44 74. '后续数据包长度 75. arrbytTest(3 = CByte(&H14 76. '载波表预同步头 77. arrbytTest(4 = CByte(&HFF 78. arrbytTest(5 = CByte(&HFF 79. arrbytTest(6 = CByte(&HFF 80. arrbytTest(7 = CByte(&HFF 81. arrbytTest(8 =CByte(&HFF 82.arrbytTest(9 = CByte(&HFF 83. '载波表帧同步头 84. arrbytTest(10 = CByte(&H9 85. arrbytTest(11 = CByte(&HAF 86. '载波表地址 87. arrbytTest(12 = CByte(&H59 88. arrbytTest(13 = CByte(&H20 89. arrbytTest(14 = CByte(&H0 90. '控制码 91. arrbytTest(15 = CByte(&H1 92. '数据长度 93. arrbytTest(16 = CByte(&H5 94. '功能码95. arrbytTest(17 = CByte(&H10 96. arrbytTest(18 = CByte(&H90 97. '集中器地址 98. arrbytTest(19 = CByte(&HBB 99. arrbytTest(20 = CByte(&HBB 100. arrbytTest(21 = CByte(&HBB 101. '校验和 102. arrbytTest(22 = CByte(&H50 103. arrbytTest(23 = CByte(&H3 104. 105. 106. '获取要发送字节数 107. lngNumberofBytesToWrite = UBound(arrbytTest + 1 108. 109. '声明等待开始时间、结束时间值 110. Dim writeStarTime, writeEndTime As Long 111. 112. writeStarTime = GetTickCount( 113. Debug.Print "发送开始时间:"& writeStarTime 114. 115. '定义发送循环步长值 116. Dim i As Integer 117. '定义累计发送字节数 118. Dim intTotalNumberOfBytesToWritten As Integer 119. '定义发送间隔时间(毫秒) 120. Dim intIntervalTime As Integer 121. intIntervalTime = 0 122. 123. '发送数据 124. For i = 0 To UBound(arrbytTest 125. flag = WriteFile(hCF, arrbytTest(i, 1, lngNumberofBytesToWritten, typOverLapped 126. 127. '获取出错码 128. errNum = GetLastError( 129. 'Debug.Print "发送操作出错码:" & errNum 130. 131. '若返回值不是IO异步操作未决,则关闭串口 132. If (errNum <> ERROR_IO_PENDING And (errNum<> 0 Then GoTo closeComm 133. 134. '异步IO事件获取(返回值为 0表示出错) 135. flag = WaitForSingleObject(typOverLapped.hEvent, 0 136. 'Debug.Print "异步IO事件获取:" & flag 137. 138. '判断异步IO事件获取是否成功 139. If flag <>0 Then 140. '异步IO操作结果获取(等待标记值,必须为true ,否则需要事件激活返回结果 141. flag = GetOverlappedResult(hCF, typOverLapped, lngNumberofBytesToWritten, 1 142. 'Debug.Print "异步IO操作获取:" & flag 143. 144. '判断异步IO操作结果获取是否成功 145. If flag <> 0 Then 146. intTotalNumberOfBytesToWritten= intTotalNumberOfBytesToWritten+ _ 147. lngNumberofBytesToWritten 148. End If 149. 150. End If 151. 152. '间隔时间(用于需要设定每字节间间隔时间的发送协议) 153. Sleep (intIntervalTime 154. Next 155. 156. writeEndTime = GetTickCount( 157. Debug.Print "发送结束时间:"& writeEndTime 158. Debug.Print "发送总时间:" & (writeEndTime - writeStarTime 159. Debug.Print "串口发送操作:"& flag 160. Debug.Print "实际发送字节数:" & intTotalNumberOfBytesToWritten 161. 162. '********清空缓冲区等待数据接收******** 163. flag = FlushFileBuffers(hCF 164. 'Debug.Print "清空缓冲区:" & flag 165. 166. '********设置串口事件******** 167. '监听数据接收事件 168. ' flag =SetCommMask(hCF, EV_ERR Or EV_RXCHAR 169. ' Debug.Print "监听事件设置:" & flag 170. flag = SetCommMask(hCF, 0 171. Debug.Print "监听事件设置:"& flag 172. 173. '********等待串口接收事件******** 174. '声明等待开始时间、结束时间值 175. Dim sngStarTime, sngEndTime As Long 176. '事件掩码 177. Dim lngEventMask As Long 178. 179. '定义接收字节数变量 180. Dim tempReceive As Long 181. tempReceive = 0 182. 183. Debug.Print "监听开始" 184. '生成开始时间 185. sngStarTime = GetTickCount( 186. Debug.Print "开始监听时间:"& sngStarTime 187. 188. '定义等待步骤参数 189. Dim n As Integer 190. n = 1 191. 192. ' '监听串口事件193. ' flag = WaitCommEvent(hCF, lngEventMask, typOverLapped 194. ' Debug.Print "监听操作:" & flag 195. 196. ' '获取出错码 197. ' errNum = GetLastError( 198. ' Debug.Print "监听操作出错码:" & errNum 199. ' 200. ' '若返回值不是IO异步操作未决,则关闭串口 201. ' If (errNum <> ERROR_IO_PENDING And (errNum<> 0 Then GoTo closeComm 202. 203. '定义读取间隔时间(毫秒 204. Dim intReadIntervalTime As Integer 205. intReadIntervalTime = 1 206. 207. Do 208. 209. ' '异步IO事件获取(返回值为 0 表示出错) 210. ' flag =WaitForSingleObject(typOverLapped.hEvent, 0 211. ' Debug.Print "异步IO事件获取:" & flag 212. ' '获取出错码 213. ' errNum = GetLastError( 214. ' Debug.Print "IO事件获取出错码:" & errNum 215. 216. '清除错误标志函数,获取串口设备状态 217. flag = ClearCommError(hCF, lngError, typCommStat 218. Debug.Print "获取串口设备状态:" & flag 219. 220. '若获取状态成功 221. If (flag <> 0 And (typCommStat.cbInQue > 0 Then 222. 223. Debug.Print "已接收字节数:"& typCommStat.cbInQue 224. 225. '判断接收缓冲区内的数据是否等于需要接收的字节数 226. If typCommStat.cbInQue >= 22 Then 227. '跳出循环 228. Debug.Print "跳出循环" 229. Exit Do 230. End If 231. 232. End If 233. 234. '生成结束时间 235. sngEndTime = GetTickCount( 236. Debug.Print "第" & n & "次监听事件时间:" & sngEndTime 237. 238. n = n + 1 239. 240. '读时间间隔 241. Sleep (intReadIntervalTime 242. 243. Loop Until (sngEndTime - sngStarTime > 1000 244. 245. '生成结束时间 246. sngEndTime = GetTickCount( 247. Debug.Print "结束监听时间:"& sngEndTime 248. 249. Debug.Print "监听结束" 250. Debug.Print "总接收时间:" & (sngEndTime - sngStarTime 251. 252. '********接收数据******** 253. '定义接收数组 254. Dim arrbytReceive(0 To 22 As Byte 255. '定义实际接收字节数 256. Dim lngNBR As Long 257. '重叠结构置0 258. typOverLapped.hEvent = 0 259. typOverLapped.Internal = 0 260. typOverLapped.InternalHigh = 0 261. typOverLapped.offset = 0 262. typOverLapped.OffsetHigh = 0 263. 264. '接收数据 265. flag = ReadFile(hCF, arrbytReceive(0, 23, lngNBR, typOverLapped 266. Debug.Print "串口接收操作:"& flag 267. Debug.Print "实际接收字节数:" & lngNBR 268. Debug.Print arrbytReceive(0 269. Debug.Print arrbytReceive(21 270. Debug.Print arrbytReceive(22 271. 272. closeComm: 273. '********关闭所有串口事件******** 274. flag = SetCommMask(hCF, 0 275. 'Debug.Print "关闭串口事件:"& flag 276. 277. '********关闭串口******** 278. Dim closeFlag As Long 279. closeFlag = CloseHandle(hCF 280. Debug.Print "关闭串口:" & closeFlag 281. 282. End Sub。

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

vb中怎样用mscomm控件实现串口通信本问分两部分均来自第一部分jessezappy(晶晶)================================================================================== If MSComm1.PortOpen Then MSComm1.PortOpen = FalsemPort = 1 '假定是用COM1口' 设定传输速率等,可依照您的需求更改MSComm1.Settings = "9600,N,8,1"MSComm1.PortOpen = True'---------初始化Modem-------------MSComm1.Output = "ATZ"MSComm1.Output = "AT&F"MSComm1.Output = "ATE0"MSComm1.Output = "ATM1"MSComm1.Output = "ATQ0"MSComm1.Output = "ATV0"'--------------------------拨号-------------MSComm1.Output ="ATDT163" '拨163'---------------------------接通后MSComm1.Output ="SDFJDKSJLKFA" '发送字符串'---------------------Private Sub MSComm1_OnComm() '用串口事件捕捉数据..If MSComm1.InBufferCount Then' 通讯埠中假如有资料的话, 则读取进来InStringB = InStringB & MSComm1.Input' 如果资料中有Chr(13) 和Chr(10) 的话, 则显示出来If InStr(InStringB, vbCrLf) Theninstring = instring & InStringBAddText Text3, InStringB, FalseInStringB = ""End IfEnd IfEND SUB'-------------------------挂断--------MSComm1.PortOpen = False '这个挂断方法不能适用所有MODEM,我正在研究...通用办法================================================================================================第二部分:===========================================================================最后借你一篇文章看,作者不是我,里面的不一定都对..'-----------------------------------------------------------VB Mscomm控件应用江苏戚墅堰机车车辆厂设计处(213011) 李秉璋--------------------------------------------------------------------------------Visual Basic 6.0(以下简称VB) 是一种功能强大、简单易学的程序设计语言。

它不但保留了原先Basic语言的全部功能,而且还增加了面向对象程序设计功能。

它不仅可以方便快捷地编制适用于数据处理、多媒体等方面的程序,而且利用ActiveX 控件MSComm还能十分方便地开发出使用计算机串口的计算机通信程序。

本文结合计算机通信的两个例子,详细介绍如何在VB中使用MSComm控件。

处理方式MSComm控件提供了两种处理通信的方式:一种为事件驱动方式,该方式相当于一般程序设计中的中断方式。

当串口发生事件或错误时,MSComm控件会产生OnComm事件,用户程序可以捕获该事件进行相应处理。

本文的两个例子均采用该方式。

另一种为查询方式,在用户程序中设计定时或不定时查询MSComm控件的某些属性是否发生变化,从而确定相应处理。

在程序空闲时间较多时可以采用该方式。

常用属性和方法利用MSComm控件实现计算机通信的关键是理解并正确设置MSComm控件众多属性和方法。

以下是MSComm控件的常用属性和方法:●Commport:设置或返回串口号。

●Settings:以字符串的形式设置或返回串口通信参数。

●Portopen:设置或返回串口状态。

●InputMode:设置或返回接收数据的类型。

●Inputlen:设置或返回一次从接收缓冲区中读取字节数。

●InBufferSize:设置或返回接收缓冲区的大小,缺省值为1024字节。

●InBufferCount:设置或返回接收缓冲区中等待计算机接收的字符数。

●Input:从接收缓冲区中读取数据并清空该缓冲区,该属性设计时无效,运行时只读。

●OutBufferSize:设置或返回发送缓冲区的大小,缺省值为512字节。

●OutBufferCount:设置或返回发送缓冲区中等待计算机发送的字符数。

●Output:向发送缓冲区发送数据,该属性设计时无效,运行时只读。

●Rthreshold:该属性为一阀值。

当接收缓冲区中字符数达到该值时,MSComm控件设置Commevent属性为ComEvReceive,并产生OnComm事件。

用户可在OnComm事件处理程序中进行相应处理。

若Rthreshold属性设置为0,则不产生OnComm 事件。

例如用户希望接收缓冲区中达到一个字符就接收一个字符,可将Rthreshold设置为1。

这样接收缓冲区中接收到一个字符,就产生一次OnComm事件。

●Sthreshold:该属性亦为一阀值。

当发送缓冲区中字符数小于该值时,MSComm控件设置Commevent属性为ComEvSend,并产生OnComm事件。

若Sthreshold属性设置为0,则不产生OnComm事件。

要特别注意的是仅当发送缓冲区中字符数小于该值的瞬间才产生OnComm事件,其后就不再产生OnComm事件。

例如Sthreshold设置为3,仅当发送缓冲区中字符数从3降为2时,MSComm控件设置Commevent属性为ComEvSend,同时产生OnComm事件,如发送缓冲区中字符始终为2,则不会再产生OnComm事件。

这就避免了发送缓冲区中数据未发送完就反复发生OnComm事件。

●CommEvent:这是一个非常重要的属性。

该属性设计时无效,运行时只读。

一旦串口发生通信事件或产生错误,依据产生的事件和错误,MSComm控件为CommEvent属性赋不同的代码,同时产生OnComm事件。

用户程序就可在OnComm事件处理程序中针对不同的代码,进行相应的处理。

CommEvent属性的代码、常数及含义参见表1及表2。

表1 CommEvent通信事件代码常数含义1 ComEvReceive 接受到Rthreshold个字符。

该事件将持续产生,直到用Input属性从接受缓冲区中读取并删除字符。

2 ComEvSend 发送缓冲区中数据少于Sthreshold个,说明串口已经发送了一些数据,程序可以用Output属性继续发送数据。

3 ComEvCTS Clear To Send信号线状态发生变化。

4 ComEvDSR Data Set Ready信号线状态从1变到0。

5 ComEvCD Carrier Detect信号线状态发生变化。

6 ComEvRing 检测到振铃信号。

7 ComEvEOF 接受到文件结束符。

表2 CommEvent通信错误代码常数含义1001 ComEvntBreak 接受到一个中断信号。

1002 ComEvntCTSTO Clear To Send信号超时。

1003 ComEvntDSRTO Data Set Ready信号超时。

1004 ComEvntFrame 帧错误。

1006 ComEvntOverrun 串口超速。

1007 ComEvntCDTO 载波检测超时。

1008 ComEvntRxOver 接受缓冲区溢出,缓冲区中已没有空间。

1009 ComEvntRxParity 奇偶校验错。

1010 ComEvntTxFull 发送缓冲区溢出,缓冲区中已没有空间。

1011 ComEvntDCB 检索串口的设备控制块时发生错误。

实例1:计算机拨号在一些实际应用中经常需要使用计算机拨号。

下面这个例子利用MSComm控件操作Modem进行拨号,实现串口通信。

实现步骤:1.建窗体●添加一个MSComm控件,用来建立与串口的连接;●添加一个Text控件,Name属性为Txttel,用来输入电话号码;●添加3个CommandButton控件,Name属性分别为DialButton、CancellButton、QuitButton,分别用来实现拨号、中止拨号、中止程序;●添加一个Label控件,用来显示所有与拨号有关的信息。

窗体见图1。

2.设置MSComm控件属性●InBufferSize=1024;●Inputlen=0;●InputMode=0;●Rthreshold=2;●RTSEnable=True;●Settings=“9600,N,8,1”;●Sthreshold=0。

因为每一台计算机的串口使用状态都不会一样。

为使程序具有通用性,在窗体的Load方法中首先进行串口测试,找到第一个可用串口后再进行设置。

3.程序功能程序根据输入的电话号码进行拨号,Modem正常拨号后,提示用户摘机,准备通话。

图1 电话拨号实例4.主要方法与事件代码'设置可用串口Private Sub Form_Load()On Error GoTo error_openFor i = 1 To 4mPort = iMSComm1.PortOpen = True'设置可用的第一个串口On Error GoTo 0Exit Suberror_resume:Nexterror_open:Resume error_resumeEnd SubPrivate Sub DialButton_Click()Dim Number$, Temp$Number$= Trim$(Txttel.Text)If Number$= “" ThenMsgBox “请输入电话号码"Txttel.SetFocusExit SubEnd IfDialButton.Enabled = FalseQuitButton.Enabled = FalseDialString$=“ATDT”+Number$+“;” +vbCr'清除接收缓冲区MSComm1.InBufferCount =0'拨电话号码MSComm1.Output = DialString$Lblmessage.Caption = “正在拨号码-”+Number$DialButton.Enabled = TrueQuitButton.Enabled = TrueEnd SubPrivate Sub MSComm1_OnComm()Select Case mEventCase comEvReceive'读取串口数据COMBUF=COMBUF +MSComm1.Inputlc = InStr(1, COMBUF, “OK”)If lc = 0 Then Exit Sub'Modem已正常拨号,返回OKLblmessage.Caption = “请您摘下电话机,准备通话”Case comEvSendEnd SelectEnd SubPrivate Sub CancelButton_Click()'断开与调制解调器的连接MSComm1.Output = “ATH” +vbCrEnd Sub实例2:实现来电显示在一些实际应用中,需要显示并保存来电号码,并根据电话号码显示相应资料,比如小区物业管理和110报警等系统。

相关文档
最新文档