VB串口通信源程序
- 格式:doc
- 大小:131.00 KB
- 文档页数:23
vb程序实现串口通信,将接到的数据动态保存,并可以图表绘制曲线(X:时间,Y:数据)将接到的数据赋值于全局变量,通过ADO数据控件连接数据库及表,用以下代码保存数据: Private Sub Timer1_Timer()If Label1.Caption <> CStr(Time$) ThenLabel1.Caption = Time$sum_zj = sum_zj + 1Text3 = sum_zj'校准If sum_zj >= 3 Thensum_zj1 = sum_zj1 + 1sum_zj = sum_zj - 3Text4 = sum_zj1Adodc1.Recordset.AddNew '每3秒记录一组数据Adodc1.Recordset(0) = shiY AnHAdodc1.Recordset(1) = Mid(Time$, 1, 2) & Mid(Time$, 4, 2) & Mid(Time$, 7, 2) '记录time Adodc1.Recordset(2) = record_jm(0) '记录数据Adodc1.Recordset(3) = record_jm(1) '记录数据Adodc1.Recordset(4) = record_jm(2) '记录数据Adodc1.Recordset(5) = record_jm(3) '记录数据Adodc1.Recordset(6) = record_jm(4) '记录数据Adodc1.Recordset(7) = record_jm(5) '记录数据Adodc1.Recordset(8) = record_jm(6) '记录数据Adodc1.Recordset(9) = record_jm(7) '记录数据Adodc1.Recordset(10) = record_jm(8) '记录数据Adodc1.Recordset(11) = record_jm(9) '记录数据Adodc1.Recordset(12) = record_jm(10) '记录数据Adodc1.Recordset(13) = record_jm(11) '记录数据Adodc1.Recordset.UpdateEnd IfEnd IfEnd SubPrivate Sub Timer2_Timer()Picture4.DrawStyle = 0以下代码绘制实时曲线(6点):Picture4.DrawWidth = 3 ' = dashPicture4.Line (sum_z1 * 18 + 500, record_jm(0) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(2) * -150 + 7900), vbRed ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(1) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(3) * -150 + 7900), vbCyan ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(2) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(4) * -150 + 7900), vbBlack ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(3) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(5) * -150 + 7900), vbMagenta ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(4) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(6) * -150 + 7900), vbGreen ', BFPicture4.Line (sum_z1 * 18 + 500, record_jm(5) * -150 + 7900)-(sum_z1 * 18 + 500, record_jm(7) * -150 + 7900), vbBlue ', BFEnd SubPrivate Sub Timer3_Timer()If Label32 <> CStr(Time$) Then 'Label1.CaptionLabel32.Caption = Time$sum_z = sum_z + 1Text31 = sum_z'校准If sum_z >= 5 Thensum_z = sum_z - 5sum_z1 = sum_z1 + 1Text30 = sum_z1End IfEnd IfEnd Sub以下代码绘制曲线的坐标:Private Sub Form_Load()With Adodc1Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\kongtiao\cartemp.mdb;Persist Security Info=False"Adodc1.RecordSource = "select * form car_bm"End WithText1 = ""Text2 = "": Text3 = "": Text4 = "":Text5 = "": Text6 = "": Text7 = "": Text12 = ""Text8 = "": Text9 = "": Text10 = "": Text11 = ""Text13 = "": Text14 = "": Text15 = "": Text16 = ""'Load frmMaincolvb = vbBlackxx = 100yy = 150txt = "℃"wp = xp(colvb, xx, yy, txt)xx = 200yy = 350txt = "50"wp = xp(colvb, xx, yy, txt)xx = 200yy = 1850wp = xp(colvb, xx, yy, txt) yy = 3350xx = 200txt = "30"wp = xp(colvb, xx, yy, txt) xx = 200yy = 4850txt = "20"wp = xp(colvb, xx, yy, txt) xx = 200yy = 6350txt = "10"wp = xp(colvb, xx, yy, txt) 'Time坐标colvb = vbRedyy = 6500xx = 400txt = "0"wp = xp(colvb, xx, yy, txt) xx = 1480txt = "5"wp = xp(colvb, xx, yy, txt) xx = 2560txt = "10"wp = xp(colvb, xx, yy, txt) xx = 3640txt = "15"wp = xp(colvb, xx, yy, txt) xx = 4720txt = "20"wp = xp(colvb, xx, yy, txt) xx = 5800txt = "25 min"wp = xp(colvb, xx, yy, txt) xx = 6880txt = "30"wp = xp(colvb, xx, yy, txt) xx = 7960txt = "35"wp = xp(colvb, xx, yy, txt) xx = 9040txt = "40"wp = xp(colvb, xx, yy, txt)txt = "45"wp = xp(colvb, xx, yy, txt)xx = 11200txt = "50"wp = xp(colvb, xx, yy, txt)'画格Picture1.DrawWidth = 1 ' = dashPicture1.DrawStyle = 0Picture1.ForeColor = vbCyanFor i = 0 To 39Picture4.Line (450, 550 + i * 150)-(500, 550 + i * 150) NextPicture4.DrawStyle = 2For i = 0 To 8Picture4.Line (450, 400 + i * 750)-(11300, 400 + i * 750) NextFor i = 0 To 15Picture4.Line (450, 1000 + i * 300)-(500, 1000 + i * 300) NextFor i = 0 To 10Picture4.Line (500 + i * 1080, 400)-(500 + i * 1080, 6400) NextPicture4.DrawStyle = 0End Sub。
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) 是一种功能强大、简单易学的程序设计语言。
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) 是一种功能强大、简单易学的程序设计语言。
vb编写的串口调试程序(源代码)作者:Javen_yue,2005-5-17 13:23:00 发表于:《自动化软件论坛》共有8人回复,2108次点击加为好友播客博客发送留言小弟刚入行不久,写了个小程序,希望各位大侠能帮我指点一二,谢谢!Public countRX As IntegerPublic countTX As IntegerPublic num As BytePublic setport As StringPrivate Sub Combo1_Click()openportEnd SubPrivate Sub combo2_click()openportEnd SubPrivate Sub combo3_click()openportEnd SubPrivate Sub combo4_click()openportEnd SubPrivate Sub combo5_click()openportEnd SubPrivate Sub Command3_Click()Text1.Text = ""End SubPrivate Sub Command4_Click() '手动发送Dim send() As ByteDim i As IntegerDim length As IntegerDim a() As ByteDim b As Bytelength = Len(Text2.Text)If length > 0 ThenReDim a(length - 1)ReDim send(length - 1)End Ifsend = Text2.TextcountTX = countTX + lengthIf Check2.Value = 0 ThenMSComm1.Output = send'countTX = countTX + MSComm1.OutBufferCountElsei = 0b = 0Do While i <= (length - 1) * 2If ((send(i) >= 48 And send(i) <= 57) Or (send(i) >= 65 And send(i) <= 70) Or (send(i) >= 97 And s end(i) <= 102)) ThenIf (send(i) >= 97 And send(i) <= 102) Thena(b) = send(i) - 32Elsea(b) = send(i)End IfElseIf b > 0 ThenReDim Preserve a(b - 1)End IfExit DoEnd Ifi = i + 2b = b + 1DoEventsLoopMSComm1.Output = aEnd IfLabel5.Caption = "TX:" & countTX End SubPrivate Sub command5_Click()Text2.Text = " "End SubPrivate Sub Command6_Click() Label4.Caption = "RX:0 "Label5.Caption = "TX:0 "End SubPrivate Sub Form_Load()Combo1.ListIndex = 0 'initialCombo2.ListIndex = 0Combo3.ListIndex = 0Combo4.ListIndex = 0Combo5.ListIndex = 0End SubSub openport()'Dim num As Byte'Dim setport As StringOn Error GoTo msgnum = Combo1.ListIndex + 1If MSComm1.PortOpen = True Then 'MsgBox ("没有发现串口或被占用") MSComm1.PortOpen = FalseEnd IfmPort = numsetport = Combo2.Text + ","If Combo3.ListIndex = 0 Thensetport = setport + "N,"End IfIf Combo3.ListIndex = 1 Thensetport = setport + "O,"End IfIf Combo3.ListIndex = 2 Thensetport = setport + "E,"End IfIf Combo4.ListIndex = 0 Thensetport = setport + "8,"End IfIf Combo4.ListIndex = 1 Thensetport = setport + "7,"End IfIf Combo5.ListIndex = 0 Thensetport = setport + "1"End IfIf Combo5.ListIndex = 1 Thensetport = setport + "2"End IfMSComm1.Settings = setportMSComm1.PortOpen = True'If MSComm1.PortOpen = True Then'Label3.Caption = "stats:" & num & ",open" & "," & setport'Else' Label3.Caption = "stats:" & num & "close" & "," & setport 'End Ifmsg:End SubSub command1_click()On Error GoTo msgMSComm1.PortOpen = Truemsg: MsgBox ("port had opened")End SubSub command2_click()MSComm1.PortOpen = FalseEnd SubPrivate Sub Timer1_Timer()If MSComm1.PortOpen = True ThenShape1.FillColor = RGB(0, 255, 0)Command1.Visible = Falsecommand2.Visible = TrueLabel3.Caption = "stats:" & num & ",open" & "," & setport ElseShape1.FillColor = RGB(255, 0, 0)Command1.Visible = Truecommand2.Visible = FalseLabel3.Caption = "stats:" & "close" & "!"End IfEnd SubPrivate Sub Timer2_Timer() '接收信号Dim recBuf() As ByteDim recCnt As IntegerDim str As StringDim i As IntegerDim str1 As String'Dim countRX As Integer' Do Until MSComm1.InBufferCount <> 0' DoEvents' LooprecCnt = MSComm1.InBufferCountcountRX = recCnt + countRXIf recCnt > 0 ThenReDim recBuf(recCnt)recBuf = MSComm1.Inputstr = "" ' CStr(Now) & " rec:"If Check1.Value = 1 ThenFor i = 0 To recCnt - 1str = str & CStr(Hex(recBuf(i)))Next iElseFor i = 0 To recCnt - 1str = str & Chr(recBuf(i))Next iEnd IfText1.Text = Text1.Text + strLabel4.Caption = "RX:" & countRXEnd IfEnd SubPrivate Sub Timer3_Timer() '自动发送Dim length As Integerlength = Len(Text2.Text)Timer3.Interval = Text3.TextIf (Check3.Value = 1 And length <> 0) Then Dim send() As ByteDim i As IntegerDim a() As ByteDim b As ByteReDim a(length - 1)ReDim send(length - 1)countTX = countTX + lengthsend = Text2.TextIf Check2.Value = 0 ThenMSComm1.Output = sendElsei = 0b = 0Do While i <= (length - 1) * 2If ((send(i) >= 48 And send(i) <= 57) Or (send(i) >= 65 And send(i) <= 70) Or (send(i) >= 97 And s end(i) <= 102)) ThenIf (send(i) >= 97 And send(i) <= 102) Thena(b) = send(i) - 32Elsea(b) = send(i)End IfElseIf b > 0 ThenReDim Preserve a(b - 1)End IfExit DoEnd Ifi = i + 2b = b + 1DoEventsLoop。
如何用VB 实现电脑串口通信无协技术顾问: 陈文斯什么是串口,为何要学习串口串口是计算机上一种非常通用设备通信的协议。
大多数台式计算机包含两个基于RS232的串口(一般用9针公头接出其中一个接口,如图1所示)。
串口同时也是仪器仪表设备通用的通信协议;很多GPIB 兼容的设备也带有RS-232口。
鉴于串口应用如此广泛,大多数单片机也内置了串口。
通过串口,单片机可以很轻松地与其它设备交换信息。
用VB 编写串口通信的好处Windows 操作系统由于其友好的用户界面赢得了很多用户的青睐。
Visual Basic 即是微软公司基于Windows 操作系统的可视化编程平台。
有些同学会疑问:我又不是计算机专业的,学习VB 是不是十分痛苦。
我告诉你们,非也!要是你对它感兴趣,很快,你会爱上它的。
VB 十分容易入门。
设计用户界面就像我们平时制作PPT 的界面一样。
只需把你需要的控件拖到界面上并调整即可。
VB 的代码也很通俗易懂。
其实基本上都是调用系统函数的。
为抛砖引玉,现举个例子,简要介绍一下VB 编写。
(以下的所有例程都是基于VB6.0的,对于较高.net 版本,可能有所不同)任务1:软件界面上有一个文本框和按钮,当点击按钮时,文本框上显示“爱电子,爱生活。
华南理工大学电子爱好者协会”1、 运行VB ,在新建程序的界面上画出一个文本框(textbox )和按钮(commandbotton )。
如图2所示;2、 双击按钮,出现代码编辑窗口。
并在其中输入代码,如图3所示;3、 运行程序,点击按钮,即可看到如图4所示的效果:是不是很简单呢?!图2图3图1图4个人建议大一大二的师弟师妹应该学习如何用VB操作串口,特别是学会如何实现电脑跟单片机的通信。
这样子,我们日后设计的电子作品必定增色不少。
现在详细讲解一下如何用VB操作串口。
(读者可去图书馆借阅相关图书,掌握串口跟VB的基础知识)要用VB操作串口,需要用到Mscomm控件。
第七篇串口通讯实例程序(VB版)上一篇文档中简单了解了一下SerialPort控件。
本篇文档将利用这个控件,编写一个简单的串口收发程序。
打开VS2005。
文件| 新建| 项目。
新建一个项目,名称:SerialPortTest。
打开Form1.vb窗口。
在窗口中添加几个控件。
包括4个按钮,两个编辑框,1个状态栏,两个静态文本,简单的调整一下窗体。
如下图:将两个编辑框的Multiline属性设置为True。
然后给窗体添加一个SerialPort控件。
调整一下其属性如下:BaudRate : 9600 DataBits : 8 Parity : None PortName : COM1StopBits : One ReceivedBytesThreshold : 1添加“打开串口”按钮的单击响应函数,如下:——————————————————————————————————Private Sub BTN_COM_OPEN_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BTN_COM_OPEN.ClickIf Me.SerialPort1.IsOpen = True ThenMe.StatusBar1.Text = "串口已经连接! COM1,9600,8,1"MsgBox("当前设备已连接", MsgBoxStyle.OkOnly, "提示") ElseMe.SerialPort1.Open()If Me.SerialPort1.IsOpen = True ThenMe.StatusBar1.Text = "打开串口成功!COM1,9600,8,1"ElseMe.StatusBar1.Text = "打开串口失败!"End IfEnd IfEnd Sub ——————————————————————————————————上面这段代码,打开串口,并在状态栏上显示一些提示信息。
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 相连。
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 '当输入占用时,告诉控件读入整个缓冲区。
Option ExplicitPrivate Text1text As StringPrivate RTUCRC As String'串口选择Private Sub Combo1_Click()mPort = Combo1.ListIndex + 1End Sub'数据位改变Private Sub Combo2_Click()Call settingEnd Sub'波特率改变Private Sub Combo3_Click()Call settingEnd Sub'奇偶校验改变Private Sub Combo4_Click()Call settingEnd Sub'停止位改变Private Sub Combo5_Click()Call settingEnd SubPrivate Sub setting()MSComm1.Settings = CStr(Combo3.Text) & "," & CStr(Combo4.Text) & "," & CStr(Combo2.Text) _& "," & CStr(Combo5.Text)End Sub'打开关闭串口Private Sub Command1_Click()On Error Resume NextIf MSComm1.PortOpen = False ThenMSComm1.PortOpen = TrueElseMSComm1.PortOpen = FalseEnd IfIf MSComm1.PortOpen Then '打开关闭按钮显示文字及combo1使能 Command1.Caption = "关闭串口"Combo1.Enabled = FalseElseCommand1.Caption = "打开串口"Combo1.Enabled = TrueEnd IfIf Err Then '打开串口失败,则显示出错信息MsgBox Error$, 48, "错误信息"Exit SubEnd IfEnd SubPrivate Sub Command10_Click()End Sub'10转16进制Private Sub Command2_Click()On Error Resume NextText4.Text = Hex(Text3.Text)If Err Then '\'则显示出错信息 MsgBox Error$, 48, "错误信息"Exit SubEnd IfEnd Sub'16转10进制Private Sub Command3_Click() ‘16进制显示按钮Dim a As Longa = Val("&H" & CStr(Text4.Text))Text3.Text = aEnd Sub'手动串口发送Private Sub Command4_Click() ‘手动发送按钮If MSComm1.PortOpen = False ThenMsgBox "请先打开串口", , "错误信息"Exit SubEnd IfCall sentsubEnd Sub'清除接收窗Private Sub Command5_Click() ‘清除按钮Text2.Text = ""End SubPrivate Sub Command6_Click() ‘关闭按钮Unload MeEnd Sub'窗口加载Private Sub Form_Load()Dim d%For d = 1 To 16Combo1.AddItem ("COM" & CStr(d))NextCombo1.ListIndex = 0Combo2.AddItem "6"Combo2.AddItem "7"Combo2.AddItem "8"Combo2.ListIndex = 2Combo3.AddItem "110"Combo3.AddItem "330"Combo3.AddItem "1200"Combo3.AddItem "2400"Combo3.AddItem "4800"Combo3.AddItem "9600"Combo3.AddItem "19200"Combo3.AddItem "38400"Combo3.AddItem "56000"Combo3.AddItem "57600"Combo3.AddItem "115200"Combo3.ListIndex = 5 ‘默认Combo4.AddItem "n"Combo4.AddItem "o"Combo4.AddItem "e"Combo4.ListIndex = 0Combo5.AddItem "1"Combo5.AddItem "2"Combo5.ListIndex = 0For d = 0 To 254Combo6.AddItem dNextCombo6.ListIndex = 1Text1.Text = "010*********"Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = "1000"Text6.Text = "06"Text7.Text = "0"Text8.Text = "1"Option1.Value = TrueOption3.Value = TrueIf MSComm1.PortOpen = False ThenCommand1.Caption = "打开串口"ElseCommand1.Caption = "关闭串口"End IfEnd Sub'串口接收程序Private Sub MSComm1_OnComm()Dim Hexchr As String, hexstring As String, i As Integer, j As Integer,hexdisp As StringIf Option8.Value Thenhexstring = MSComm1.Input '十六进制显示i = Len(hexstring)For j = 1 To iHexchr = Mid(hexstring, j, 1)If Hex(Asc(Hexchr)) < 16 ThenText2.Text = Text2.Text & "0" & Hex(Asc(Hexchr)) & " "ElseText2.Text = Text2.Text & Hex(Asc(Hexchr)) & " "End IfNext jText2.Text = Text2.Text & CStr(Chr(13)) & CStr(Chr(10))ElseText2.Text = Text2.Text & MSComm1.Input & CStr(Chr(13)) &CStr(Chr(10)) 'ASCII码显示End IfEnd Sub'手动发送选择Private Sub Option1_Click()If Option1.Value = True ThenTimer1.Enabled = FalseCommand4.Enabled = TrueElseTimer1.Enabled = TrueCommand4.Enabled = FalseEnd IfEnd Sub'Delta ASCII发送协议Private Sub Option10_Click()Combo6.Enabled = TrueText6.Enabled = TrueText7.Enabled = TrueText8.Enabled = TrueLabel10.Enabled = TrueLabel11.Enabled = TrueLabel12.Enabled = TrueLabel13.Enabled = TrueOption6.Enabled = FalseCombo2.ListIndex = 1Combo5.ListIndex = 1Text1.Enabled = FalseLabel14.Enabled = FalseEnd SubPrivate Sub Option11_Click()End SubPrivate Sub Option12_Click()End Sub'自动发送选择Private Sub Option2_Click()If Option2.Value = True ThenTimer1.Enabled = TrueCommand4.Enabled = FalseElseTimer1.Enabled = FalseCommand4.Enabled = TrueEnd IfEnd SubPrivate Sub Option3_Click() 'Non选项Combo6.Enabled = FalseText6.Enabled = FalseText7.Enabled = FalseText8.Enabled = FalseLabel10.Enabled = FalseLabel11.Enabled = FalseLabel12.Enabled = FalseLabel13.Enabled = FalseCombo2.ListIndex = 2Combo5.ListIndex = 0Text1.Enabled = TrueLabel14.Enabled = TrueEnd SubPrivate Sub Option4_Click() 'ASCII选项 Combo6.Enabled = TrueText6.Enabled = TrueText7.Enabled = TrueText8.Enabled = TrueLabel10.Enabled = TrueLabel11.Enabled = TrueLabel12.Enabled = TrueLabel13.Enabled = TrueOption6.Enabled = FalseCombo2.ListIndex = 1Combo5.ListIndex = 1Text1.Enabled = FalseLabel14.Enabled = FalseEnd SubPrivate Sub Option5_Click() 'RTU选项 Combo6.Enabled = TrueText6.Enabled = TrueText7.Enabled = TrueText8.Enabled = TrueLabel10.Enabled = TrueLabel11.Enabled = TrueLabel12.Enabled = TrueLabel13.Enabled = TrueOption6.Enabled = FalseCombo2.ListIndex = 2Combo5.ListIndex = 1Text1.Enabled = FalseLabel14.Enabled = FalseEnd Sub'发送时间间隔调整输入Private Sub Text5_Change()Dim number As StringDim num As IntegerDim numcyc As Integernum = Len(Text5.Text)For numcyc = 1 To numnumber = Mid(Text5.Text, numcyc, 1)Select Case InStr("0123456789", number)Case 0MsgBox "输入时间间隔错误,请重新输入", , "错误信息"Exit SubEnd SelectNextTimer1.Interval = Text5.TextEnd Sub'自动发送定时器Private Sub Timer1_Timer()If MSComm1.PortOpen ThenCall sentsubEnd IfEnd Sub'状态刷新定时器Private Sub Timer2_Timer()StatusBar1.Panels(1).Text = "串口选择:" & CStr(Combo1.Text)StatusBar1.Panels(2).Text = "串口设置:" & CStr(MSComm1.Settings) StatusBar1.Panels(3).Text = "串口状态:" & CStr(MSComm1.PortOpen) End Sub'串口发送子程序Private Sub sentsub()Dim optioncase%If Option3.Value Then optioncase = 1If Option4.Value Then optioncase = 2If Option5.Value Then optioncase = 3If Option10.Value Then optioncase = 4Select Case optioncaseCase 1 ‘无校验If Option6.Value ThenText1text = Text1.TextCall Hexsent ‘16进制发送ElseText1text = Text1.TextCall ASCIIsent ‘ascii发送End IfCase 2Call incorporate '将输入的十进制从机地址、命令、资料地址和资料内容合并成字符串Call ASCIIcheckCall ASCIIsent ‘ASCIIcheck 校验Case 3Call incorporate '将输入的十进制从机地址、命令、资料地址和资料内容合并成字符串Call RTUcheck ‘校验Call HexsentCase 4Call incorporate1 '将输入的十进制从机地址、命令、资料地址和资料内容合并成字符串Call deltaASCII ‘校验Call ASCIIsentEnd SelectEnd Sub'十六进制发送Private Sub Hexsent()Dim hexchrlen%, Hexchr As String, hexcyc%, hexmid As Byte, hexmiddle As StringDim hexchrgroup() As Byte, i As IntegerText1text = Text1.Texthexchrlen = Len(Text1text)For hexcyc = 1 To hexchrlen '检查Text1文本框内数值是否合适Hexchr = Mid(Text1text, hexcyc, 1)If InStr("0123456789ABCDEFabcdef", Hexchr) = 0 Then‘返回某字符串在另一字符串中第一次出现的位置。
如何用VB编写串口程序VB控件MSComm功能介绍VB中的MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
MSComm控件在串口编程时非常方便,程序员不必去花时间去了解较为复杂的API函数,而且在VC、VB、Delphi 等语言中均可使用。
Microsoft Communications Control(以下简称MSComm)是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它为应用程序提供了通过串行接口收发数据的简便方法。
具体的来说,它提供了两种处理通信问题的方法:一是事件驱动(Event-driven)方法,一是查询法。
1.MSComm控件两种处理通讯的方式MSComm控件提供下列两种处理通讯的方式:事件驱动方式和查询方式。
1.1 事件驱动方式事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。
在许多情况下,在事件发生时需要得到通知,例如,在串口接收缓冲区中有字符,或者 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。
在这些情况下,可以利用MSComm 控件的OnComm 事件捕获并处理这些通讯事件。
OnComm 事件还可以检查和处理通讯错误。
所有通讯事件和通讯错误的列表,参阅CommEvent 属性。
在编程过程中,就可以在OnComm事件处理函数中加入自己的处理代码。
这种方法的优点是程序响应及时,可靠性高。
每个MSComm 控件对应着一个串行端口。
如果应用程序需要访问多个串行端口,必须使用多个MSComm 控件。
1.2 查询方式查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。
在程序的每个关键功能之后,可以通过检查CommEvent 属性的值来查询事件和错误。
如果应用程序较小,并且是自保持的,这种方法可能是更可取的。
例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。
使用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串口通信及编程实例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")注意,这个函数只能发送字符串数据。
VB中串口通讯的实现详解说明在VB中实现串口通讯可以分为以下几个步骤:1.引用串口通讯相关的命名空间首先在项目中引用System.IO.Ports命名空间,该命名空间包含了实现串口通讯所需的类和方法。
2.创建串口对象使用SerialPort类创建一个串口实例,可以指定串口的名称、波特率、数据位、停止位、校验位等参数。
```vbDim serialPort As New SerialPortserialPort.PortName = "COM1"serialPort.BaudRate = 9600serialPort.DataBits = 8serialPort.StopBits = StopBits.OneserialPort.Parity = Parity.None```3.打开串口使用Open方法打开串口,可以在Open之前先判断串口是否已经打开。
```vbIf serialPort.IsOpen Then'串口已经打开ElseserialPort.OpenEnd If```4.串口数据接收通过事件处理函数来处理串口接收到的数据。
可以使用DataReceived事件来处理数据接收,当串口接收到数据时会触发该事件。
```vbPrivate Sub SerialPort_DataReceived(sender As Object, e As SerialDataReceivedEventArgs) Handles serialPort.DataReceived Dim data As String = serialPort.ReadExisting'处理接收到的数据End Sub```5.串口数据发送通过串口的Write方法来发送数据。
```vbserialPort.Write("Hello World")```需要注意的是,串口通讯是一种异步操作,发送和接收数据都需要一定的时间,因此在程序中需要合理处理串口的状态。
一个简单的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。
通讯串口:VBC++C#串口通信源代码+详细注释用的是axMSComm控件,通信方式...VBIf MSComm1.PortOpen = True Then MSComm1.PortOpen = FalsemPort = i1MSComm1.PortOpen = TrueMSComm1.InputMode = comInputModeBinaryMSComm1.InBufferCount = 0MSComm1.InputLen = 0MSComm1.Settings = "9600,N,8,1"MSComm1.RThreshold = 1MSComm1.OutBufferCount = 0C++/************************************************************** **///串行口初始化if(m_ctrlComm.GetPortOpen()) //如果串口已经打开,则关闭。
m_ctrlComm.SetPortOpen(FALSE);m_ctrlComm.SetCommPort(1); //选择com1if( !m_ctrlComm.GetPortOpen())m_ctrlComm.SetPortOpen(TRUE); //打开串口elseAfxMessageBox("不能打开串行口!");m_ctrlComm.SetSettings("9600,n,8,1"); //波特率9600,无校验,8个数据位,1个停止位m_ctrlComm.SetInputMode(1); //1:表示以二进制方式检取数据m_ctrlComm.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm 事件m_ctrlComm.SetInputLen(0); //设置当前接收区数据长度为0 m_ctrlComm.GetInput(); //先预读缓冲区以清除残留数据/************************************************************** **/C#if (this.axMSComm1.PortOpen == true)this.axMSComm1.PortOpen = false;mPort = 1;//端口this.axMSComm1.Settings = "9600,n,8,1";//通信参数this.axMSComm1.InputMode = InputModeBinary;//接收数据的类型this.axMSComm1.RThreshold = 1; //接收缓冲区中接收到一个字符,就产生一次OnComm事件//this.axMSComm1.OnComm += new EventHandler(axMSComm1_OnComm); //注册一个OnComm事件this.axMSComm1.SThreshold = 0;//当发送缓冲区中字符数小于该值时,MSComm控件设置Commevent属性为ComEvSend,并产生OnComm事件。
[程序宝典]VB串口通讯实例程序匠人 2005-9-22 14:23:00 阅读全文(3939) | 回复(0) | 引用(0) | 查看《匠人的百宝箱》代理商品VB串口通讯实例作者:liwenzhao高精度电压表(24bit) VB源程序Dim PortValue As Integer '端口号选择1-4Dim value As Double '当前一次取值Dim value2 As Double '要显示的值Dim valueSum As Double '和Dim numCount As Double '算平均值是的计数个数Dim func As Integer '功能号标志1-4Dim valueFlag As Integer/**********************************************' Check1_Click()为控制Command1是否EnabledPrivate Sub Check1_Click()'自动刷新被选中则刷新按钮无效If Check1.value ThenCommand1.Enabled = FalseElseCommand1.Enabled = TrueCommand1.SetFocusEnd IfEnd Sub*********************************************//**********************************************Private Sub Command1_Click()'显示Call displayEnd Sub*********************************************/Private Sub Command2_Click() '复位valueSum = 0 '清计数和numCount = 1 '清计数个数Label6.Caption = Str(numCount - 1) '显示复位value = 0'当前一次取值value2 = 0'要显示的值valueFlag = 0Call displayEnd SubPrivate Sub Form_Activate()numCount = 1value = 0valueSum = 0PortValue = 1Text1.Visible = FalseLabel6.Caption = "0"Option1(0).value = TrueOption2(0).value = True'为什么两个都是TrueCommand1.SetFocus'SetFocus是什么?Label1.Caption = Format(value2, "0.000,000")'Format为格式输出函数For i = 0 To 3If Option2(i).value = True Thenfunc = i + 1End IfNext iCheck1.value = 1'Call ComPortOpenEnd SubPublic Sub ComPortOpen() '开串口With MSComm1.CommPort = PortValue '使用COM1 .Settings = "9600,N,8,1" '设置通信口参数 .InBufferSize = 40'设置MSComm1接收缓冲区为40字节'.OutBufferSize = 2'设置MSComm1发送缓冲区为2字节'VB中OutBufferSize是以字符为单位的???.InputMode = comInputModeBinary'设置接收数据模式为二进制形式.InputLen = 1'VB中InputLen单位是字符数'设置Input 一次从接收缓冲读取字节数为1'.SThreshold = 1'VB中SThreshold单位是字符数'设置Output 一次从发送缓冲读取字节数为1.InBufferCount = 0 '清除接收缓冲区'.OutBufferCount = 0 '清除发送缓冲区'MaxW = -99'最大值赋初值????'MinW = 99'最小值赋初值????'w = 0'数据个数计数器清零.RThreshold = 1On Error Resume Next'????'设置接收一个字节产生OnComm事件/**********************************************'打开串口,如打不开,则Err,出现msg……If .PortOpen = False Then'判断通信口是否打开.PortOpen = True '打开通信口If Err Then '错误处理msg = MsgBox(" 串口 COM" & PortValue & " 无效! ", vb OKOnly, "警告")'vbOKOnly显示确定按钮Exit SubEnd IfEnd If**********************************************/End With'MsgBox "端口已打开"End SubPublic Sub ComPortClose() '关串口MSComm1.PortOpen = False' MsgBox "端口已关闭"End SubPrivate Sub MSComm1_OnComm()Call reciveEnd SubPrivate Sub Option1_Click(Index As Integer)If MSComm1.PortOpen = True ThenCall ComPortCloseEnd IfPortValue = Index + 1Call ComPortOpenEnd SubPrivate Sub recive() '检测起始位并接收数据Dim Buffer As VariantDim Arr() As ByteDim inData(5) As ByteDim count As IntegerDim temp As Byte' MsgBox "OnComm"With MSComm1Select Case .CommEvent'判断MSComm1通信事件 CommEvent ???Case comEvReceive'收到Rthreshold个字节产生的接收事件Buffer = .InputArr = Buffer'读取一个接收字节' Text1.Text = Arr(0)If Arr(0) = &H1B Then' &H表示是十六进制数,1B即27???是27.RThreshold = 0DoDoEvents' DoEvents是什么?Loop Until .InBufferCount >= 4'这里的4是不是应该是40For i = 1 To 4'count = .InBufferCountBuffer = .InputArr = BufferinData(i) = Arr(0)Next iIf inData(4) = &HA ThenIf (inData(1) Mod 64) >= 32 Then.RThreshold = 1Exit SubEnd IfvalueFlag = 1'0.000003814697265625temp = inData(1) Mod 16If temp <= 7 Thenvalue = inData(1) Mod 8value = value * 256 * 256value = value + Val(inData(2)) * 256 value = value + Val(inData(3))value = value * 3.814697265625E-06 'Text1.Text = Format(value, "0.000,00 0")Elsevalue = inData(1) Mod 8value = value * 256 * 256value = value + Val(inData(2)) * 256 value = value + Val(inData(3))value = value * 3.814697265625E-06 value = 0 - valueEnd Iftemp = inData(1) Mod 128' test OFIf temp >= 64 ThenIf value < 0 Thenvalue = value - 0.000004Elsevalue = value + 0.000004End IfEnd If'检测自动刷新If Check1.value Then'valueFlag = 1Call displayEnd IfElse.RThreshold = 1Exit SubEnd If.InBufferCount = 0.RThreshold = 1End IfCase ElseEnd SelectEnd With'Text1.Text = Text1.Text + 1End SubPrivate Sub Option2_Click(Index As Integer)func = Index + 1End SubPublic Sub display() '判断功能并显示'功能选择Select Case funcCase 1 '当前值value2 = valueCase 2 '平均值If numCount > 100000 ThennumCount = 1valueSum = 0End IfIf valueFlag = 1 ThenvalueSum = valueSum + valuevalue2 = valueSum / numCountnumCount = numCount + 1valueFlag = 0Label6.Caption = Str(numCount - 1) 'Str()为数字转换成字符串函数End IfCase 3 '最大值If value > value2 Thenvalue2 = valueEnd IfCase 4 '最小值If value < value2 Thenvalue2 = valueEnd IfCase ElseEnd Select'Text1.Text = Str(valueSum)Label1.Caption = Format(value2, "0.000,000") End SubPrivate Sub Timer1_Timer()'清缓冲区' Text1.Text = MSComm1.InBufferCountIf MSComm1.InBufferCount >= 80 ThenMSComm1.InBufferCount = 0End IfEnd Sub[编程技巧]Visual Basic串口通讯调试方法程序匠人 2005-10-22 19:48:00 阅读全文(1192) | 回复(0) | 引用(0) | 查看《匠人的百宝箱》代理商品Visual Basic串口通讯调试方法现有电子秤一台,使用串口与计算机进行通讯。