串口通信控件

串口通信控件
串口通信控件

附录A 串行通信控件MSComm

在Visual Studio(https://www.360docs.net/doc/19125075.html,、VC++.NET、C#.NET)中编写串口通讯程序,一般都使用Microsoft Communication Control(简称MSComm)的通讯控件,只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。但在Microsoft .NET技术广泛应用的今天,Visual Studio没有将此控件加入控件库,所以人们采用了3种方法在Visual Studio 中编写串口通讯程序:第一种方法是通过采用原来的MSComm控件,这是最简单的,最方便的方法,但需要注册(可以通过安装VB6.0或VC++6.0来实现);第二种方法是采用微软在.NET中推出的一个串口控件SerialPort,方便地实现所需要串口通讯的多种功能;第三种方法是用API函数进行串口通信,虽然难度高,但可以方便实现自己想要的各种功能。一、MScomm控件的使用

MSComm控件全称为Microsoft Communications Control,是Microsoft公司提供的简化Windows下串行通信编程的ActiveX控件,它既可以用来提供简单的串行端口通信功能,也可以用来创建功能完备的、事件驱动的高级通信工具。

MSComm控件在串口编程时非常方便,程序员不必花时间去了解较为复杂的API函数,而且在https://www.360docs.net/doc/19125075.html,、VC++.NET、C#.NET等语言中均可使用。使用它可以建立与串行端口的连接,通过串行端口连接到其它通信设备(例如调制解调器),发出命令,交换数据,以及监视和响应串行连接中发生的事件和错误。利用它可以进行诸如拨打电话、监视串行端口的输入数据乃至创建功能完备的终端程序等。

1.MSComm控件处理通信的方式

MSComm控件通过串行端口传输和接收数据,为应用程序提供串行通信功能。

它提供下列两种处理通信的方式:

1)事件驱动方式

该方式相当于一般程序设计中的中断方式。当串口发生事件或错误时,MSComm 控件会产生OnComm 事件,用户程序可以捕获该事件进行相应处理。它是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时程序会希望得到通知,例如,在串口接收缓冲区中有一个字符到达或一个变化发生时,程序都可以利用MSComm 控件的OnComm 事件捕获并处理这些通信事件;OnComm 事件还可以检查和处理通信错误。在程序的每个关键功能之后,可以通过检查CommEvent 属性的值来查询事件和错误。

在程序设计中,可以在OnComm 事件处理函数中加入自己的处理代码,一旦事件发生即可自动执行该段程序。这种方法的优点是程序响应及时,可靠性高。

2)查询方式

在程序的每个关键功能之后,在用户程序中设计定时或不定时的查询,通过检查CommEvent 属性的值来查询事件和错误,从而作出相应的处理。在进行简单应用程序设计时可采用这种方法。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的“OK”响应。

查询方式的进行可用计时器Timer 或Do…Loop 程序实现。查询方式实质上还是事件驱动,但在有些情况下,这种方式显得更为便捷。

2.MSComm 控件的引用

开始一个项目的设计时,https://www.360docs.net/doc/19125075.html, 、VC++.NET 、C#.NET 的工具箱中会有许多默认的控件让设计者选用,这些原本就出现在工具箱中的控件是内置控件,它提供了一些基本的系统设计组件给设计者,不过,功能比较特别的控件就不会出现在其中,而用来设计通信功能的控件MSComm 就不在其中。

由于https://www.360docs.net/doc/19125075.html, 、VC++.NET 、C#.NET 的串行通信组件MSComm 并不会主动出现在工具箱里中,当我们需要MSComm 控件时,首先要把它加入到工具箱中。

让MSComm 控件出现在工具箱中的步骤如下:

执行“工具”菜单下的“选择工具箱…”子菜单,在弹出的对话框中,选择“COM 组件”选项卡,选中“Microsoft Communication Control version 6.0”复选框,如图A-1所示,单击“确定”按钮后,在工具箱“组件”栏中就出现了一个形似“电话”的图标,它就是MSComm 控件,如图A-2所示。

工具箱中有了MSComm 控件,就可以选择

MSComm 控件的图标后将其加到程序窗体上,利用

该控件PC 机就可以通过https://www.360docs.net/doc/19125075.html, 、VC++.NET 、

C#.NET 实现与串口设备的串口通信了。

如果打开的是以前的项目,项目中含有

MSComm 控件的引用记录,则项目会自动去搜寻

MSComm 控件,并将它载入,不需要以上的步骤。

每个使用的MSComm 控件对应着一个串行端

口,如果应用程序需要访问多个串行端口,必须使

用多个MSComm 控件。

图A-1 添加MSComm 控件

图A-2 工具箱中的MSComm 控件

3.MSComm 控件的常用属性

MSComm控件的属性很多,这里介绍串口编程中经常用到的几个重要属性。

1)CommPort属性

语法:https://www.360docs.net/doc/19125075.html,mPort[=Value]

作用:设置或返回通信端口号。

CommPort 属性值value可以设置为1 到16 之间的任何整数值(缺省值为1)表示串口COM1,COM2...。如果用PortOpen属性打开一个并不存在的端口,MSComm控件会产生错误68(设备无效)。

注意:必须在打开端口之前设置CommPort 属性。

例如:COM2 上连接有一个调制解调器:https://www.360docs.net/doc/19125075.html,mPort = 2

2)Input属性

语法:MSComm1.Input

作用:返回并删除接收缓冲区中的数据流。

InputLen属性确定被Input属性读取的字符数。设置InputLen为0,则Input属性读取缓冲区中全部的内容。

例如:如果希望从接收缓冲区获取数据,并将其显示在一个文本框中,可以使用下面的代码:TxtDisplay.Text = MSComm1.Input

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

3)InputLen 属性

语法:MSComm1.InputLen [= value]

作用:设置并返回Input 属性从接收缓冲区读取的字符数。

Value是整型表达式,说明Input 属性从接收缓冲区中读取的字符数。

说明:InputLen 属性的缺省值是0。设置InputLen 为0 时,使用Input 将使MSComm 控件读取接收缓冲区中全部的内容。若接收缓冲区中InputLen 字符无效,Input 属性返回一个零长度字符串("")。在使用Input 前,用户可以选择检查InBufferCount 属性来确定缓冲区中是否已有需要数目的字符。该属性在从输出格式为定长数据的机器读取数据时非常有用。如果读取以定长的数据块的形式格式化了的数据时,则需要将该属性设置为合适的值。

例如:MSComm1.InputLen=10 ' 当程序执行该指令时,只会读取10个字符。

4)InputMode属性

语法:MSComm1.InputMode[=Value]

作用:设置或返回接收数据的数据类型。

InputMode 属性的Value值可以设置为如下常数:

0- 通过Input 属性以文本方式取回传入的数据。

1- 通过Input 属性以二进制方式取回传入的数据。

例如:MSComm1.InputMode=1表示以二进制方式读取数据。

5)OutPut属性

语法:MSComm1.OutPut[=Value]

作用:向传输缓冲区写数据流。

Output属性可以传输文本数据或二进制数据。用Output属性传输文本数据,必须定义一个包含一个字符串的Variant;发送二进制数据,必须传递一个包含字节数组的Variant到Output属性。

正常情况下,如果发送一个ANSI字符串到应用程序,可以以文本数据的形式发送;如果发送包含嵌入控制字符、Null字符等数据,要以二进制形式发送。

可用Output 属性发送命令、文字字符串或Byte 数组数据。

例如:MSComm1.Output = "ATDT 551-5555" ' 发送AT 命令串

MSComm1.Output = " This is a text string " ' 发送文本字符串该属性在设计时无效,在运行时为只读。

6)PortOpen属性

语法:MSComm1.PortOpen[=Value]

作用:设置或返回通信端口的状态。

设置PortOpen属性为True即打开端口,设置为False则关闭端口,并清除接收和传输缓冲区。当应用程序终止时,MSComm控件自动关闭串行端口。

在打开端口之前,确定CommPort属性设置为一个合法的端口。如果CommPort属性设置为一个非法的端口,则当打开该端口时,MSComm控件产生错误68(设备无效)。

串行端口设备必须支持Settings属性当前的设置值。如果Settings属性包含硬件不支持的通信设置值,硬件可能不会正常工作。

7)Settings属性

语法:MSComm1.Settings[=Value]

作用:设置并返回通信参数。

值Value为String型,说明通信端口的设置值。

Settings属性可以用来指定波特率、奇偶校验、数据位数和停止位数。奇偶校验设置为了进行数据校验,通常是不用的,并设置为“N”。数据位数指定了代表一个数据块的比特数。停止位指出了何时接收到一个完整数据块。

例如:MSComm1.Settings = "9600,N,8,1" ' 表示传输速率为9600bps,没有奇偶校验位,8位数据位,1位停止位。

注:1)起始位:在通信线上,没有数据传送时处于逻辑“1”状态。当发送设备要发送一个字符数据时,首先发出一个逻辑“0”信号,这个逻辑低电平就是起始位。起始位通过通信线传向接收设备,当接收设备检测到这个逻辑低电平后,就开始准备接收数据位信号。因此,起始位所起的作用就是表示字符传送的开始。

2)数据位:当接收设备收到起始位后,紧接着就会收到数据位,数据位的个数可以是5、6、7或8位数据。在字符数据传送的过程中,数据位从最低有效位开始传送。

3)奇偶校验位:数据位发送完之后,就可以发送奇偶校验位。奇偶校验用于有限差错检验,通信双方在通信时约定一致的奇偶校验方式。就数据传送而言,奇偶校验位是冗余位,但它表示数据的一种性质,这种性质用于检错,虽然有限但很容易实现。

4)停止位:在奇偶校验位或者数据位(无奇偶校验位时)之后是停止位。它可以是1位、1.5位或2位,停止位是一个字符数据的结束标志。

8)RThreshold 属性

语法:object.Rthreshold [= value ]

作用:OnComm事件发生之前,设置并返回接收缓冲区可接收的字符数。

Value是整型表达式,说明在产生OnComm 事件之前要接收的字符数。

当接收字符后,若Rthreshold 属性设置为0(缺省值)则不产生OnComm 事件;设置Rthreshold为1,接收缓冲区每收到一个字符都会使MSComm 控件触发OnComm 事件。

9)SThreshold 属性

语法:object.SThreshold [= value ]

作用:OnComm事件发生之前,设置并返回发送缓冲区中允许的最小字符数。

Value是整形表达式,代表在OnComm 事件产生之前在传输缓冲区中的最小字符数。

若设置SThreshold 属性为0(缺省值),数据传输事件不会产生OnComm 事件;若设置Sthreshold 属性为1,当传输缓冲区完全空时,MSComm 控件产生OnComm 事件。如果在传输缓冲区中的字符数小于value,CommEvent 属性设置为comEvSend,并产生OnComm 事件。

OnComm 事件被用来监视和响应通信状态的变化。如果将Rthreshold和SThreshold属性的值都设置为零,就可以避免发生OnComm 事件。如果将该值设置为非零的值(比如1),那么每当缓冲区中接收到一个字符时,就会产生OnComm 事件。

10)DTREnable属性

语法:object. DTREnable [= value ]

作用:确定在通信时是否使DTR线有效。

DTR是计算机发送到调制解调器的信号,指示计算机在等待接收传输。当DTREnable 设置为True,当打开端口时,DTR线设置为高电平(开),当端口被关闭时,DTR线设置为低电平(关);当DTREnable设置为False,DTR线始终保持为低电平。

11)RTSEnable属性

语法:object. RTSEnable [= value ]

作用:确定是否使RTS线有效。

通常由计算机发送RTS信号到调制解调器,以请求允许发送数据。当RTSEnable设置为True,且端口打开时,RTS线设置为高电平,端口关闭时,RTS线设置为低电平。当RTSEnable设置为False,RTS线始终保持为低电平。

12)OutBufferSize属性

语法:MSComm1.OutBufferSize[=Value]

作用:设置或返回传输缓冲区大小。

值Value为Integer型,表示传输缓冲区的字节数,例如可选1024。

13)InBufferSize属性

语法:MSComm1.InBufferSize[=Value]

作用:设置或返回接收缓冲区大小。

值Value 为Integer型,表示接收缓冲区的字节数,例如可选1024。

InBufferSize 和OutBufferSize 属性指定了为接收和发送缓冲区分配的内存数量。这两个值设置得越大,应用程序中可用的内存就越少。然而,如果缓冲区太小,就要冒缓冲区溢出的风险,除非采用握手信号。

由于现在大多数微机有更多的可用内存资源,缓冲区内存分配已不那么至关紧要了。换言之,可以把缓冲区的值设得高一些而不影响应用程序的性能。

14)Handshaking属性

语法:MSComm1.Handshaking[=Value]

作用:设置或返回硬件握手协议。指的是PC机与MODEM之间为了控制流速而约定的内部协议。Value值:

0- comNone没有握手协议。不考虑流量控制。

1- comXOn/XOff,即在数据流中嵌入控制符来进行流量控制。

1- comRTS,即由信号线RTS自动进行流量控制。

1- comRTSXOnXOff,两者皆可。

注:实践中我们发现选用2(即comRTS)是很方便的。

说明:要保证数据传输成功,必须对接收和发送缓冲区进行管理,例如,要保证接收数据的速度不超出缓冲区的限制。握手是指一种内部的通信协议,通过它将数据从硬件端口传输到接收缓冲区。当串行端口收到一个字符时,通信设备必须将它移入接收缓冲区中,使程序能够读到它。如果数据到达端口的速度太快,通信设备可能来不及将数据移入接收缓冲区,握手协议保证不会由于缓冲区溢出而导致丢失数据。

需要使用什么协议与连接的设备有关。如果将该值设置为comRTSXOnXOff,可以同时支持两种协议。

4.MSComm 控件的OnComm事件

根据应用程序的用途和功能,在连接到其它设备过程中,以及接收或发送数据过程中,可能需要监视并响应一些事件和错误。

可以使用OnComm 事件和commEvent 属性捕捉并检查通信事件和错误的值。

commEvent 属性返回最近的通信事件或错误,该属性在设计时无效,在运行时为只读。

在发生通信事件或错误时,将触发OnComm 事件,CommEvent 属性的值将被改变。因此,在发生OnComm 事件的时候,如果有必要,可以检查CommEvent 属性的值。由于通信(特别是通过电话线的通信)是不可预料的,捕捉这些事件和错误将有助于使应用程序对这些情况作出相应的反应。

MSComm控件把十七个事件归并为一个事件OnComm,用属性CommEvent的十七个值来区分不同的触发时机。

表A-1列出了几个可能触发OnComm 事件的通信事件,对应的值将在发生事件时被写入CommEvent 属性。

另外十个情况是可能发生的各种通信错误时触发,可参看有关资料。

通过事件的引发,借由CommEvent属性值的数值便可明确了解所发生的错误或事件,而程序中通常就以常数定义作为判断,一旦OnComm事件发生,连带地会引入CommEvent 参数,用户可以在每一个相关的Case语句之后编写程序代码来处理特定的错误或事件。

5.MSComm控件通信步骤

通常我们以下面的步骤来使用MSComm控件作通信控制:

1)加入通信部件,也就是MSComm对象;

2)设置通信端口号码,即CommPort属性;

3)设置通信协议,即HandShaking属性;

4)设置传输速度等参数,即Settings属性;

5)设置其它参数,若必要时再加上其它的属性设置;

6)打开通信端口,即PortOpen属性设成True;

7)送出字符串或读入字符串,使用Input及Output属性;

8)使用完MSComm通信对象后,将通信端口关闭。即PortOpen属性设成False。

遵循以上的步骤,可以建构自己的串行通信传输系统了。

附录B 串行通信控件SerialPort

在Visual Studio (https://www.360docs.net/doc/19125075.html, 、VC++.NET 、C#.NET )平台下熟练使用SerialPort 控件,可以很好地开发出串口通讯类程序,对于过去使用MSComm 控件设计了一些通讯程序,也可以将MSComm 控件替换为SerialPort 控件,当然为了避免对以前的项目做大的改动,可以使用SerialPort 控件设计一些与MSComm 控件具有相同接口的类,在今后工业控制中,SerialPort 控件将广泛地应用于串口通讯程序的设计中,发挥着与MSComm 控件一样的作用。 SerialPort 控件位于工具箱组件栏内,如图B-1所示。使用时将其添加到窗体上。

1.SerialPort 控件的常用属性

1)BaseStream :获取 SerialPort 对象的基础 Stream 对象。

2)BaudRate :获取或设置串行波特率。

3)BreakState :获取或设置中断信号状态。

4)BytesToRead :获取接收缓冲区中数据的字节数。

5)BytesToWrite :获取发送缓冲区中数据的字节数。

6)CanRaiseEvents :获取一个指示组件是否可以引发

事件的值(从 Component 继承)。

7)CDHolding :获取端口的载波检测行的状态。

8)Container :获取 IContainer ,它包含 Component 。

9)CtsHolding :获取“可以发送”行的状态。

10)DataBits :获取或设置每个字节的标准数据位长

度。

11)DesignMode :获取一个值,用以指示 Component

当前是否处于设计模式(从 Component 继承)。

12)DiscardNull :获取或设置一个值,该值指示 Null

字节在端口和接收缓冲区之间传输时是否被忽略。

13)DsrHolding :获取数据设置就绪 (DSR) 信号的状

态。

14)DtrEnable :获取或设置一个值,该值在串行通信

过程中启用数据终端就绪 (DTR) 信号。

15)Encoding :获取或设置传输前后文本转换的字节编码。

16)Events :获取附加到此 Component 的事件处理程序的列表(从 Component 继承)。

17)GenerateMember : 是否生成当前控件的类变量, 为 Boolean 型变量。

18)Handshake :获取或设置串行端口数据传输的握手协议。其枚举值为 None 、XOnXOff 、RequestToSend 、RequestToSendXOnXOff 。

19)IsOpen :获取一个值,该值指示 SerialPort 对象的打开或关闭状态。

20)Modifiers : 继承属性控制, 其枚举值为 Public 、Protected 、Protected Friend 、Friend 、 Private

21)NewLine :获取或设置用于解释 ReadLine 和 WriteLine 方法调用结束的值。 图B-1 工具箱中的SerialPort 控件

22)Parity:获取或设置奇偶校验检查协议。其枚举值为None、Odd、Even、Mark、Space。

23)ParityReplace:获取或设置一个字节,该字节在发生奇偶校验错误时替换数据流中的无效字节。其值为字符的ASCII码。

24)PortName:获取或设置通信端口,包括但不限于所有可用的COM 端口。对应MScomm控件中的CommPort。

25)Read:从缓冲区读数据。对应MScomm控件中的Input。

26)ReadBufferSize:获取或设置SerialPort 输入缓冲区的大小。对应MScomm控件中的InBufferCount。

27)ReadTimeout:获取或设置读取操作未完成时发生超时之前的毫秒数。

28)ceivedBytesThreshold:获取或设置DataReceived 事件发生前内部输入缓冲区中的字节数。接收缓冲区中接收到一个字符,就产生一次DataReceived事件。

29)RtsEnable:获取或设置一个值,该值指示在串行通信中是否启用请求发送(RTS) 信号。为Boolean型变量。

30)Site :获取或设置Component 的ISite。

31)StopBits:获取或设置每个字节的标准停止位数。

32)Write:向缓冲区写数据。对应MScomm控件中的Output。

33)WriteBufferSize:获取或设置串行端口输出缓冲区的大小。对应MScomm控件中的OutBufferCount。

34)WriteTimeout:获取或设置写入操作未完成时发生超时之前的毫秒数

2.SerialPort控件的方法

1)Close:关闭端口连接,将IsOpen 属性设置为false,并释放内部Stream 对象。

2)CreateObjRef:创建一个对象,该对象包含生成用于与远程对象进行通信的代理所需的全部相关信息(从MarshalByRefObject 继承)。

3)DiscardInBuffer:丢弃来自串行驱动程序的接收缓冲区的数据。

4)DiscardOutBuffer:丢弃来自串行驱动程序的传输缓冲区的数据。

5)Dispose:释放SerialPort 对象使用的非托管资源。

6)Equals:确定两个Object 实例是否相等(从Object 继承)。

7)Finalize:在通过垃圾回收将Component 回收之前,释放非托管资源并执行其他清理操作(从Component 继承)。

8)GetHashCode:用作特定类型的哈希函数。GetHashCode 适合在哈希算法和数据结构(如哈希表)中使用(从Object 继承)。

9)GetLifetimeService:检索控制此实例的生存期策略的当前生存期服务对象(从MarshalByRefObject 继承)。

10)GetPortNames:获取当前计算机的串行端口名称数组。

11)GetService:返回一个对象,该对象表示由Component 或它的Container 提供的服务(从10)GetType:获取当前实例的Type(从Object 继承)。

12)InitializeLifetimeService:获取控制此实例的生存期策略的生存期服务对象(从MarshalByRefObject 继承)。

13)Open:打开一个新的串行端口连接。

14)Read:从SerialPort 输入缓冲区中读取。

15)ReadByte:从SerialPort 输入缓冲区中同步读取一个字节。

16)ReadChar:从SerialPort 输入缓冲区中同步读取一个字符。

17)ReadExisting:在编码的基础上,读取SerialPort 对象的流和输入缓冲区中所有立即可用的字节。

18)ReadLine:一直读取到输入缓冲区中的NewLine 值。

19)ReadTo:一直读取到输入缓冲区中的指定value 的字符串。

20)ReferenceEquals:确定指定的Object 实例是否是相同的实例(从Object 继承)。

21)ToString:返回包含Component 的名称的String(如果有)。不应重写此方法(从Component 继承)。

22)Write:将数据写入串行端口输出缓冲区。

23)WriteLine:将指定的字符串和NewLine 值写入输出缓冲区(Component 继承)。

3.SerialPort控件的事件

1)DataReceived事件

表示将处理SerialPort 对象的数据接收事件的方法。

SerialPort控件中的DataReceived事件对应Mscomm控件中的OnComm 事件,可以在此事件中对数据进行处理,是Serialport 最主要的事件。

DataReceived事件在接收到了[ReceivedBytesThreshold]设置的字符个数或接收到了文件结束字符并将其放入了输入缓冲区时被触发。其中[ReceivedBytesThreshold]相当于MSComm 控件的[Rthreshold]属性,该事件的用法与MsComm控件的OnComm事件在CommEvent为comEvSend和comEvEof时是一致的。

数据接收的设计方法比较重要,采用轮询的方法比较浪费时间,采用延时方法一般会调用API并用DOEvents方法来处理,但程序不易控制,建议采用DataReceived事件触发的方法,合理的设置ReceivedBytesThreshold的值,若接收的是定长的数据,则将ReceivedBytesThreshold设为接收数据的长度,若接收数据的结尾是固定的字符或字符串则可采用ReadTo的方法或在DataReceived事件中判断接收的字符是否满足条件。

2)Disposed事件

添加事件处理程序以侦听组件上的Disposed 事件(从Component 继承)。

3)ErrorReceived 事件

表示处理SerialPort 对象的错误事件的方法。

4)PinChanged 事件

表示将处理SerialPort 对象的串行管脚更改事件的方法。

4.SerialPort控件的使用流程

在使用SerialPort控件进行串口通讯时,一般的流程是设置通讯端口号及波特率、数据位、停止位和校验位,再打开端口连接、发送数据、接收数据,最后关闭端口连接这样几个步骤。

5.SerialPort控件的代码例程

1)串口配置代码

Sub PortStart()

SerialPort1.PortName = COMX ' 计算机串口设置,X是串口号。

SerialPort1.BaudRate = 9600 …波特率设置

SerialPort1.DataBits = 8 '数据位设置

SerialPort1.StopBits = StopBits.One '停止位设置

SerialPort1.Encoding = Encoding.UTF8

SerialPort1.DtrEnable = True

SerialPort1.ReadTimeout = 500 '超时时间

SerialPort1.NewLine = vbCrLf '行结束符合

End Sub

串口通讯最常用的参数就是通讯端口号及通讯格式(波特率、数据位、停止位和校验位),在MSComm中相关的属性是CommPort和Settings。SerialPort控件与MSComm有一些区别: (1)通讯端口号。[PortName]属性获取或设置通信端口,包括但不限于所有可用的COM 端口,请注意该属性返回类型为String,不是https://www.360docs.net/doc/19125075.html,mPort的short类型。通常情况下,PortName正常返回的值为COM1、COM2……,SerialPort类最大支持的端口数突破了CommPort控件中CommPort属性不能超过16的限止,大大方便了用户串口设备的配置。

(b)通讯格式。SerialPort控件分别用[BaudRate]、[Parity]、[DataBits]、[StopBits]属性设置通讯格式中的波特率、数据位、停止位和校验位,其中[Parity]和[StopBits]分别是枚举类型Parity、StopBits,Parity类型中枚举了Odd(奇)、Even(偶)、Mark、None、Space,StopBits 枚举了None、One、OnePointFive、Two。

2)串口打开代码

Sub PortOpen()

Try

SerialPort1.Open()

Call PortStart()

Catch ex As UnauthorizedAccessException

MsgBox("串口被占用或串口错误!", https://www.360docs.net/doc/19125075.html,rmation, "提示!")

End Try

End Sub

3)串口关闭代码

Sub PortOpen()

Try

SerialPort1.Close()

Catch ex As Exception

MsgBox("串口未打开或串口异常!", https://www.360docs.net/doc/19125075.html,rmation, "提示!") End Try

End Sub

SerialPort控件是调用类的Open()和Close()方法打开和关闭串口。

4)串口读取数据代码

Sub ComRec()

Dim Rxstr As String

Try

Rxstr = SerialPort1.ReadLine ?读取一个新行

Application.DoEvents()

ComTxT.AppendText(Rxstr) …读取到的数据添加到文本框中显示Catch e As TimeoutException ?当超时以后,读取串口所有的数据

Rxstr = SerialPort1.ReadExisting

ComTxT.AppendText(Rxstr)

Application.DoEvents()

End Try

End Sub

5)发送数据代码

使用SerialPort.W rite,将数据写入串行端口输出缓冲区。

(1)SerialPort.Write (String)。将参数字符串写入输出缓冲区中。

(2)SerialPort.Write (Byte[], Int32, Int32)。将指定数量的字节写入输出缓冲区中的指定偏移量处。

(3)SerialPort.Write (Char[], Int32, Int32) 。将指定数量的字符写入输出缓冲区中的指定偏移量处。

SerialPort控件使用Write和WriteLine方法发送数据,其中WriteLine可发送字符串并在字符串末尾加入换行符,读取串口缓冲区的方法有许多,其中除了ReadExisting和ReadTo,其余的方法都是同步调用,线程被阻塞直到缓冲区有相应的数据或大于ReadTimeOut属性设定的时间值后,引发ReadExisting异常。

vb串口通信复习资料总结

串口基本概念与串口调试 1. 串口的定义:串口即串行接口的简称。CPU 与外设连接的接口电路称为I/O 口,串口是I/O 口的一种,采用串 行通信协议在一条信号线上将数据逐位传输的通信模式,所以又称“串行通信接口。 2. 数据传输方式:串行通信(同步&异步)、并行通信。 3. 同步通信:指在约定的通信速率下,发送端和接收端的时钟信号频率和相位始终保持一致,这就保证了通信双 方在发送和接收数据时具有完全一致的定时关系。 4. 异步通信: 5. 异步通信特点: a) 时钟要求不高,硬件成本低; b) 在不同传输系统中,通信格式设定可完全不同; c) 通信速率较慢; d) 依靠起始位和停止位可以到达同步; 6. 数据编码的方式:不归零编码(NRZ )、曼彻斯特编码、差分曼彻斯特编码。 7. 数据调制方式:幅移键控(ASK )、频移键控(FSK )、相移键控(PSK )。 8. 调幅方式: a) TTL 标准:+5v ——“1”,0v ——“0”(正逻辑); b) RS-232标准:-3V~-15V ——“1”,+3V~+15V ——“0”;(负逻辑); c) 20mA 电流环:存在20mA 电流为“1”,不存在为“0”; d) 60mA 电流环:存在60mA 电流为“1”,不存在为“0 ”; 9. 数据传送方式:单工、半双工、全双工。 10. 数据传送速率: a) 码元速率(R B )单位:波特/秒(baud/S )波特率;R B =log 2N (N 为编码级数); b) 信息速率(R b )单位:比特/秒(Bit/S )比特率;R b =log 22; R B /R b =log 2N /log 22=log 2N (计算机中编码级数为2,比特率等于波特率) c) 位时间(位周期):传送一个二进制位所需时间;T d =1波特/波特率 11. 发送时钟与接收时钟: a) 公式:F =n ×B b) F —发送时钟频率(Hz );B —数据传输的波特率(Baud/s );n —波特率因子(Baud -1); c) 发送/接收时钟周期:T c =1/F =T d /n ; 12. 串口接头类型:9针串口(DB-9)、25针串口(DB-25)13. 串口接线:接收接发送、发送接接收、信号地相连(25为7脚,9为5脚。) 14. 串行通信特点:接线少、成本低。 15. 串口连接线种类: a) 串口直连线;一公一母;发发/收收(延长) b) 串口交叉线;双公/双母;收发/发收(双机通信) 16. RS-232C : a) 全称:EIA-RS-232C (EIA :美国电子工业协会;RS :推荐标准) b) 全名:数据终端设备和数据通信设备之间串行二进制数据交换接口标准 c) 电气特性: i. RxD/TxD 上为1负0正; ii. RTS 、CTS 、DSR 、DTR 、DCD 上有效为正,无效为负 17. 串口调试的内容: a) 认识串口连接线和制作串口连接线; b) 采用相应串口调试工具软件对所使用的串口进行诊断。 18. 串口参数的设置:波特率、数据位、停止位和校验位。

c语言串口通信范例

一个c语言的串口通信程序范例 分类:技术笔记 标签: c语言 串口通信 通信程序 it 最近接触一个项目,用HL-C1C激光位移传感器+易控组态软件完成生产线高度跳变检测,好久没有接触c c#,一些资料,找来做个记录,也许大家用的着 #include #include #include #include #define COM232 0x2f8 #define COMINT 0x0b #define MaxBufLen 500 #define Port8259 0x20 #define EofInt 0x20 static int comportaddr; static char intvectnum; static unsigned char maskb; static unsigned char Buffer[MaxBufLen]; static int CharsInBuf,CircIn,CircOut; static void (interrupt far *OldAsyncInt)();

static void interrupt far AsyncInt(void); void Init_COM(int ComPortAddr, unsigned char IntVectNum, int Baud, unsigned char Data, unsigned char Stop, unsigned char Parity) { unsigned char High,Low; int f; comportaddr=ComPortAddr; intvectnum=IntVectNum; CharsInBuf=0;CircIn=0;CircOut=0; f=(Baud/100); f=1152/f; High=f/256; Low=f-High*256; outp(ComPortAddr+3,0x80); outp(ComPortAddr,Low); outp(ComPortAddr+1,High); Data=(Data-5)|((Stop-1)*4); if(Parity==2) Data=Data|0x18; else if(Parity==1) Data=Data|0x8; outp(ComPortAddr+3,Data); outp(ComPortAddr+4,0x0a);

串口通信测试方法

串口通信测试方法 LELE was finally revised on the morning of December 16, 2020

串口通信测试方法 1关于串口通信的一些知识: RS-232C是目前最常用的串行接口标准,用来实现计算机和计算机之间、计算机和外设之间的数据通信。 在PC机系统中都装有异步通信适配器,利用它可以实现异步串行通信。而且MCS-51单片机本身具有一个全双工的串行接口,因此只要配以电平转换的驱动电路、隔离电路就可以组成一个简单可行的通信接口。 由于MCS-51单片机的输入和输出电平为TTL电平,而PC机配置的是RS-232C 标准串行接口,二者电气规范不一致,因此要完成PC机与单片机的数据通信,必须进行电平转换。 注明:3)RS-232C上传送的数字量采用负逻辑,且与地对称 逻辑1:-3~-15V 逻辑0:+3~+15V 所以与单片机连接时常常需要加入电平转换芯片: 2实现串口通信的三个步骤: (1)硬件连接 51单片机有一个全双工的串行通讯口,所以单片机和计算机之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如计算机的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换。我们采用了三线制连接串口,也就是说和计算机的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 使用MAX232串口通信电路图(9孔串口接头) (2)串行通信程序设计 ①通信协议的使用 通信协议是通信设备在通信前的约定。单片机、计算机有了协议这种约定,通信双方才能明白对方的意图,以进行下一步动作。假定我们需要在PC机与单片机之间进行通信,在设计过程中,有如下约定: 0x31:PC机发送0x31,单片机回送0x01,表示选择本单片机; 0x**:PC机发送0x**,单片机回送0x**,表示选择单片机后发送数据通信正常; 在系统工作过程中,单片机接收到PC机数据信息后,便查找协议,完成相应的操作。 ②串行通信程序设计主要有微机发送接收程序和单片机发送接收程序,微机上的发送和接收程序主要采用计算机高级语言编写,如C语言,因为了能够在计算机端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里利用如下图标的一个免费计算机串口调试软件,故而这一块计算机通信的程序可不写!

VC++_串口上位机编程实例

VC++串口上位机简单例程(源码及详细步骤) (4.33MB) VC++编写简单串口上位机程序 2010年4月13日10:23:40 串口通信,MCU跟PC通信经常用到的一种通信方式,做界面、写上位机程序的编程语言、编译环境等不少,VB、C#、LABVIEW等等,我会的语言很少,C语言用得比较多,但是还没有找到如何用C语言来写串口通信上位机程序的资料,在图书管理找到了用VC++编写串口上位机的资料,参考书籍,用自己相当蹩脚的C++写出了一个简单的串口上位机程序,分享一下,体验一下单片机和PC通信的乐趣。 编译环境:VC++6.0 操作系统:VMWare虚拟出来的Windows XP 程序实现功能: 1、PC初始化COM1口,使用n81方式,波特率57600与单片机通信。PC的COM口编号可以通过如下方式修改: 当然也可以通过上位机软件编写,通过按钮来选择COM端口号,但是此次仅仅是简单的例程,就没有弄那么复杂了。COM1口可用的话,会提示串口初始化完毕。否则会提示串口已经打开Port already open,表示串口已经打开,被占用了。 2、点击开始转换,串口会向单片机发送0xaa,单片机串口中断接收到0xaa后启动ADC转

换一次,并把转换结果ADCL、ADCH共两个字节的结果发送至PC,PC进行数值转换后在窗口里显示。(见文章末尾图) 3、为防止串口被一只占用,点击关闭串口可以关闭COM1,供其它程序使用,点击后按钮变为打开串口,点击可重新打开COM1。 程序的编写: 1、打开VC++6.0建立基于对话框的MFC应用程序Test,

2、在项目中插入MSComm控件:工程->增加到工程->Components and Controls->双击Registered ActiveX Controls->选择Microsoft Communications Control,version6.0->Insert,按

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.360docs.net/doc/19125075.html,mPort = Combo1.ListIndex + 1 MSComm1.Settings = "9600,n,8,1"

VC与c51串口通讯程序

跟着步骤学习 1.建立项目:打开VC++6.0,建立一个基于对话框的MFC应用程序SCommTest 2.在项目中插入MSComm控件选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项(稍等一会,这个过程较慢),则所有注册过的ActiveX控件出现在列表框中。选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。(如果你在控件列表中看不到Microsoft Communications Control, version 6.0,那可能是你在安装VC6时没有把ActiveX一项选上,重新安装VC6,选上ActiveX就可以了), 这时在ClassView视窗中就可以看到CMSComm类了,(注意:此类在ClassWizard中看不到,重构clw 文件也一样),并且在控件工具栏Controls中出现了电话图标(如图1所示),现在要做的是用鼠标 将此图标拖到对话框中,程序运行后,这个图标是看不到的。 3.利用ClassWizard定义CMSComm类控制对象打开ClassWizard ->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_MSCOMM1 添加控制变量:m_ctrlComm,这时你可以看一看,在对话框头文件中自动 加入了//{{AFX_INCLUDES() #include "mscomm.h" //}}AFX_INCLUDES (这时运行程序,如果有错,那就再从头开始)。 4.在对话框中添加控件向主对话框中添加两个编辑框,一个用于接收显 示数据ID为IDC_EDIT_RXDATA,另一个用于输入发送数据,ID为 IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内 容发送一次,将其ID设为IDC_BUTTON_MANUALSEND。别忘记了将接收编辑 框的Properties->Styles中把Miltiline和Vertical Scroll属性选上,发送编辑框若你想输入多行文字,也可选上Miltiline。 再打开ClassWizard->Member Viariables选项卡,选择CSCommTestDlg类,为IDC_EDIT_RXDATA 添加CString变量m_strRXData,为IDC_EDIT_TXDATA添加CString变量m_strTXData。说明: m_strRXData和m_strTXData分别用来放入接收和发送的字符数据。 5.添加串口事件消息处理函数OnComm()打开ClassWizard->Message Maps,选择类CSCommTestDlg,选择IDC_MSCOMM1,双击消息OnComm,将弹出的对话框中将函数名改为OnComm,(好记而已)OK。 这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在OnComm()函数加入相应的处理代码就能实现自已想要的功能了。请你在函数中加入如下代码: void CSCommTestDlg::OnComm() { // TODO: Add your control notification handler code here VARIANT variant_inp; COleSafeArray safearray_inp; LONG len,k; BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed. CString strtemp; if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符 { ////////以下你可以根据自己的通信协议加入处理代码 variant_inp=m_ctrlComm.GetInput(); //读缓冲区 safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量 len=safearray_inp.GetOneDimSize(); //得到有效数据长度 for(k=0;k

RS232串口通信实验报告

RS232串口通信实验报告 学院:电子信息学院 班级:08031102 姓名:张泽宇康启萌余建军 学号:2011301966 2011301950 2011301961 时间:2014年11月13日 学校:西北工业大学

一.实验题目: 设计一个简单的基于串口通信的信息发送和接受界面 二.实验目的: 1.熟悉并掌握RS232串口标准及原理。 2.实现PC机通过RS232串口进行数据的收发。 3.熟悉VC语言编写程序的环境,掌握基本的VC语言编程技巧。 三.实验内容 程序代码: P// PC1PC2Dlg.cpp : implementation file // #include "stdafx.h" #include "PC1PC2.h" #include "PC1PC2Dlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL

单片机串口通信C程序及应用实例

一、程序代码 #include//该头文件可到https://www.360docs.net/doc/19125075.html,网站下载#define uint unsigned int #define uchar unsigned char uchar indata[4]; uchar outdata[4]; uchar flag; static uchar temp1,temp2,temp3,temp; static uchar R_counter,T_counter; void system_initial(void); void initial_comm(void); void delay(uchar x); void uart_send(void); void read_Instatus(void); serial_contral(void); void main() { system_initial(); initial_comm(); while(1) { if(flag==1) { ES = 0; serial_contral(); ES = 1; flag = 0; } else read_Instatus(); } } void uart_send(void) { for(T_counter=0;T_counter<4;T_counter++) { SBUF = outdata[T_counter]; while(TI == 0);

TI = 0; } T_counter = 0; } uart_receive(void) interrupt 4 { if(RI) { RI = 0; indata[R_counter] = SBUF; R_counter++; if(R_counter>=4) { R_counter = 0; flag = 1; } } } void system_initial(void) { P1M1 = 0x00; P1M0 = 0xff; P1 = 0xff; //初始化为全部关闭 temp3 = 0x3f;//初始化temp3的值与六路输出的初始值保持一致 temp = 0xf0; R_counter = 0; T_counter = 0; } void initial_comm(void) { SCON = 0x50; //设定串行口工作方式:mode 1 ; 8-bit UART,enable ucvr TMOD = 0x21; //TIMER 1;mode 2 ;8-Bit Reload PCON = 0x80; //波特率不加倍SMOD = 1 TH1 = 0xfa; //baud: 9600;fosc = 11.0596 IE = 0x90; // enable serial interrupt TR1 = 1; // timer 1 RI = 0; TI = 0; ES = 1; EA = 1; }

WIN_API串口通信详细讲解带范例程序说明

WIN32 API串口通讯实例教程 第一节实现串口通讯的函数及串口编程简介 API函数不仅提供了打开和读写通讯端口的操作方法,还提供了名目繁多的函数以支持对串行通讯的各种操作。常用函数及作用下: 函数名作用 CreateFile 打开串口 GetCommState 检测串口设置 SetCommState 设置串口 BuilderCommDCB 用字符串中的值来填充设备控制块 GetCommTimeouts 检测通信超时设置 SetCommTimeouts 设置通信超时参数 SetCommMask 设定被监控事件 WaitCommEvent 等待被监控事件发生 WaitForMultipleObjects 等待多个被监测对象的结果 WriteFile 发送数据 ReadFile 接收数据 GetOverlappedResult 返回最后重叠(异步)操作结果 PurgeComm 清空串口缓冲区,退出所有相关操作 ClearCommError 更新串口状态结构体,并清除所有串口硬件错误 CloseHandle 关闭串行口 用Windows API 编写串口程序本身是有巨大优点的,因为控制能力会更强,效率也会更高。 API编写串口,过程一般是这样的: 1、创建串口句柄,用CreateFile; 2、对串口的参数进行设置,其中比较重要的是波特率(BaudRate),数据宽度(BytesBits),奇偶校验(Parity),停止位(StopBits),当然,重要的还有端口号(Port); 3、然后对串口进行相应的读写操作,这时候用到ReadFile和WriteFile函数; 4、读写结束后,要关闭串口句柄,用CloseFile。 下面依次讲述各个步骤的过程。

VC6.0MFC串口通信编写全过程(DOC)

其于MFC 的串口调试助手编辑过程 一、新建 打开 VC6.0 文件 新建 工程 MFC AppWiard(exe) 位置(选择保存工程位置) 工程名称(输入工程名XXXX ) 确定 选择基本对话框 下一步 下一步 下一步 选择(CXXXXDlg ) 完成 确定 在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消” 及提示框)删除或修改使用,至此基本框架完成如下图: 二、往生成的基本框架中添加控件 1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再将控件添加到基本框内使用,步骤如下: 菜单栏 工程 添加到工程 Components and controls … Registered ActiveX Controls 选择“Microsoft Communications Control, version 6.0” Insert 确定 OK 关闭此子窗口完成添加操作标志如上图所示。 2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内 点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩 形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:

3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如下图所示: 这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示,上图是运行后的效果。 4、对以上四个控件编程步骤如下: a 、右击串口通信控件 建立类向导 Member variables Control IDS 中选择IDC_MSCOMM1 add variable … Member variable name 中输入控件变量名m_ctrlComm (变量名可以随意选取,但程序中应与所取变量名一致) OK 确定

几种通信总线详尽总结

微处理器中常用的集成串行总线是通用异步 接收器传输总线(UART)、串行通信接口(SCI) 和通用串行总线(USB)等,这些总线在速度、 物理接口要求和通信方法学上都有所不同。本文详细介绍了嵌入式系统设计的串行总线、驱动器和物理接口的特性,并为总线最优选择提供性能比较和选择建议。 由于在消费类电子产品、计算机外设、汽车和工业应用中增加了嵌入式功能,对低成本、高速和高可靠通信介质的要求也不断增长以满足这些应用,其结果是越来越多的处理器和控制器用不同类型的总线集成在一起,实现与PC软件、开发系统(如仿真器)或网络中的其它设备进行通信。目前流行的通信一般采用串行或并行模式,而串行模式应用更广泛。 微处理器中常用的集成串行总线是通用异步接收器传输总线、串行通信接口、同步外设接口(SPI)、内部集成电路(I2C) 和通用串行总线,以及车用串行总线,包括控制器区域网(CAN)和本地互连网(LIN)。这些总线在速度、物理接口要求和通信方法学上都有所不同。本文将对嵌入式系统设计的串行总线、驱动器和物理接口这些要求提供一个总体介绍,为选择最优总线提供指导并给出一个比较图表(表1)。为了说明方便起见,本文的阐述是基于微处理器的设计。 串行与并行相比 串行相比于并行的主要优点是要求的线数较少。例如,用在汽车工业中的LIN 串行总线只需要一根线来与从属器件进行通信,Dallas公司的1-Wire总线只使用一根线来输送信号和电源。较少的线意味着所需要的控制器引脚较少。集成在一个微控制器中的并行总线一般需要8条或更多的线,线数的多少取决于设计中地址和数据的宽度,所以集成一个并行总线的芯片至少需要8个引脚来与外部器件接口,这增加了芯片的总体尺寸。相反地,使用串行总线可以将同样的芯片集成在一个较小的封装中。 另外,在PCB板设计中并行总线需要更多的线来与其它外设接口,使PCB板面积更大、更复杂,从而增加了硬件成本。此外,工程师还可以很容易地将一个新器件加到一个串行网络中去,而且不会影响网络中的其它器件。例如,可以很容易地去掉总线上旧器件并用新的来替代。

UART串口通信设计实例

2.5 UART串口通信设计实例(1) 接下来用刚才采用的方法设计一个典型实例。在一般的嵌入式开发和FPGA设计中,串口UART是使用非常频繁的一种调试手段。下面我们将使用Verilog RTL编程设计一个串口收发模块。这个实例虽然简单,但是在后续的调试开发中,串口使用的次数比较多,这里阐明它的设计方案,不仅仅是为了讲解RTL编程,而且为了后续使用兼容ARM9内核实现嵌入式开发。 串口在一般的台式机上都会有。随着笔记本电脑的使用,一般会采用USB转串口的方案虚拟一个串口供笔记本使用。图2-7为UART串口的结构图。串口具有9个引脚,但是真正连接入FPGA开发板的一般只有两个引脚。这两个引脚是:发送引脚TxD和接收引脚RxD。由于是串行发送数据,因此如果开发板发送数据的话,则要通过TxD线1 bit接着1 bit 发送。在接收时,同样通过RxD引脚1 bit接着1 bit接收。 再看看串口发送/接收的数据格式(见图2-8)。在TxD或RxD这样的单线上,是从一个周期的低电平开始,以一个周期的高电平结束的。它中间包含8个周期的数据位和一个周期针对8位数据的奇偶校验位。每次传送一字节数据,它包含的8位是由低位开始传送,最后一位传送的是第7位。

这个设计有两个目的:一是从串口中接收数据,发送到输出端口。接收的时候是串行的,也就是一个接一个的;但是发送到输出端口时,我们希望是8位放在一起,成为并行状态(见图2-10)。我们知道,串口中出现信号,是没有先兆的。如果出现了串行数据,则如何通知到输出端口呢?我们引入“接收有效”端口。“接收有效”端口在一般情况下都是低电平,一旦有数据到来时,它就变成高电平。下一个模块在得知“接收有效”信号为高电平时,它就明白:新到了一个字节的数据,放在“接收字节”端口里面。

1C#中串口通信编程教程

C#中串口通信编程教程 本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET2.0提供了串口通信的功能,其命名空间是System.IO.Ports。这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信。我们将使用标准的RS232C在PC间通信。它工作在全双工模式下,而且我们不打算使用任何的握手或流控制器,而是使用无modem连接。 命名空间 System.IO.Ports命名空间中最重用的是SerialPort类。 创建SerialPort对象 通过创建SerialPort对象,我们可以在程序中控制串口通信的全过程。 我们将要用到的SerialPort类的方法: ReadLine():从输入缓冲区读一新行的值,如果没有,会返回NULL WriteLine(string):写入输出缓冲 Open():打开一个新的串口连接 Close():关闭 Code: //create a Serial Port object SerialPort sp=new SerialPort(); 默认情况下,DataBits值是8,StopBits是1,通信端口是COM1。这些都可以在下面的属性中重新设置 : BaudRate:串口的波特率 StopBits:每个字节的停止位数量 ReadTimeout:当读操作没有完成时的停止时间。单位,毫秒 还有不少其它公共属性,自己查阅MSDN。 串口的硬件知识 在数据传输的时候,每个字节的数据通过单个的电缆线传输。包包括开始位,数据,结束为。一旦开始位传出,后面就会传数据,可能是5,6,7或8位,就看你的设定了。发送和接收必须设定同样的波特率和数据位数。

(完整版)VC6.0MFC串口通信编写全过程

其于MFC的串口调试助手编辑过程 一、新建 打开VC6.0 文件新建工程MFC AppWiard(exe) 位置(选择保存工程位置)工程名称(输入工程名XXXX)确定选择基本对话框下一步下一步下一步选择(CXXXXDlg)完成确定在生成的基本对话框内将不需要按钮及提示框(自动生成的“确定”“取消”及提示框)删除或修改使用,至此基本框架完成如下图: 二、往生成的基本框架中添加控件 1、因为控件列表框内没有串口通信用到的通信控件,所以要先添加到控件列表框内再 将控件添加到基本框内使用,步骤如下: 菜单栏工程添加到工程Components and controls…Registered ActiveX Controls 选择“Microsoft Communications Control, version 6.0”Insert 确定OK 关闭此子窗口完成添加操作标志如上图所示。 2、将刚才添加添加到控件列表框内的串口控件添加到基本框架内 点击控件列表框内的串口控件,此时光标变为“十”形,在基本框架内随意划取一矩形区域,即可以添加串口控件,不需要修改此控件的大小及位置,因为程编译运行后此控件是看不到的,步骤结果如下图:此控件(标志)是下面步骤添加进来的串口控件 基本框架

3、继续往基本框架内添加用于编辑发送数据的输入编辑框及输出编辑框,同理选择控 件列表框内的“编辑框控件”,以相同的操作即可添加两个编辑窗口及一个按纽控件如 下图所示: 选择其中任 意一个作为 输入编辑框 及输出编辑 框 这两个窗口需要修改大小及位置,因为程序运行后将会显示而串口通信控件则不显示, 上图是运行后的效果。 4、对以上四个控件编程步骤如下: a、右击串口通信控件建立类向导Member variables Control IDS中选 择IDC_MSCOMM1 add variable…Member variable name中输入控件变量名 m_ctrlComm(变量名可以随意选取,但程序中应与所取变量名一致)OK 确 定

几种通信总线详尽总结

微处理器中常用的集成串行总线就是通用异步接收器传输总线(UART)、串行通 信接口(SCI)与通用串行总线(USB)等,这些总 线在速度、物理接口要求与通信方法学上都 有所不同。本文详细介绍了嵌入式系统设计 的串行总线、驱动器与物理接口的特性,并为 总线最优选择提供性能比较与选择建议。 由于在消费类电子产品、计算机外设、汽车与工业应用中增加了嵌入式功能,对低成本、高速与高可靠通信介质的要求也不断增长以满足这些应用,其结果就是越来越多的处理器与控制器用不同类型的总线集成在一起,实现与PC软件、开发系统(如仿真器)或网络中的其它设备进行通信。目前流行的通信一般采用串行或并行模式,而串行模式应用更广泛。 微处理器中常用的集成串行总线就是通用异步接收器传输总线、串行通信接口、同步外设接口(SPI)、内部集成电路(I2C) 与通用串行总线,以及车用串行总线,包括控制器区域网(CAN)与本地互连网(LIN)。这些总线在速度、物理接口要求与通信方法学上都有所不同。本文将对嵌入式系统设计的串行总线、驱动器与物理接口这些要求提供一个总体介绍,为选择最优总线提供指导并给出一个比较图表(表1)。为了说明方便起见,本文的阐述就是基于微处理器的设计。 串行与并行相比

串行相比于并行的主要优点就是要求的线数较 少。例如,用在汽车工业中的LIN串行总线只需要一根线来与从属器件进行通信,Dallas公司的1-Wire总线只使用一根线来输送信号与电源。较少的线意味着所需要的控制器引脚较少。集成在一个微控制器中的并行总线一般需要8条或更多的线,线数的多少取决于设计中地址与数据的宽度,所以集成一个并行总线的芯片至少需要8个引脚来与外部器件接口,这增加了芯片的总体尺寸。相反地,使用串行总线可以将同样的芯片集成在一个较小的封装中。 另外,在PCB板设计中并行总线需要更多的线来与其它外设接口,使PCB板面积更大、更复杂,从而增加了硬件成本。此外,工程师还可以很容易地将一个新器件加到一个串行网络中去,而且不会影响网络中的其它器件。例如,可以很容易地去掉总线上旧器件并用新的来替代。 串行总线的故障自诊断与调试也非常简单,可以很容易地跟踪网络中一个有故障的器件并用新器件替换而不会干扰网络。但另一方面,并行总线比串行速度快。例如,Rambus公司的“Redwood”总线速度可高达6、4GHz,而最高的串行速度不会超过几个兆赫。 在工业与汽车应用中常用的串行协议 1、UART

C#串口通信总结

我们知道对于标准DLL,可以采用DllImport进行调用。例如: [DllImport("KMY350X.dll")] private static extern int OpenPort(int PortNum, int BaudRate); 如果一些厂家比较懒的话,没有提供相应的dll,我们只能对它进行串口通信编程了。以前从没接触过串口编程,最近在一个项目中有几个地方都需要采用串口通信,跟公司一个老手请教后,感觉学到了很多东西,特在此做个总结: 一、首先我们来认识下什么是串口 右键我的电脑-管理-设备管理器-端口,选择一个端口,点击属性。 我们可以看到该串口的属性,在C#中我们使用SerialPort类来表示串口 ConfigClass config = new ConfigClass(); comm.serialPort.PortName = config.ReadConfig("SendHealCard"); //波特率 comm.serialPort.BaudRate = 9600; //数据位 comm.serialPort.DataBits = 8; //两个停止位

comm.serialPort.StopBits = System.IO.Ports.StopBits.One; //无奇偶校验位 comm.serialPort.Parity = System.IO.Ports.Parity.None; comm.serialPort.ReadTimeout = 100; comm.serialPort.WriteTimeout = -1; 二、串口调试工具 在对串口进行编程时候,我们要向串口发送指令,然后我们解析串口返回的指令。在这里向大家推荐一款工具。 串口调试助手.exe 将要发送的指令用空格隔开,选择HEX显示为放回的字符串。 三、正式编程

串口通信的接线方法

目前较为常用的串口有9针串口(DB9)和25针串口(DB25),通信距离较近时(<12m),可以用电缆线直接连接标准RS232端口(RS422、RS485较远),若距离较远,需附加调制解调器(MODEM)。最为简单且常用的是三线制接法,即地、接收数据和发送数据三脚相连,本文只涉及到最为基本的接法,且直接用RS232相连。 1、DB9和DB25的常用信号脚说明 2、RS232C串口通信接线方法(三线制) 首先,串口传输数据只要有接收数据针脚和发送针脚就能实现:同一个串口的接收脚和发送脚直接用线相连,两个串口相连或一个串口和多个串口相连同一个串口的接收脚和发送脚直接用线相连对9针串口和25针串口,均是2与3直接相连; 两个不同串口(不论是同一台计算机的两个串口或分别是不同计算机的串口) 图2 上面表格是对微机标准串行口而言的,还有许多非标准设备,如接收GPS数据或电子罗盘数据,只要记住一个原则:接收数据针脚(或线)与发送数据针脚(或线)相连,彼些交叉,信号地对应相接,就能百战百胜。 3、串口调试中要注意的几点: 不同编码机制不能混接,如RS232C不能直接与RS422接口相连,市面上专门的各种转换器卖,必须通过转换器才能连接; 线路焊接要牢固,不然程序没问题,却因为接线问题误事;

串口调试时,准备一个好用的调试工具,如串口调试助手、串口精灵等,有事半功倍之效果; 强烈建议不要带电插拨串口,插拨时至少有一端是断电的,否则串口易损坏。 RS232C标准串口接线方法 (第二版) 检验仪器与微机的通讯主要是以RS232C标准接口为主,而串口的接线方法也有一定的标准,在此谈谈几种常用的串口接法,仅作参考: 一、标准接法 1、9对9(包括9针对9孔,9孔对9孔,9针对9针): 说明:以下的孔、针指串口线两端的串口,不过2、3有可能不交换 2-------------3 3-------------2 4-------------6 5-------------5 6-------------4 7-------------8 8-------------7 2、9对25(包括9孔对25孔,9孔对25针) 2-------------3 (备注:2、3有可能不交换) 3-------------2 4-------------6 5-------------7 6-------------20 7-------------5 8-------------4

VCMSComm串口发送与接收上位机制做总结

VC++MSComm串口发送与接收上位机本设计用VC编写的一个简单的上位机软件,实现功能为:简单的串口数据发送与接收。 具体步骤如下: 一.建立应用程序工程“串口通信_韩季方01” 1.打开VC++6.0—》建立对话框MFC应用程序:串口通信_韩季方01—》 添加基本控件如图1.0。 图1.0 2.添加MSComm控件:Add To Project—》Components and Controls…打开如图1.1,双击“Registered ActiveX Contronls”项—》出现如图1.2—》选择“Microsoft Communications Control,version 6.0”控件—》点击“Insert”—》提示“…”确认即可—》弹出图1.3—》点击“OK”—》再点击“Close”。 下一步,将对话框资源控件中的电话状控件托到对话框中即可,如图1.4。

图1.1 图1.2

图1.3 图1.4 3.编辑控件及其属性设置:如表1.0

4.添加变量及其类型方法如图1.5 图1.5 二.初始化串口:设置MSComm控件属性 打开Class Wizard—》Member Variables—》选IDC_MSCOMM1—》点击“Add Varialbe…”—》添加变量m_ctrlComm。如图1.5。 之后,在工作空间打开文件如图2.0—》在函数OnInitDialog中添加代码如图2.1。

图2.0

图2.1 三.添加串口事件消息处理函数OnComm() 打开Class Wizard—》Member Maps—》Class Name中选择C_01Dlg—》在Object Ids中选择IDC_MSCOMM1—》在Message中选中OnComm—》单击“Add Function”按钮—》将函数名改为OnComm(好记而已)—》单击OK,完成后如图3.0 同理在函数OnComm()中添加代码如图3.1

相关文档
最新文档