文档库 最新最全的文档下载
当前位置:文档库 › 基于VB的DSP与PC机的串行通信

基于VB的DSP与PC机的串行通信

基于VB的DSP与PC机的串行通信
基于VB的DSP与PC机的串行通信

收稿日期:2004-11-18

作者简介:梁 天(1978)),男,山西大同人,硕士研究生,研究方向为DSP 控制。

基于VB 的DS P 与PC 机的串行通信

梁 天,杨振强

(大连理工大学电气工程与应用电子技术系,辽宁大连116023)

摘 要:要实现对现代变压器特性试验仪的数据处理和分析,必须解决PC 机和DSP 的串行通信问题。文中介绍了基于V isual Basic6.0的DSP 与PC 机的串行通信,构建了两者的串行通信体系结构,并通过具体的实例给出了DSP 与PC 机之间串行通信的方法。结果表明,该方法简单有效、功能强大,方便地实现了PC 机和DSP 之间的通信,借鉴性高。关键词:MSComm 控件;串行通信;DSP

中图分类号:TN 919 文献标识码:A 文章编号:1005-3751(2005)09-0096-03

Serial Communication between DSP and PC on the Basis of VB

LIANG Tian,YANG Zhen -qiang

(Electrical Engineer ing and Application Electronic T echn.Dept.,Dalian U niv.o f T echn.,Dalian 116023,China)

Abstract:Realizing the data processing and analysis of the modern voltage transformer characteristic must solve the serial communication problems of the PC and DSP.Introduces the seri al com municati on betw een DS P and PC based on Visual Basic6.0,and builds the serial communication sys tem structure of the tw o.Provides the seri al communication method betw een DS P and PC through the concrete i n -stance.Th e result indicates that this method is simple,effective an d pow erful,and realizes the com municati on betw een the PC and DSP conveniently.The draw ing lessons from is h i gh.Key words:M S Comm control;serial communication;DSP

0 引 言

在当今,网络技术越来越多地应用在各个领域,微机技术及单片机也不断发展,因此,目前大多数小型计算机监控系统都采用以PC 机和DSP 构成的串行通信网络来完成监控任务。其中,DSP 主要进行对数据的实时采集、处理、控制,再通过串口将数据送入PC 机的缓冲区,然后由PC 机对数据进行进一步处理,以便得到所需的图形、图像及实验结果。采用VB 语言中的通信控件M SComm 能够很好地完成二者之间的通信功能。文中所介绍的通信方法的背景是大连理工大学为某单位设计制作的BT -1型变压器特性试验仪。

1 系统简介

随着DSP 技术的发展,变压器特性试验仪可以做到计算精度更高、更容易操作。使用者只需在键盘上按几个键,就可以完成变压器特性试验,而且利用汉字液晶显示模块,可以将试验结果直观地显示给使用者。所用的智能化传感器可以准确地将电压、电流和功率等电信号转换成DSP 可以识别的信号,这样大大简化了电路,而且提高了

试验精度。加上RS -232通讯端口后,仪器可以与计算机进行通讯,将试验数据形成电子表格或w ord 文件打印出来。

大连理工大学所设计的BT-1型变压器特性试验仪很好地体现了这些特点。通过该试验仪对选定的变压器分别进行空载试验和负载试验[1],然后将试验所得的数据(空载损耗、空载电流、负载损耗、阻抗电压等)通过串行口传给上位机,最后形成数据表格供用户记录查询。

2 通信原理和方法

上位机首先向DSP 发出接收数据的指令,DSP 接收到来自上位机的指令后,进行判断,看其是否正确。如果正确,则向上位机传送数据(包含首尾校验字节);否则,DSP 拒绝向上位机传送数据。上位机接收到DSP 传来的数据后同样要判断正确与否,如果正确,则接收,否则拒绝接收。

笔者实例中所采用的通信方法是:上位机向DSP 发送1,2,,,255任意一个数字(该数字代表实验的序列号,即表示需要的是哪组实验数据)。DSP 接收到此指令后,进行判断,如果正确,则向上位机发送相应的组数据2次;如果不正确,DSP 则处于等待状态,不发送数据。上位机收到来自DSP 的数据后,首先进行数据校验,如果校验成功(即接收到的两组数据相同),则说明接收到的数据是正

第15卷 第9期2005年9月 微 机 发 展M icr ocomputer Dev elopment V ol.15 N o.9Sep.2005

确的,从而可以进行处理,否则拒绝接收,并显示相关警告信息。

3 硬件连接

由于上位机的串行口都是RS-232C 的标准接口,而DSP 在通讯上却采用的是TTL 电平,因此在上位机与DSP 的通讯中,存在着电平转换问题[2]。为了解决这个问题,采用了MAXIM 公司的符合RS -232标准的驱动芯片MAX232。这种芯片可以实现TT L 电平与RS -232C 接口电平之间的转换,也就是说可以将以5V 电平表示/10、0V 电平表示/00的逻辑转为-3~-15V 电平表示/10、+3~+15V 电平表示/00的逻辑。MAX232功耗低、集成度高,使用5V 电源,具有两个接收和发送通道。T MS320LF2407采用的是3.3V 供电,在M AX232与T MS320LF2407之间有匹配电路,从而确保了整个接口电路的稳定、可靠。硬件电路框图如图1

所示。

图1 硬件电路框图

1)SP 与MAX232的连接。

DSP 的IOPA0-TX,IOPA1-RX 与M AX232直接相连,读写控制信号和选通信号WR,RR,CS0由DSP 控制信号和地址线译码产生。DSP 接收串口数据采用中断方式,发送数据采用查询方式。DSP 通过查询/发送完毕0位是否为/10来判断是否已经将当前数据帧发送完毕,从而实现了PC 机与DSP 的全双工通讯。

2)TTL 电平与232电平的转换。

这里采用了一个芯片MAX232,该芯片具有多对电平转换电路,能在TTL 电平和RS232电平之间互相转换。本设计中,TT L 电平转换为RS232电平,然后从T1OU T 管脚输出;RS232信号从R1IN 管脚输入,转换为TTL 电平,然后从R1OUT 管脚输出。

3)机串口的连接。

本设计中用到了PC 机9针串口中的3针,即串口发送、串口接收和地线。分别和MAX232的T 1OUT ,R1IN 管脚以及地线相连。

4 软件设计(VB 部分)

一般情况下,控制系统需要一个用高级语言开发的相当于控制台的用户界面来进行参数设置、发送指令和系统监测,VB 在这一领域有很强的优势。MSComm 是M-i crosoft 提供的Window s 下串行通信编程的一个ActiveX 控件,其核心内容是组件对象模型COM (Component Ob -

ject M ode l),它以属性和事件的形式提供对Window s 通信驱动程序API 函数的接口。MSComm 控件使用事件驱动方式来处理和解决各类通信软件的开发设计,并提供了使用RS-232来进行数据通信的所有协议。VB 为该控件提供了标准的事件处理函数和过程,通过属性和方法提供串行通信的设置[3]。

1)M SComm 控件的相关属性。

CommPort :设置并返回通信端口号[4];

PortOpen :设置并返回通信端口的状态,也可以打开和关闭端口;

Settings :以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位;

Input :从接收缓冲区返回和删除字符;

Input Len :设定串行端口读入字符串的长度;

InputM ode :读取或设置从接收缓冲区读取的数据的格式;

InBufferCount :读取接收缓冲区里的字节数;InBufferS ize:读取或设置接收缓冲区的大小;Output :向发送缓冲区写入数据;

OutBufferCount :读取发送缓冲区里的字节数;OutBufferSize:读取或设置发送缓冲区的大小;Rthre shold :设定引发OnComm 事件的字节数;

CommEve nt :读取或设置串口事件。

2)数据的发送和接收。

对于没有串口编程经验的开发人员来说,实际当中碰到最棘手的问题可能就是数据发送和接收时变量类型的匹配问题。无论使用M SCom m 控件的Input 属性,还是使用其Output 属性,通信过程都可以处理文本和数据两种情况,这两种情况所采用的方法是不同的。4.1 数据的发送

正常情况下,如果要发送一个字符串到串行口,可以以文本数据的形式发送。例如,发送字符/NO.10到串行口:

If MSComm1.PortOpen T hen .关闭串行口MSComm1.Por tOpen =False End If

MSComm1.Por tOpen =True .打开串行口

MSComm1.Output =/NO.10.发送/NO.10到串行口如果在通信中开发人员要传送的是数据,由于Output 属性支持的变量类型为V ariant 类型,因此必须传递一个包含字节数组的Var i ant 到串行口(VB 中数据类型的缺省值即为Var-i ant)[5]。例如,笔者实例中发送变压器组号(10进制数据)到串行口:

Dim outArr(0)As Byte .定义一个byte 类型的数组变量Dim out As Var i ant .定义一个Variant 类型的变量Dim m as integer

m =Val(InputBox(/请输入您要试验的变压器组号0))outArr(0)=m

#

97#第9期 梁 天等:基于VB 的DSP 与PC 机的串行通信

out =outArr

M SComm1.Output =out .将Variant 变量的值发送到串行口

4.2 数据的接收

在使用MSComm 控件的Input 属性读取数据之前,必须先设置InputLe n 属性确定读取的字符数,设置In -putLen 为0,则读取缓冲区中的全部内容。

如果接收的数据为文本数据,则设置InputMode=c omInputM odeT e xt;如果接收的数据为二进制数据,则In -putM ode=comInputModeBinary 。由于Input 属性中定义的数据类型也为Va riant 型,因此从串行口收到的数据必须先附给一个Variant 变量,收到后再转成其它类型的数据进行处理。以下例子就是笔者实例中接收缓冲区中所有数据,并把它附给一个字节数组,然后再将数据附给一个整型数组。

Dim Buffer As Variant Dim Arr()As Byte

Dim num()As Integer .声明动态数组Dim intinputlen As Integer

M SComm1.InputMode =comInputModeBi nary .设置接收数据模式为二进制形式

intinputlen =MSComm1.InBufferCount .接收到的数据字符数

ReDim Buffer(intinputlen).重分配存储空间ReDim num(intinputlen)Buffer =M SComm1.Input Arr =Buffer

For i =0T o intinputlen -1.将收到的数据保存在整型数组中

num(i)=Arr(i)N ext i

M SComm 控件中的RTH reshold 属性是用来设置在OnComm 事件激活前接收缓冲器收到的字节数。当接收

到的字节数达到RTH reshold 设置的字数时,就会引起OnComm 事件。OnComm 事件可以形象地理解为单片机中的中断,触发后,通过编程访问CommEvent 属性了解通信事件的类型,进而做出相应处理。由于本实例开发中并未采用OnCom m 事件,因此这里不再详细说明。

笔者所开发变压器特性试验仪软件时VB 部分的流程图,如图2

所示。

图2 VB 程序流程框图

5 结束语

文中所介绍的通信方法的背景是笔者所在学校为某单位设计制作的BT-1型变压器特性试验仪,经试运行,证明这种通信方法稳定、可靠,确实是一种非常实用有效的通信方法。同时这种通信方法完全可以应用于其他工业通信场合。

参考文献:

[1] 胡启凡,曹利安.变压器试验技术[M ].北京:机械工业出版

社,2000.

[2] 刘和平.TM S320LF2407XDSP 结构、原理及应用[M ].北

京:北京航空航天大学出版社,2002.

[3] 李 卓,王德春.VB 环境下实现GPS \GLONASS 组合接

收机的串行通信[J].微机发展,2004,14(10):82-84.[4] 仵 浩.V i sual Basic 串口通信工程开发实例导航[M].北

京:人民邮电出版社,2003.

[5] 范逸之.V isual Basic 与RS232串行通讯控制[M ].北京:中

国青年出版社,1998.(上接第95页)

现在嵌入系统配置越来越高已经变成了必然的趋势,然而还是存在大量的低端产品,在处理速度和内存方面还达不到利用图形库的性能,所以依然有字符方式下的需求,文中介绍的一种在Linux 控制台方式下应用程序集成的机制,为能在字符方式下实现成型系统打下了基础。

参考文献:

[1] 探矽工作室.嵌入式系统开发圣经[M ].北京:中国青年

出版社,2002.

[2] 毛德操,胡希明.Linux 内核原代码情景分析[M ].杭州:

浙江大学出版社,2001.

[3] RUBIN I A,CORBET J.LINU X 设备驱动程序[M].魏永

明,骆 刚,姜 君译.北京:中国电力出版社,2002.[4] Newbam C,Rosenblatt B.学习bash[M ].徐 炎,查石祥

译.北京:机械工业出版社,2003.

[5] BOVET D P,CESAT I M.深入理解L IN UX 内核[M].陈

莉君译.北京:中国电力出版社,2004.

#98#

微机发展 第15卷

VB串口通信(附图教程)

界面如下: 代码如下: Private Sub Form_Load() If MSComm1.PortOpen = True Then MSComm1.PortOpen = False Else End If Combo1.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 = 2 Combo2.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" https://www.wendangku.net/doc/102853969.html,mPort = Combo1.ListIndex + 1 MSComm1.Settings = "9600,n,8,1"

VB6.0下MSComm控件实现串口通信

VB6.0下用MSComm控件实现串口通信 MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能,以下先对其属性进行详细的说明后再举一个例子进行说明: 1基本属性 CommPort O https://www.wendangku.net/doc/102853969.html,mPort[=value] Object为MSComm控件,value为整数值,标志端口号。 说明:该属性设置并返回通讯端口号,value的值可以设为1-16间的任意数(默认为1)。在打开端口之前必须先设置CommPort属性,当端口不存在时,如果用PortOpen属性打开它,MSComm控件会产生错误68(即设备无效的错误)。 Settings Objiect.Setting[=value] Object为MSComm控件,value为字符串类型,表示通讯端口的设置值。 说明:本属性用来设置并返回端口的波特率、奇偶校验位、数据位和停止位参数。当端口打开时,如果指定的value参数非法,则MSComm控件产生380号(非法属性值)错误。有效的value参数值由四个设置值组成,有如下格式:“BBBB,P,D,S”,其中BBBB为波特率,P为奇偶校验,D为数据位数,S为停止位数。Value的默认值为:“9600,N,8,1”,下面给出合法的波特率、奇偶校验位、数据位和停止位参数: 波特率:110,300,600,1200,2400,4800,9600(默认),14400,19200,28800,38400,56000,57600,115200,128000,256000。 奇偶校验值:E(偶校验,Even)、M(标记,Mark)、N(默认,Default,None)、O(奇校验,Odd)、S(空格,Space)。 数据位值:4,5,6,7,8(默认),9。 停止位值:1(默认),1.5,2。 PortOpen O bject.PortOpen[=value] Object为MSComm控件。Value为布尔类型,表明通讯端口的状态。 说明:本属性用来设置或返回通讯端口的状态(开或关)。在设计时本属性无效。 设置PortOpen属性为True时端口将会被打开。设置为False时将关闭端口并清除接收和传输缓冲区中的数据。当应用程序终止时,SMComm控件自动关闭串行端口。 在打开端口之前,必须给CommPort属性设置一个合法的端口号。如果CommPort属性被设置成一个非法的端口号,则在打开端口时,MSComm控件将产生错误码为68(表示设备无效)的错误。另外,串行端口设备必须支持Settings属性的当前设置值。如果Settings属性包含硬件不支持的通讯设置值,则硬件可能不会正常工作。如果在端口打开之前,DTREnable 或RTSEnable属性被设置为True,则在关闭总线时,这些属性将被设置为False。否则DTR 和RTS线仍将保持其先前的状态。 Input Object.Input Object为MSComm控件。

vb串口通讯usb通讯,很有用哦

vb串口通讯usb通讯,很有用哦 VB 完成串口通信。一种是用VB 提供的具有强大功能的通信控件;另一种方法 是调用WINDOWS API 函数,使用WINDOWS 提供的通信函数编写移植性强的应用程序;第三是利用文件的输入/ 输出完成,该方法简便易行,但有一定的局限性。一、利用通信控件(MSCOMM) 完成串口通信 VB 提供了通信控件MSCOMM,文件名为MSCOMM. VBX。该控件可设置串行通信 的数据发送和接收,对串口状态及串行通信的信息格式和协议进行设置。在通信过程中可以触发OnComm事件,在该事件过程进行数据检验处理及检错,还可以通过编程访问CommEvent 属性来了解通信的情况,进行收发数据的处理。每个通信控 件对应一个串口,如果要访问多个通信口,则要设计多个通信控件。 1、通信控件的事件及基本属性 (1)事件 OnComm:通信控件只提供了一个事件,该事件的触发可以对串口的通信事件及 错误进行处理。通过对CommEvent 属性的判断可知当前的通信错误和事件,分别 对每个CommEvent 值进行编程就完成了对各个错误和事件的处理。如:CommEvent = MSCOMM—EV—SEND 表示发送事件。这些信息可从VB 提供的常量文件CONSTANT. TXT中查出。 (2)属性 CommPort :设置通信控件与哪个串口相连接,设置并返回通信口号。 Setting :设置通信的信息格式,为字符型。顺序为:波特率、校验、数据位、停止位。 PortOpen :布尔型、开关通信口。 InputLen :从接收缓冲区读取字符个数。

Input ,Output :读取接收缓冲区或写入发送缓冲区字符。 以上五种属性对串口完成基本的设置和操作,下面的三种属性是描述如何利用VB 提供的事件驱动机制来实现通 信。 CommEvent :返回通信过程中产生的错误信息及事件,了解通信状况。SThreshold :设置并返回不触发OnComm事件时发送缓冲区被允许的最少字符数。当缓冲区的字符少于设置的值时,则触发OnComm事件,并把CommEvent 设为MSCOMMM—EV—SEND。当SThreshold = 0 则禁止发送触发OnComm 事件,当SThreshold = 1 则发送缓冲区为空时就触发OnComm事件。利用这一属性,就可完成发送数据后的一系列操作。如:对刚发送的数据进行处理,当串口是和MODEM通信时,发送完数据后可进行拆除线路联接、挂机等操作。 RThreshold :设置并返回不触发OnComm事件时接收缓冲区被允许的最多字符数。当缓冲区的字符多于设置的值时,则触发OnComm 事件,并把CommEvent 设为MSCOMM—EV—RECEIVE,当RThreshold = 0 则禁止接收触发OnComm 事件,当RThreshold = 1 则接收缓冲区有一个或更多字符时就触发OnComm事件。利用这一属性,就可完成对串口接收数据的处理。 2、利用通信控件的实例 Sub Form1 —load () form1. show ′设置COM1 comm1. commport = 1 comm1. Setting = " 9600 ,o ,8 ,1" ′波特率:9600 奇校验,8位数据,1 位停止位 comm1. Inputlen = 0 ′读取接收缓冲区的所有字符

用VB实现Modbus RTU串行通讯工程实例

用VB实现Modbus RTU串行通讯工程实例 声明:网上看到的,觉得不错,稍微整理了一下分享给大家。 用VB实现Modbus RTU串行通讯 在一些应用中可能需要使用诸如VB来进行上位机监控程序的开发,而Modbus 协议是这类应用中首选的通讯协议;Modbus协议以其简单易用,在工业领域里已广泛的为其他第三方设备所支持。这里对VB和Twido PLC间的通讯进行说明。 对于大部分应用,Twido PLC作为从站,它不需要编制通讯程序,只要把通讯口的参数设置好即可,例如下图表示此Twido通过编程口和上位机连接,其站号地址为2;波特率、数据位、校验、停止位和上位机设置保持一致。 VB程序通过利用MSComm控件很容易就能够实现。 1.通讯口初始化: MSComm1.Settings = "9600,n,8,1" https://www.wendangku.net/doc/102853969.html,mPort = 1 MSComm1.SThreshold = 0 If Not MSComm1.PortOpen Then MSComm1.PortOpen = True 2. CRC校验码的计算方法,如以下函数,可以得到字节数组变量cmdstring指向的字符串的CRC校验码。 Function crc16_1(ByRef cmdstring() As Byte, ByVal j As Integer) Dim data As Integer Dim i As Integer Addressreg_crc = &HFFFF For i = 0 To j Addressreg_crc = Addressreg_crc Xor cmdstring(i) For j = 0 To 7 data = Addressreg_crc And &H1

VB6.0环境下基于USB的虚拟串口通讯实现

VB6.0环境下基于USB的虚拟串口通讯实现 摘要:以ftdi公司的ft232bl芯片为核心设计并实现了基于usb 接口的计算机与单片机之间的虚拟串口通讯。单片机采用philips 公司p89系列单片机,完成数据的存储。计算机在windows环境下利用mscomm通讯控件实现上位机与下位机之间的数据传输。在此提出了pc机对虚拟串口的自动识别方法,并提供了程序的源代码。实验结果表明,用虚拟串口实现计算机与单片机之间的usb通信,具有速度快,软件实现简单等优点。 关键词:vb6.0; usb口; ft232bl;虚拟串口 引言 数据传输是现代通讯过程中的一个重要环节,在数据传输过程中,不仅要求数据传输的准确率要高,而且要求速度快、连接方便。传统的rs 232串口通讯和并口通讯都存在传输速度低、扩展性差、安装麻烦等缺点,而基于usb接口的数据传输系统能够较好地解决这些问题。目前,usb接口以其传输速率高、即插即用、支持热插拔等优点,逐步成为pc机的标准接口。 本文中的数据传输系统采用了usb接口进行上位机与下位机之间的数据通讯。下位机采用philips 公司p89系列单片机,完成数据的存储。上位机通过vb6.0编程,实现上位机与下位机之间的数据传输。 1数据传输系统的总体设计

系统的硬件部分主要包括2部分:上位机端和下位机端。上位机采用pc机或笔记本电脑,操作系统为windows xp,实现上位机和下位机之间的数据传输、显示、处理、存储及查询功能。系统的下位机采用philips公司p89系列单片机,完成数据的存储。下位机为一个手持的数据存储仪,由usb转串口数据转换模块、ttl转rs 422总线模块、中央处理模块、显示模块、存储模块、电源模块等组成。上位机与下位机的连接利用pc机自带的usb接口,原理框图如图1所示。 图1数据传输系统原理框图把数据记录卡插入数据存储仪内,可把卡内数据转存到存储模块。数据存储仪通过usb口与pc机连接,把所存数据传输到上位机,上位机对数据进行显示、处理及存储。系统采用ftdi公司的ft232bl芯片作为usb转串口模块,可以和单片机的内置串口直接连接,使单片机通过usb口和pc机通讯。芯片一方面可以接收从pc机发来的usb数据,并将其转换为串行i/o数据格式发送给单片机串口;另一方面可把单片机从串口发出的数据转换为usb的数据格式传回pc机。与其他usb接口芯片相比,用ft232bl芯片进行usb外设开发,只需熟悉单片机编程及简单的vc或vb 编程,而无需考虑固件设计以及驱动程序的编写,从而能大大缩短usb外设产品的开发周期。 2硬件电路设计 2.1ft232bl芯片简介

VB6.0串口操作

VB6.0串口操作 职业2010-12-22 11:30:58 阅读60 评论0 字号:大中小订阅 一直想通过计算机人机界面来控制单片机,感觉用软件控制硬件,即计算机控制是一件比较有意思的事情。 计算机与单片机的连接,是通过串口来实现的。如何实现,我想应该明白VB怎样来操作串口,实现VB 操作串口,就可以把单片机串口线接入计算机,从而实现真正的计算机控制单片机。 这其他是别人早已实现了的,我因为是刚接触,就写下来留作纪念吧。。。 开发软件:Visual Basic 6.0企业版(VB6) 新建一个工程:标准EXE。 接下来做Form界面。 代码: Private Sub Combo1_Click() If MSComm1.PortOpen = True Then '如果串口打开先关闭后再进行其他操作 MSComm1.PortOpen = False End If https://www.wendangku.net/doc/102853969.html,mPort = Combo1.ListIndex + 1 End Sub Private Sub Command1_Click() Dim Temp(0) As Byte Dim strBuff As String If Option3.Value = True Then '如果显示16进制发送则进行16进制处理,这里只发送一个Temp(0) = "&H" & Text1 MSComm1.Output = Temp '发送一个16进制 Else strBuff = Text1 End If

If MSComm1.PortOpen = False Then MsgBox "请打开串口" End If On Error GoTo uerror MSComm1.Output = strBuff uerror: End Sub Private Sub Command2_Click() On Error GoTo uerror '发现错误跳转到错误处理 If Command2.Caption = "关闭串口" Then MSComm1.PortOpen = False Command2.Caption = "打开串口" '按钮文字改变 Shape1.FillColor = &HFFFFC0 '灯颜色改变Else MSComm1.PortOpen = True Command2.Caption = "关闭串口" Shape1.FillColor = &HFF End If Exit Sub uerror: msg$ = "无效端口号" '错误显示 Title$ = "串口调试助手" x = MsgBox(msg$, 48, Title$) '48标示显示警告图标 End Sub Private Sub Command3_Click() Text2.Text = "" End Sub Private Sub Command4_Click() Text1.Text = "" End Sub Private Sub Form_Load() If MSComm1.PortOpen = True Then MSComm1.PortOpen = False Else End If Combo1.AddItem "COM1" Combo1.AddItem "COM2" Combo1.AddItem "COM3"

VB串口通信详细讲解

VB串口通信 目前,Visual Basic (简称VB)已成为WINDOWS 系统开发的主要语言,以其高效、简单易学及功能强大的特点越来越为广大程序设计人员及用户所青睐。VB支持面向对象的 程序设计,具有结构化的事件驱动编程模式并可以使用无限扩增的控件。在VB应用程序可以方便地调用WINDOWS API函数,使得编程效率提高,应用功能增强。 利用VB提供的这些功能,我们可以有三种方法完成串口通信。一种是用VB提供的具有强大功能的通信控件;另一种方法是调用WINDOWS API函数,使用WINDOWS 提供的通信函数编写移植性强的应用程序;第三是利用文件的输入/输出完成,该方法简便易行,但有一定的局限性。 一、利用通信控件(MSCOMM)完成串口通信 VB提供了通信控件MSCOMM,文件名为MSCOMM. VBX。该控件可设置串行通信的数据发送和接收,对串口状态及串行通信的信息格式和协议进行设置。在通信过程中可以触 发On Comm 事件,在该事件过程进行数据检验处理及检错,还可以通过编程访问CommEvent属性来了解通信的情况,进行收发数据的处理。每个通信控件对应一个串口,如果要访问多个通信口,则要设计多个通信控件。 1、通信控件的事件及基本属性 (1)事件 On Comm :通信控件只提供了一个事件,该事件的触发可以对串口的通信事件及错误进行 处理。通过对CommEvent属性的判断可知当前的通信错误和事件,分别对每个CommEvent 值进行编程就完成了对各个错误和事件的处理。如:CommEvent = MSCOMM —EV—SEND表示发送事件。这些信息可从VB提供的常量文件CONSTANT. TXT中查出。

VB串口通信程序代码

vb中怎样用mscomm控件实现串口通信 本问分两部分均来自https://www.wendangku.net/doc/102853969.html, 第一部分jessezappy(晶晶) ================================================================================== If MSComm1.PortOpen Then MSComm1.PortOpen = False https://www.wendangku.net/doc/102853969.html,mPort = 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) Then instring = instring & InStringB AddText Text3, InStringB, False InStringB = "" End If End If END SUB

VB中串口通讯的实现

VB中串口通讯的实现 一、概述 串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于PC间的通讯以及PC和单片机之间的通讯之中串口通讯的编程,人们往往立刻想到C、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。 实际上,只要我们借助相关ActiveX控件的帮助,即使是在底层操作一向不被人看好的VB中,一样能够实现串甚至其实现方法和C、汇编相比,要更加快捷方便。下面,笔者就介绍一下在VB中实现串口通讯的方法。 在Visual Basic中有一个名为Microsoft Communication Control(简称MSComm)的通讯控件。我们只要此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。下面,笔者就简要地介绍一下 MSComm控件的使用方法。 二、MSComm控件的主要属性、事件 1、MSComm的属性 由于MSComm控件属性很多,在此笔者仅介绍与实现串口通讯密切相关的核心属性。 Commport:设置通讯所占用的串口号。如设成1(默认值),表示对Com1进行操作。 Setting:对串口通讯的相关参数。包括串口通讯的比特率,奇偶校验,数据位长度、停止位等。其默认值0,N,8,1”,表示串口比特率是9600bit/s,不作奇偶校验,8位数据位,1个停止位。 Portopen:设置串口状态,值为True时打开串口,值为False时关闭串口。 Input:从输入寄存器读取数据,返回值为从串口读取的数据内容,同时输入寄存器将被清空。 Ouput:发送数据到输出寄存器。 InBufferCount:设置输入寄存器所存储的字符数,当将其值设为0时,则输入寄存器将被清空。 InputMode:设置从输入寄存器中读取数据的形式。若值为0,则表示以文本形式读取;值为1,则表示以二式读取。 OutBufferCount:设置输出寄存器所存储的字符数,当将其值设为0时,则输出寄存器将被清空。

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),然后再进行数据处理。①如果微机在下一帧数据接收前即20ms内能将数据计算处理完毕,则接收缓冲区内只会保存有一帧数据,不会存有两帧以上数据,接收缓冲区的大小不会影响实时监测效果(接收缓冲区>4字节),这时完全可以实现实时监测或实时控制;②如果微机在20ms内不能将数据计算处理完毕,接收缓冲区设置得又很大,在数据计算处理完毕前,接收缓冲区内就会保存有两帧以上数据,而且一次工作时间越长,缓冲区内滞留数据帧就越多,数据采集和数据处理之间产生逐渐增大的额外时间差,当接收缓冲区充满后,时间差不再增大,固定在某一值,部分数据因不能及时采集到接收缓冲区中,数据产生丢失现象,真实工作情况就会和微机处理结果产生较大的时间差,对实时监测和实时控制很不利,这种情

VB串口通讯控件MSComm详解

VB串口通讯控件MSComm详解 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 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“确定”响应。 2.MSComm 控件的常用属性 MSComm控件有很多重要的属性,但首先必须熟悉几个属性。 CommPort 设置并返回通讯端口号。 Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。 Input 从接收缓冲区返回和删除字符。 Output 向传输缓冲区写一个字符串。 下面分别描述: CommPort属性设置并返回通讯端口号。 语法https://www.wendangku.net/doc/102853969.html,mPort[value ] (value 一整型值,说明端口号。) 说明在设计时,value 可以设置成从1 到16 的任何数(缺省值为1)。但是如果用

VB实现串口通讯

VB实现串口通讯 目前,Visual Basic (简称VB)已成为WINDOWS 系统开发的主要语言,以其高效、简单易学及功能强大的特点越来越为广大程序设计人员及用户所青睐。VB 支持面向对象的程序设计,具有结构化的事件驱动编程模式并可以使用无限扩增的控件。在VB 应用程序中可以方便地调用WINDOWS API函数,使得编程效率提高,应用功能增强。 利用VB 提供的这些功能,我们可以有三种方法完成串口通信。一种是用VB 提供的具有强大功能的通信控件;另一种方法是调用WINDOWS API 函数,使用WINDOWS 提供的通信函数编写移植性强的应用程序;第三是利用文件的输入/ 输出完成,该方法简便易行,但有一定的局限性。 一、利用通信控件(MSCOMM)完成串口通信 VB 提供了通信控件MSCOMM,文件名为MSCOMM. VBX。该控件可设置串行通信的数据发送和接收,对串口状态及串行通信的信息格式和协议进行设置。在通信过程中可以触发OnComm事件,在该事件过程进行数据检验处理及检错,还可以通过编程访问CommEvent 属性来了解通信的情况,进行收发数据的处理。每个通信控件对应一个串口,如果要访问多个通信口,则要设计多个通信控件。 1、通信控件的事件及基本属性 (1)事件 OnComm:通信控件只提供了一个事件,该事件的触发可以对串口的通信事件及错误进行处理。通过对CommEvent 属性的判断可知当前的通信错误和事件,分别对每个CommEvent 值进行编程就完成了对各个错误和事件的处理。如:CommEvent = MSCOMM—EV—SEND 表示发送事件。这些信息可从VB 提供的常量文件CONSTANT. TXT中查出。 (2)属性 CommPort :设置通信控件与哪个串口相连接,设置并返回通信口号。 Setting :设置通信的信息格式,为字符型。顺序为:波特率、校验、数据位、停止位。 PortOpen :布尔型、开关通信口。 InputLen :从接收缓冲区读取字符个数。 Input ,Output :读取接收缓冲区或写入发送缓冲区字符。 以上五种属性对串口完成基本的设置和操作,下面的三种属性是描述如何利用VB 提供的事件驱动机制来实现通 信。 CommEvent :返回通信过程中产生的错误信息及事件,了解通信状况。

VB控件MSComm串口通讯实例教程

现有电子秤一台,使用串口与计算机进行通讯。编写VB程序来访问串口,达到读取电子秤上显示的数据。该电子秤为BE01型仪表,输出为RS-232C标准接口,波特率为300-9600、偶校验、7个数据位、2个停止位。所有字符 现有电子秤一台,使用串口与计算机进行通讯。编写VB程序来访问串口,达到读取电子秤上显示的数据。该电子秤为BE01型仪表,输出为RS-232C标准接口,波特率为300-9600、偶校验、7个数据位、2个停止位。所有字符均发送11位ASCII 码,一个起始位。在VB中与串口通讯需要引入控件MSComm串口通讯控件(在Microsoft Comm Control 6.0中)。具体程序如下:控件简称:MSC Dim Out(12) As Byte '接收var中的值 Dim var As Variant '接收MSC.input中的数值 Dim nRece As Integer '计算MSC.inputbuffer的个数 Dim i As Integer, j As Integer '随即变量,计算循环 ************************************************************************** ** Private Sub Form_Load() ClearText With MSC .CommPort = 1 '设置Com1为通信端口 .Settings = "9600,E,7,2" '设置通信端口参数 9600赫兹、偶校验、7个数据位、2个停止位.(这里需要进一步说明的是:.Setting=”BBBB,P,D,S”。 含义是:B:Baud Rate(波特率);P:Parity(奇偶);D:Data Bit;S:Stop Bit) .InBufferSize = 40 '设置缓冲区接收数据为40字节 .InputLen = 1 '设置Input一次从接收缓冲读取字节数为1

VB上位机串口通讯

'初始化代码 Private Sub Form_Load() '窗体被加载时产生 If MSComm1.PortOpen = True Then '串口查看是否打开,打开则关闭MsgBox "端口已经打开", 2 'MSComm1.PortOpen = False End If With MSComm1 .CommPort = 3 '设置串口3 .Settings = "9600,n,8,1" .InputLen = 0 '读取接收缓冲区所有字符 .InBufferSize = 1024 '设置接收缓冲区1024字节 .OutBufferSize = 512 '设置发送缓冲区512字节 .InputMode = comInputModeText. '采用文本传输 '.PortOpen = True '打开串口 .SThreshold = 0 '一发送数据就触发OnComm事件 .RThreshold = 1 '接收到一个字节就触发OnComm事件 .InBufferCount = 0 '清除发送缓冲区数据 .OutBufferCount = 0 '清除接收缓冲区数据 End With Text_send.Text = "" Text_recv.Text = "" Text_send_16.Text = "" End Sub '清空对话框数据 Sub Command3_Click(Index As Integer) Text_send.Text = "" Text_recv.Text = ""

Text_send_16.Text = "" End Sub '通讯端口选择 Private Sub Combo1_Click() If Combo1.Text = "com1" Then '通讯端口号设置 https://www.wendangku.net/doc/102853969.html,mPort = 1 'Text1 = 1 ElseIf Combo1.Text = "com2" Then https://www.wendangku.net/doc/102853969.html,mPort = 2 'Text1 = 2 ElseIf Combo1.Text = "com3" Then https://www.wendangku.net/doc/102853969.html,mPort = 3 'Text1 = 3 ElseIf Combo1.Text = "com4" Then https://www.wendangku.net/doc/102853969.html,mPort = 4 'Text1 = 4 Else https://www.wendangku.net/doc/102853969.html,mPort = 5 'Text1 = 5 End If End Sub Private Sub Combo2_Click() If Combo2.Text = "9600,e,8,1" Then MSComm1.Settings = "9600,e,8,1" ElseIf Combo2.Text = "9600,n,8,1" Then MSComm1.Settings = "9600,n,8,1" ElseIf Combo2.Text = "57600,n,8,1" Then MSComm1.Settings = "57600,n,8,1" End If End Sub '发送数据 Private Sub Command1_Click(Index As Integer) '判断是否选择了端口与通讯方式 If CBool(Combo1.Text = "请选择") Or CBool(Combo2.Text = "请选择") = 1 Then MsgBox "请设置端口号与通讯方式", 2 Exit Sub End If

VB_Net_串口通信程序

一 Imports System.IO.Ports Imports System.Text Public Class Form1 Dim RS232Com As New SerialPort Dim mPortName As String Public Sub OpenCOM() mPortName = Me.CmbCom.SelectedItem.ToString RS232Com = New SerialPort(mPortName, 9600, Parity.None, 8, StopBits.One) RS232Com.Encoding = Encoding.ASCII If Not RS232Com.IsOpen Then RS232Com.Open() End Sub Public Sub CloseCOM() If RS232Com.IsOpen Then RS232Com.Close() End Sub Private Sub BtnOpen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnOpen.Click Call OpenCOM() End Sub Private Sub BtnClose_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnClose.Click Call CloseCOM() End Sub 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 Me.CmbCom.Items.Add(sp) Next Me.CmbCom.SelectedIndex = 0 End Sub Private Sub BtnSend_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BtnSend.Click RS232Com.Write(Me.TextBox1.Text) '即写命令过去 End Sub

arduino与上位机VB串口通信

用pc控制LED灯 注意红色的LED灯,熄灭的

亮了,程序界面,注意要开启串口才能控制

注意,我的arduino板子占用com3,所以mscomm也要用3口,不要弄错了,这里走过弯路,隔天才发现的,(彩色小点PS加上的,方便 理解)。 下面是源码,方便复制:

-------------------------------------------------------- 'vb写的上位机程序 Private Sub Command1_Click() Comm3.PortOpen=True End Sub Private Sub Command2_Click() Comm3.PortOpen=False End Sub Private Sub Command3_Click() Comm3.Output="a"'用a表示开灯 End Sub Private Sub Command4_Click() Comm3.Output="b"'用b表示灭灯 End Sub ----------------------------------------- //arduino程序 //通过电脑开关LED灯(LED灯负极连在arduino uno r3板数字3口,正极串一个1K 电阻后连板子5V电源正极

// int led1=3;//把LED连在Arduino数字端口3 //初始化 void setup() { Serial.begin(9600);//启动串行通讯,波特率为9600b/s pinMode(led1,OUTPUT); digitalWrite(led1,HIGH);//熄灭LED灯 } //主程序 void loop() { char val;//定义变量val,用于暂存上位机发送来的字符 if(Serial.available()>0)//如果上位机发送来了字符 { val=Serial.read();//读取上位机发来的字符,并保存到val Serial.println(val);//显示接受到的字符 if(val=='a')//如果上位机发送字符'a', { digitalWrite(led1,LOW);//点亮LED灯}

VB串口数据接收方式

1、在OnComm 事件中接收数据: 这种方式能充分MSCOMM控件的特性。OnComm 事件还可以检查和处理通讯错误;可以通过检查CommEvent 属性的值来查询事件和错误;对于不定长数据以及对数据进行处理比较复杂的情况,此法不是很方便。 Private Sub MSComm_OnComm () Select Case https://www.wendangku.net/doc/102853969.html,mEvent ' 错误 Case comEventBreak ' 收到Break。 Case comEventCDTO ' CD (RLSD) 超时。 Case comEventCTSTO ' CTS Timeout。 Case comEventDSRTO ' DSR Timeout。 Case comEventFrame ' Framing Error Case comEventOverrun '数据丢失。 Case comEventRxOver'接收缓冲区溢出。 Case comEventRxParity' Parity 错误。 Case comEventTxFull '传输缓冲区已满。 Case comEventDCB '获取DCB] 时意外错误 ' 事件 Case comEvCD ' CD 线状态变化。 Case comEvCTS ' CTS 线状态变化。 Case comEvDSR ' DSR 线状态变化。 Case comEvRing ' Ring Indicator 变化。 Case comEvReceive ' 收到RThreshold # of chars. Case comEvSend ' 传输缓冲区有Sthreshold 个字符' Case comEvEof ' 输入数据流中发现EOF 字符 End Select End Sub 2.轮循法采集数据: A、定时器轮循法 对于数据包方式收发数据以及不需即时响应情况,用轮循法更好些。实际上轮循法最大的好处在于集中处理数据而且不太占用CPU。轮循法要注意定时采集的时间片段大小;这里用二进制收发模式;使属性RThreshold、SThreshold为0,屏蔽ONCOMM事件。 InputMode = comInputModeBinary RThreshold = 0 SThreshold = 0 Private Sub TmrComm_Timer() '采用轮循法采集数据

相关文档