串行通信的基本原理及用MFC实现串口通信编程

本文介绍了在Windows环境下进行串口通信编程的方法,包括16位和32位环境下的实现。重点讲解了MFC中使用MSComm控件和32位API函数实现串口通信的步骤,涉及到串口信号线接法、通信流程和参数配置。通过实例展示了如何在MFC中创建串口、初始化设置、事件驱动的数据读写以及非阻塞通信技术的应用,强调了多线程在串口通信中的重要性。
       在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。计算机和单片机(如MCS-51)都具有串行通信口,可以设计相应的串口通信程序,完成二者之间的数据通信任务。

  实际工作中利用串口完成通信任务的时候非常之多。已有一些文章介绍串口编程的文章在计算机杂志上发表。但总的感觉说来不太全面,特别是介绍32位下编程的更少,且很不详细。笔者在实际工作中积累了较多经验,结合硬件、软件,重点提及比较新的技术,及需要注意的要点作一番探讨。希望对各位需要编写串口通信程序的朋友有一些帮助。

一.串行通信的基本原理

串行端口的本质功能是作为CPU和串行设备间的编码转换器。当数据从 CPU经过串行端口发送出去时,字节数据转换为串行的位。在接收数据时,串行的位被转换为字节数据。

在Windows环境(Windows NT、Win98、Windows2000)下,串口是系统资源的一部分。

应用程序要使用串口进行通信,必须在使用之前向操作系统提出资源申请要求(打开串口),通信完成后必须释放资源(关闭串口)。

串口通信程序的流程如下图:

二.串口信号线的接法

一个完整的RS-232C接口有22根线,采用标准的25芯插头座(或者9芯插头座)。25芯和9芯的主要信号线相同。以下的介绍是以25芯的RS-232C为例。

①主要信号线定义:

     2脚:发送数据TXD; 3脚:接收数据RXD; 4脚:请求发送RTS; 5脚:清除发送CTS;

     6脚:数据设备就绪DSR;20脚:数据终端就绪DTR; 8脚:数据载波检测DCD;

1脚:保护地;   7脚:信号地。

②电气特性:

数据传输速率最大可到20K bps,最大距离仅15m.

注:看了微软的MSDN 6.0,其Windows API中关于串行通讯设备(不一定都是串口RS-232C或RS-422或RS-449)速率的设置,最大可支持到RS_256000,即256K bps! 也不知道到底是什么串行通讯设备?但不管怎样,一般主机和单片机的串口通讯大多都在9600 bps,可以满足通讯需求。

③接口的典型应用:

大多数计算机应用系统与智能单元之间只需使用3到5根信号线即可工作。这时,除了TXD、RXD以外,还需使用RTS、CTS、DCD、DTR、DSR等信号线。(当然,在程序中也需要对相应的信号线进行设置。)

   以上接法,在设计程序时,直接进行数据的接收和发送就可以了,不需要   对信号线的状态进行判断或设置。(如果应用的场合需要使用握手信号等,需要对相应的信号线的状态进行监测或设置。)

三.16位串口应用程序的简单回顾

  16位串口应用程序中,使用的16位的Windows API通信函数:

① OpenComm() 打开串口资源,并指定输入、输出缓冲区的大小(以字节计);

   CloseComm() 关闭串口;

   例:int idComDev;

idComDev = OpenComm("COM1", 1024, 128);

CloseComm(idComDev);

② BuildCommDCB() 、setCommState()填写设备控制块DCB,然后对已打开的串口进行参数配置;

   例:DCB dcb;

BuildCommDCB("COM1:2400,n,8,1", &dcb);

SetCommState(&dcb);

③ ReadComm 、WriteComm()对串口进行读写操作,即数据的接收和发送.

   例:char *m_pRecieve; int count;

     ReadComm(idComDev,m_pRecieve,count);

     Char wr[30]; int count2;

     WriteComm(idComDev,wr,count2);

16位下的串口通信程序最大的特点就在于:串口等外部设备的操作有自己特有的API函数;而32位程序则把串口操作(以及并口等)和文件操作统一起来了,使用类似的操作。

四.在MFC下的32位串
### 串行加法器原理图及其仿真 #### 串行加法器概述 在数字电路设计中,串行加法器是一种用于逐位相加两个二进制数的电路。相比于并行加法器,串行加法器每次只处理一位数据,因此硬件资源消耗较少,适用于某些特定应用场景。 #### 工作原理 串行加法器的核心组件是一个全加器单元和移位寄存器。输入的数据通过移位寄存器依次送入全加器,在每个时钟周期内完成一次加法运算,并将进位传递给下一个时钟周期内的操作[^1]。 #### 原理图展示 以下是简化版的串行加法器原理图: ![Serial Adder Block Diagram](https://upload.wikimedia.org/wikipedia/commons/thumb/7/7a/Simple_serial_adder.svg/800px-Simple_serial_adder.svg.png) 此图为一个简单的串行加法器框图,展示了主要组成部分:A 和 B 输入端口接收待加数;CLK 是时钟信号线;Cin 表示初始进位输入;Sum 输出求和结果;而 Cout 则给出最终进位输出。 #### 仿真方法 对于串行加法器的设计验证通常采用HDL(Hardware Description Language)描述其行为模型,再利用EDA工具进行功能测试。下面是一段VHDL代码实现了一个四位串行加法器的功能模拟: ```vhdl library IEEE; use IEEE.STD_LOGIC_1164.ALL; entity SerialAdder is Port ( A : in STD_LOGIC_VECTOR(3 downto 0); B : in STD_LOGIC_VECTOR(3 downto 0); CLK : in STD_LOGIC; Sum : out STD_LOGIC_VECTOR(3 downto 0)); end SerialAdder; architecture Behavioral of SerialAdder is signal temp_sum, carry : std_logic_vector(3 downto 0):=(others=>'0'); begin process(CLK) variable i:integer:=0; begin if rising_edge(CLK) then for j in 0 to 3 loop temp_sum(j)<=A(i) xor B(i) xor carry(i); -- sum bit calculation carry(j+1)<=(A(i) and B(i)) or ((A(i) xor B(i))and carry(i)); -- carry generation i := (i + 1) mod 4; end loop; end if; end process; Sum<=temp_sum; end Behavioral; ``` 这段程序定义了一个实体`SerialAdder`来表示我们的串行加法器,并在其架构部分实现了具体的逻辑运算过程。注意这里为了简化说明仅考虑了四个比特宽度的情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值