搜档网
当前位置:搜档网 › 串口通信程序设计

串口通信程序设计

串口通信程序设计
串口通信程序设计

1 引言 (1)

2 应用软件介绍 (2)

2.1Quartus II软件介绍 (2)

2.2 Quartus II工作环境介绍 (2)

2.3ModelSim软件介绍 (3)

3 电路设计及仿真 (5)

3.1总体设计思路 (5)

3.2UART接收器的设计及仿真 (5)

3.3UART发送器的设计及仿真 (6)

3.4整体电路设计及仿真 (6)

4 总结 (8)

参考文献 (9)

附录 (10)

在计算机系统和微机网络的快速发展领域里,串行通信在数据通信及控制系统中得到广泛的应用。UART(Universal Asynchronous Receiver Transmitter通用异步收发器)是数据通信及控制系统中广泛使用的串行数据传输协议,允许在串行线路上进行全双工的通信。通过应用 EDA技术,基于 CPLD/FPGA器件设计与实现 UART的波特率产生器、UART发送器和接收器及其整合电路,目的是熟练运用 VHDL语言,掌握FPGA芯片的使用。波特率发生器、接收器和发送器是UART的三个核心功能模块,利用VHDL语言对这三个功能模块进行描述并加以整合,使整个设计更加紧凑、稳定且可靠,通过QuartusII仿真,使其结果完全符合UART协议的要求和预期的结果。

串行接口的数据传输方式是串行的,即数据是一位位的进行传输。串行接口的应用非常广泛,PC机上一般就至少有两个串行接口——COM1和COM2,虽然串行接口的传输方式导致其传输速度会比较慢,但是却具有较强的抗干扰能力,并能有较长的传输距离。在串行通信中,用“波特率”来描述数据的传输速率。所谓波特率,即每秒传送的二进制位数,其单位为bit/s(bits per second),它是衡量传输串行数据速度快慢的重要指标。有时候也用“位周期”来表示传输速率,位周期是波特率的倒数。国际上规定了一个标准波特率系列:110bit/s、300bit/s、600 bit/s、1200 bit/s、1800 bit/s、2400 bit/s、2400 bit/s、9600 bit/s、14.4k bit/s、19.2 kbit/s、28.8k bit/s等,如9600 bit/s,其意义是每秒传送9600位数据,包含字符位和其他必须的位。大多数串行接口电路的接收波特率和发送波特率都可以设置,但是接收方的波特率必须与发送方的发送波特率形同。通信线上所传输的字符数据时逐位传送的,1个字符由若干位组成,因此每秒钟所传输的字符数(字符速率)和波特率是两种概念。在串行通信中所说的传输速率是指波特率。在串行通信中,除了可以设置波特率外,其他的如字符数据的位数、奇偶校验位、停止位也可以被设置,其中字符数据的位数可以被设置为5~8位;奇偶校验位可以去除,也可以设置为奇校验或者偶校验;停止位可以设置为1位、1.5位或者2位。

2应用软件介绍

2.1Quartus II软件介绍

Quartus II是Altera公司推出的一种针对其公司生产的CPLD/FPGA系列器件的综合性开发软件,是一个集成了编译、布局布线和仿真工具在内的完全集成化的可编程逻辑设计环境,是最先进的EDA工具软件。它能完成从代码输入到物理实现的全部设计流程,支持Altera公司的所有FPGA和CPLD器件,是MaxPlusII 的后继版本。该软件具有开放性、与结构无关、多平台、完全集成化、丰富的设计库、模块化工具等特点,支持原理图、VHDL、VerilogHDL以及AHDL(Altera Hardware Description Language)等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。

Quartus II可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,还提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。Quartus II支持Altera的IP核,包含了LPM/MegaFunction宏功能模块库,使用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三方EDA工具。

2.2 Quartus II工作环境介绍

(1)启动QuartusII,其管理窗口如图2-1。

图2-1 Quartus II管理窗口

(2)首先新建一个工程,选择菜单命令File/New Project Wizard ,点击next

将弹出如图所示对话框,对话框中第一行表示工程所在的工作库文件夹,第二行表示此项工程的工程名。选择项目存放目录、填写项目名称,注意项目顶层设计实体名称必须和项目名称保持一致,接下来对器件进行相关的设置。

图2-2 New Project Wizard 窗口

(3)然后新建一个VHDL文件,出现一个空白窗口,在这个空白窗口可以输入VHDL代码,如图2-3所示。

图2-3 输入VHDL代码窗口

输入完VHDL代码后点击Start Compilation即可进行编译。如果程序语法有错就会进行错误提示,如果代码正确则编译提示正确,代码无语法错误。

2.3ModelSim软件介绍

ModelSim是一种第三方EDA仿真工具,它是由Model公司开发的,支持Verilog、VHDL以及两者的混合仿真。它可以将整个程序分步执行,并且可以在程序执行的任何步骤任何时刻都可以查看任意变量的当前值,和某一单元或模块

的输入输出的连续变化等。其主要特点是仿真速度快,仿真精度高,是目前业界最流行最通用的仿真器之一。

编写完VHDL代码且编译通过后,即可对其进行波形仿真。

(1)首先选择QuartusⅡ主窗口Tools/Options命令,改变ModelSim-Altera 的存储地址,如图2-4所示。

图2-4 Options界面

(2)然后选择QuartusⅡ主窗口Assignments菜Device命令,进入 Settings对话框的 Device页面进行设置,如图2-4所示。再点击Test Benches 按钮,进入New Test Benches Setting 界面进行一系列设置。

图2-4 Device设置页面

(3)最后在Tools 的下拉菜单中选择Run EDA Simulation Tool/EDA RTL Simulation,即可得到波形的仿真结果。

3电路设计及仿真

3.1总体设计思路

这次课程设计中我们设计并验证带有FIFO的UART接收器和发送器,要求如下:波特率=9600,启始位=1,信息位=8,奇偶校验位=0,停止位=2,空闲位=1,要求使用LSM进行设计和验证,且需在Testbench中联合验证。

在实际设计中,采取先总后分的思想,先设计接收器和发送器,然后将两者集成到一起,实现数据的串行接收和发送。其总体框图如图3-1所示。

图3-1 UART总体框图

3.2UART接收器的设计及仿真

UART接收器用来接收从串行数据输入端口送来的数据。由于我们采用的内部时钟其频率是波特率时钟的16倍,因此起始位至少在8个内部时钟周期内为低电平才被认为有效,一旦起始位被确认,后面的数据比特和校验比特将会每16个内部时钟周期采样一次。接收时序如图3-2所示。

图3-2 UART接收时序

使用ModelSim对程序仿真后得到图3-3所示波形界面。

图3-3 接收波形仿真

在上图中,从接收端口rxd的波形可以得出,接收器接收到的数据为“01010110”,与接收器的输出端口q对比可知,接收时从低位向高位依次进行的。

3.3UART发送器的设计及仿真

UART发送器用来输出串行数据。在起始位之后,按低位首发原则,顺序发送信息位的最低位至最高位。这次的设计中,要求波特率=9600,据此计算时钟周期,且EP=192。其帧格式如图3-4所示。

图3-4 UART发送的帧格式

使用ModelSim对程序仿真后得到图3-5所示波形界面。

图3-5 发送波形仿真

由图可以看出,发送初值设为“00”,在empty=‘0’,rdreq=‘1’时开始发送数据“01010110”,且由txd的波形可以得出数据是从低位向高位依次发送的,与串口发送器的发送原则相符。

3.4整体电路设计及仿真

整体电路是将发送器与接收器连接到一起综合得到的,其原理图如图3-6所示。

图3-6 整体电路设计原理图

使用ModelSim对程序仿真后得到图3-7所示波形界面。

图3-7 整体波形仿真

从图中可以看出,将接收和发送两部分综合到一起后,其输入端口data和输出端口q传送的数据一致,均为“01010110”并且是由低位向高位传送的,说明整体电路是符合设计要求的。

4总结

通过这次设计,加深了我对EDA的了解。取代之前采用硬件仿真波形的方法,在这次的课设中,我们使用ModelSim来进行波形仿真。我们的课题是UART 串口数据接收、发器,当每一个子模块编写调试成功时,心里特别的开心。但是在编写顶层文件的程序时,遇到了不少问题,特别是各元件之间的连接,以及信号的定义,总是有错误,通过细心的检查,终于找出了错误和警告,排除困难后,程序编译就通过了。在连接各个模块的时候一定要注意各个输入、输出引脚的线宽,因为每个线宽是不一样的,只要让各个线宽互相匹配,才能得出正确的结果,否则,出现任何一点小的误差就会导致整个文件系统的编译出现错误提示,在器件的选择上也有一定的技巧,只有选择了合适当前电路所适合的器件,编译才能得到完满成功。

总的来说,这次设计的结果还是比较成功的,虽然在设计中遇到了很多问题,但最后在老师的指导和同学们的帮助下,终于游刃而解,觉得平时所学的知识有了实用的价值,达到了理论与实际相结合的目的,不仅学到了不少知识,而且锻炼了自己的能力。最后,对给过我帮助的所有同学和各位指导老师再次表示衷心的感谢!

参考文献

[1] 乔庐峰,王志功.数字电路设计教程[M]. 北京电子工业出版社,2010

[2] 潘松,黄继业.EDA技术实用教程(第二版)[M]. 科学出版社,2005

[3] 焦素敏,EDA应用技术[M]. 北京清华大学出版社,2002

[4] 谭会生,张昌凡.EDA技术及应用[M]. 西安西安电子科技大学出版社,2008

[5] 曾繁泰,陈美金.VHDL程序设计[M]. 北京清华大学出版社

附录

发送器的设计程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;

use ieee.std_logic_unsigned.all;

ENTITY uart_trasmitter IS

PORT( trs_q : IN STD_LOGIC_VECTOR(7 downto 0);

empty : IN STD_LOGIC;

uart_clk : IN STD_LOGIC;

rdreq : OUT STD_LOGIC;

txd : OUT STD_LOGIC;

rst:in std_logic

);

END uart_trasmitter;

ARCHITECTURE uart_trasmitter_architecture OF uart_trasmitter IS

signal count,temp : std_logic_vector(7 downto 0);

constant EP: std_logic_vector(7 downto 0) := conv_std_logic_vector(192, 8);

constant S0 : std_logic_vector(7 downto 0) := conv_std_logic_vector(0, 8);

constant S1 : std_logic_vector(7 downto 0) := conv_std_logic_vector(16, 8);

constant S2 : std_logic_vector(7 downto 0) := conv_std_logic_vector(16*2, 8);

constant S3 : std_logic_vector(7 downto 0) := conv_std_logic_vector(16*3, 8);

constant S4 : std_logic_vector(7 downto 0) := conv_std_logic_vector(16*4, 8);

constant S5 : std_logic_vector(7 downto 0) := conv_std_logic_vector(16*5, 8);

constant S6 : std_logic_vector(7 downto 0) := conv_std_logic_vector(16*6, 8);

constant S7 : std_logic_vector(7 downto 0) := conv_std_logic_vector(16*7, 8);

constant S8 : std_logic_vector(7 downto 0) := conv_std_logic_vector(16*8, 8);

constant S9 : std_logic_vector(7 downto 0) := conv_std_logic_vector(16*9, 8);

BEGIN

lsm_1 : process(uart_clk, rst, count)

begin

if (rst = '1') then

count <= EP;

elsif (uart_clk'event and uart_clk = '1') then

if (count >= EP and empty = '0') then

count <= (others => '0');

elsif (count < EP) then

count <= count + 1;

end if;

end if;

end process;

lsm_2 : process(uart_clk, rst)

begin

if (rst = '1') then

temp <= (others => '0');

txd<='1';

rdreq <= '0';

elsif (uart_clk'event and uart_clk = '1') then

case count is

when EP =>if(empty='0')then rdreq<='1'; end if;

when S0 => rdreq<='0';txd<='0'; temp <= trs_q;

when S1 => txd <= temp(0);

when S2 => txd <= temp(1);

when S3 => txd <= temp(2);

when S4 => txd <= temp(3);

when S5 => txd <= temp(4);

when S6 => txd <= temp(5);

when S7 => txd <= temp(6);

when S8 => txd <= temp(7);

when S9 => txd <= '1';rdreq <= '0';

when others =>null;

end case;

end if;

end process;

END uart_trasmitter_architecture;

接收器的设计程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all;

LIBRARY work;

ENTITY rec IS

PORT(

clk : IN STD_LOGIC;

rst : IN STD_LOGIC;

rxd : IN STD_LOGIC;

rdreq : IN STD_LOGIC;

sys_clk : IN STD_LOGIC;

q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

usedw : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

);

END rec;

ARCHITECTURE bdf_type OF rec IS

COMPONENT uart_receiver_lsm

PORT(

clk : IN STD_LOGIC;

rst : IN STD_LOGIC;

rxd : IN STD_LOGIC;

wr_fifo : OUT STD_LOGIC;

data : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

);

END COMPONENT;

COMPONENT my_fifo

PORT(wrreq : IN STD_LOGIC;

wrclk : IN STD_LOGIC;

rdreq : IN STD_LOGIC;

rdclk : IN STD_LOGIC;

data : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

rdusedw : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );

END COMPONENT;

SIGNAL uart_clk : STD_LOGIC;

SIGNAL SYNTHESIZED_WIRE_0 : STD_LOGIC;

SIGNAL SYNTHESIZED_WIRE_1 : STD_LOGIC_VECTOR(7 DOWNTO 0); BEGIN

b2v_inst : uart_receiver_lsm

PORT MAP(clk => uart_clk,

rst => rst,

rxd => rxd,

wr_fifo => SYNTHESIZED_WIRE_0,

data => SYNTHESIZED_WIRE_1);

b2v_inst1 : my_fifo

PORT MAP(wrreq => SYNTHESIZED_WIRE_0,

wrclk => uart_clk,

rdreq => rdreq,

rdclk => sys_clk,

data => SYNTHESIZED_WIRE_1,

q => q,

rdusedw => usedw);

uart_clk <= clk;

END bdf_type;

整体电路的设计程序:

LIBRARY ieee;

USE ieee.std_logic_1164.all;

LIBRARY work;

ENTITY rec3 IS

PORT(

clk : IN STD_LOGIC;

rst : IN STD_LOGIC;

sys_clk : IN STD_LOGIC;

wrreq : IN STD_LOGIC;

rdreq : IN STD_LOGIC;

data : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

wrfull : OUT STD_LOGIC;

q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

usedw : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)

);

END rec3;

ARCHITECTURE bdf_type OF rec3 IS

COMPONENT rec

PORT( clk : IN STD_LOGIC;

rst : IN STD_LOGIC;

rxd : IN STD_LOGIC;

rdreq : IN STD_LOGIC;

sys_clk : IN STD_LOGIC;

q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0);

usedw : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );

END COMPONENT;

COMPONENT rec2

PORT( wrreq : IN STD_LOGIC;

rdclk : IN STD_LOGIC;

rst : IN STD_LOGIC;

uart_clk : IN STD_LOGIC;

data : IN STD_LOGIC_VECTOR(7 DOWNTO 0);

txd : OUT STD_LOGIC;

wrfull : OUT STD_LOGIC

);

END COMPONENT;

SIGNAL SYNTHESIZED_WIRE_0 : STD_LOGIC;

BEGIN

b2v_inst : rec

PORT MAP(clk => clk,

rst => rst,

rxd => SYNTHESIZED_WIRE_0,

rdreq => rdreq,

sys_clk => sys_clk,

q => q,

usedw => usedw);

b2v_inst10 : rec2

PORT MAP(

wrreq => wrreq,

rdclk => sys_clk,

rst => rst,

uart_clk => clk,

data => data,

txd => SYNTHESIZED_WIRE_0,

wrfull => wrfull

);

END bdf_type;

C#串口通讯编程

C#中串口通信编程收藏 本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名 空间是System.IO.Ports。这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信。 我们将使用标准的RS 232 C 在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位,就看你的设定了。发送和接收必须设定同样 的波特率和数据位数。 无猫模式 没有Modem模式的电缆只是简单地交叉传送和接收线。同样DTR & DSR, 和RTS & CTS 也需要交叉。 RS232针图 这里,我们三条线。互连2和3(一段的2pin连接3pin),连接两端的5pin。 [示例程序] 主程序 如果想使用默认属性,按“Save Status”按钮,如果想改变属性按“Property”。它会弹出下图:

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位,就看你的设定了。发送和接收必须设定同样的波特率和数据位数。

通用串口通讯程序设计

通用串口通讯程序设计 作者:和光同尘版本:V1.0 序 做硬件开发近20载,花了近十年做基础开发,对硬件开发略知一二,接触的做国防/工业大项目的人才我就是和他们沟通中获取了很多思想;人生已过而立之年,不惑解疑,总想写点什么。从一线研发(做了4年),开发(3年),硬件开发主管(12年),算起来人生从不到弱冠之年(中专毕业)开始接触MCS51、AVR等8位处理器到ARM v7核、CoretxM 核的32位处理器,CPLD/FPGA、PLC…………啰嗦了!! 最近因为工作原因需要把一些自己感悟的记录下来,希望传递给入门的有心沉下心做基础健壮扎实的初学者。

正文 做嵌入式硬件开发一般都会用到通讯数据交互,这就涉及通讯协议/规约的设计。本文从基础的串口(RS232、RS485等)为模型进行讲解。 说道串口通讯,就是编写串口程序,简单的就是1个字节的发送,1个字节的接收,但这不能满足绝大多数实际工作业务需求,实际需要一串字节数据的交互,A发送,B接收……Z 接收;Z机……B机收到根据情况需要回复(ACK)A机,这个过程就叫交互双向通讯(本文不讨论多主机、1主机相对复杂通讯机制。)。这种通讯就需要提前设计好通讯的规约(大家约定好暗号——每个字节代表什么意思)。 接下来编写通信程序(发送/接收),如何写出一个健壮高效串口程序?是否健壮高效其实很大一部分取决于通讯接收程序的架构。 通讯程序编写依据是——通讯规约,通讯帧的设计。 ●I类通用型: ||帧头段|===|数据段|===|校验码|===|帧尾段|| ●II类时隙通讯: ||开始时隙T(T1T2T3T4T5T6)|=|功能码|=|数据段|=|校验码|=|结束时隙T(T1T2T3)|注意:时隙只是纯粹的前后两帧数据的间隔时间,这期间坚决不能有数据产生。 1.1I类通用型 ◆帧头段 帧头段用于鉴别一串字节流中1帧数据起始位置,这个帧头段必须具有足够的特殊标识(易分辨)。 什么样的特殊标识可作为帧头? 根据个人经验: ①具有监测通讯波特率功能特点:0B01010101(55H)、0B10101010(AAH)或0B00000000(00H)、0B11111111(FFH); ②利用ASCII码如MODBUS ASCII规约以冒号‘:’(3AH)作为帧头。也可以采用ASCII ‘U’(55H)、‘@’(40H)等等 只要保证帧头字节数据内容,在所有通讯数据字节流中,除帧头有意为之而出现,那就是帧头。建议最好有两个字节及以上,这样数据出现与帧头一致的概率更加小,才做到独一无二的特殊性。

串行端口程序设计

串行端口程序设计 一、实验目的 了解在linux环境下串行程序设计的基本方法。 掌握终端的主要属性及设置方法,熟悉终端I /O函数的使用。 学习使用多线程来完成串口的收发处理。 二、实验内容 读懂程序源代码,学习终端I /O函数的使用方法,学习将多线程编程应用到串口的接收和发送程序设计中。 三、预备知识 有C语言基础。 掌握在Linux下常用编辑器的使用。 掌握Makefile 的编写和使用。 掌握Linux下的程序编译与交叉编译过程 四、实验设备及工具 硬件:UP-CUP S2410 经典平台、PC机Pentium 500以上, 硬盘10G以上。 软件:PC机操作系统REDHAT LINUX 9.0+MINICOM+ARM-LINUX开发环境 五、实验原理 异步串行I /O方式是将传输数据的每个字符一位接一位(例如先低位、后高位)地传送。数据的各不同位可以分时使用同一传输通道,因此串行I/O可以减少信号连线,最少用一对线即可进行。接收方对于同一根线上一连串的数字信号,首先要分割成位,再按位组成字符。

为了恢复发送的信息,双方必须协调工作。在微型计算机中大量使用异步串行I/O方式,双方使用各自的时钟信号,而且允许时钟频率有一定误差,因此实现较容易。但是由于每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间,因此效率较低。 图2.3.1串行通信字符格式 图2.3.1给出异步串行通信中一个字符的传送格式。开始前,线路处于空闲状态,送出连续“1”。传送开始时首先发一个“0”作为起始位,然后出现在通信线上的是字符的二进制编码数据。每个字符的数据位长可以约定为5位、6位、7位或8位,一般采用ASCII编码。后面是奇偶校验位,根据约定,用奇偶校验位将所传字符中为“1”的位数凑成奇数个或偶数个。也可以约定不要奇偶校验,这样就取消奇偶校验位。最后是表示停止位的“1”信号,这个停止位可以约定持续1位、1.5位或2位的时间宽度。至此一个字符传送完毕,线路又进入空闲,持续为“1”。经过一段随机的时间后,下一个字符开始传送才又发出起始位。每一个数据位的宽度等于传送波特率的倒数。微机异步串行通信中,常用的波特率为50,95,110,150,300,600,1200,2400,4800,9600等。 接收方按约定的格式接收数据,并进行检查,可以查出以下三种错误: ●奇偶错:在约定奇偶检查的情况下,接收到的字符奇偶状态和约定不符。 ●帧格式错:一个字符从起始位到停止位的总位数不对。 ●溢出错:若先接收的字符尚未被微机读取,后面的字符又传送过来,则产生溢出错。 每一种错误都会给出相应的出错信息,提示用户处理。一般串口调试都使用空的MODEM 连接电缆,其连接方式如下:

Java串口通信编程指南

Java串口通信编程指南

1. 概述 在java中,利用Java Communication包可以操作串口,但官方的包在3.0之后就只支持Linux和Solaris平台了,Windows平台的只支持到98年出的2.0版本,不过在XP下还能使用。另外,也可以用开源的Rxtx实现串口通信,这里仅以Java Communication包,在Windows 平台实现串口通信进行说明。 2. 前期准备 2.1. 下载Java Communication包 ?下载地址如下:https://www.sodocs.net/doc/994078345.html,/Jolt/javacomm20-win32.zip。 ?如果是非Windows平台,请到Sun网站选择其他版本下载。地址如下: https://www.sodocs.net/doc/994078345.html,/download/products.xml?id=43208d3d 2.2. 配置 ?解压缩javacomm20-win32.zip ?把win32com.dll拷贝到{JAVA_HOME}\jre\bin ?把comm.jar拷贝到{JAVA_HOME}\jre\lib\ext ?把https://www.sodocs.net/doc/994078345.html,m.properties拷贝到{JAVA_HOME}\jre\lib ?set CLASSPATH={JAVA_HOME}\jre \lib\ext \comm.jar;%classpath%

3. 实现过程 主要步骤包括: ?获得串口标识 ?打开串口 ?设置串行端口通讯参数 ?获取输入(出)流 ?进行读写操作 3.1. 获得串口标识 指定串口的端口号,生成串口的标识类的实例。 https://www.sodocs.net/doc/994078345.html,mPortIdentifier是通讯端口管理器,控制访问到通讯端口的中心类。一个应用程序首先使用CommPortIdentifier中的方法,通过相关的驱动去获取那些通讯端口是可用的并且选择一个端口便于开始。它包括如下功能: a. 通过驱动决定通讯端口是可用的。 b. 打开通讯端口为了I/O操作。 c. 决定端口的拥有者。 d. 解析端口拥有者的争夺。 e. 管理事件显示在端口拥有者的中的状态改变。 示例代码如下: 代码: 3.2. 打开串口 示例代码如下: 代码:

串行异步通信程序设计

******************* 实践教学 ******************* 兰州理工大学 计算机与通信学院 2014年秋季学期 《通信系统综合训练》课程设计 题目:串行异步通信程序设计 专业班级:通信工程(1)班 姓名:李银环 学号:11250134 指导教师:王惠琴 成绩:

摘要 在Windows环境下实现通信的方法主要有利用MSComm控件和直接用Windows API编程,软件采用Microsoft Visual C++ 6.0,利用MSComm控件编程相对来说更简单一些,而直接使用Windows API编程更灵活一些。 本次课程设计分析了串行异步通信的基本原理,在VC++6.0的环境下利用MSComm控件实现了两个PC机的COM口间的数据发送和接收。本文通过对COM1口进行初始化编程,以及对建立的工程中的每个对话框和按钮分别进行编程和设置,成功的实现了利用PC机的两个COM口进行异步通信,并能根据设置调整异步传行通信参数。 关键词:VC++6.0;MSComm控件;串行异步通信

目录 前言 (1) 第1章串行异步通信基本原理 (2) 1.1 串行通信协议 (2) 1.2 串口通信的基本概念 (3) 1.3 RS-232简介 (4) 第2章 VC++软件简介 (5) 2.1 VC++6.0简介 (5) 2.2 Microsoft Communications Control 控件 (6) 第3章串行异步通信系统分析 (7) 第4章串行异步通信系统设计 (8) 4.1建立工程 (8) 4.2 在程序中添加MSComm控件 (9) 4.3 初始化串口:设置MSComm控件的属性 (11) 4.4 发送数据 (12) 第5章串行异步通信程序调试 (18) 5.1 计算机串口设置 (18) 5.2 程序运行结果 (18) 参考文献 (20) 附录 (21) 致谢 (29)

C#中串口通信编程

本文将介绍如何在.NET平台下使用C#创建串口通信程序,.NET 2.0提供了串口通信的功能,其命名 空间是System.IO.Ports。这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信。 我们将使用标准的RS 232 C 在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位,就看你的设定了。发送和接收必须设定同样 的波特率和数据位数。 无猫模式 没有Modem模式的电缆只是简单地交叉传送和接收线。同样DTR & DSR, 和 RTS & CTS也需要交叉。RS232针图 这里,我们三条线。互连2和3(一段的2pin连接3pin),连接两端的5pin。 [示例程序] 主程序

MFC串口通信编程详解解析

MFC串口通信编程介绍 主要介绍了用CreateFile(函数和WriteFile(函数读写串口的实例,以及设置串口属性的实例. 在工业控制中,工控机(一般都基于Windows平台经常需要与智能仪表通过串口 进行通信.串口通信方便易行,应用广泛. 一般情况下,工控机和各智能仪表通过RS485总线进行通信.RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点.每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答. 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活.其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活.下面只介绍API串口通信部分. 串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式.同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中, 虽然不会阻塞主线程,但是仍然会阻塞监听线程;而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞. 无论哪种操作方式,一般都通过四个步骤来完成: (1打开串口 (2配置串口 (3读写串口 (4关闭串口

一打开串口 Win32系统把文件的概念进行了扩展.无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的.该函数的原型为: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile; ?lpFileName:将要打开的串口逻辑名,如“COM1”; ?dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; ?dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0; ?lpSecurityAttributes:引用安全性属性结构,缺省值为NULL; ?dwCreationDistribution:创建标志,对串口操作该参数必须置为 OPEN_EXISTING; ?dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O操 作;

VC++串口通信编程

在工业控制中,工控机(一般都基于Windows平台)经常需要与智能仪表通过串口进行通信。串口通信方便易行,应用广泛。 一般情况下,工控机和各智能仪表通过RS485总线进行通信。RS485的通信方式是半双工的,只能由作为主节点的工控PC机依次轮询网络上的各智能控制单元子节点。每次通信都是由PC机通过串口向智能控制单元发布命令,智能控制单元在接收到正确的命令后作出应答。 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX 控件,这种方法程序简单,但欠灵活。其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。本文我们只介绍API串口通信部分。 串口的操作可以有两种操作方式:同步操作方式和重叠操作方式(又称为异步操作方式)。同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而重叠操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。 无论那种操作方式,一般都通过四个步骤来完成: (1)打开串口 (2)配置串口 (3)读写串口 (4)关闭串口 (1)打开串口 Win32系统把文件的概念进行了扩展。无论是文件、通信设备、命名管道、邮件槽、磁盘、还是控制台,都是用API函数CreateFile来打开或创建的。该函数的原型为: HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); ?lpFileName:将要打开的串口逻辑名,如“COM1”; ?dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列; ?dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0; ?lpSecurityAttributes:引用安全性属性结构,缺省值为NULL; ?dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING; ?dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同 步I/O操作; ?hTemplateFile:对串口而言该参数必须置为NULL;

串行通信程序设计

课程设计任务书 学生姓名: xxx 专业班级: xxx 指导教师: xxx 工作单位: xxx 题目: 串行通信程序设计 初始条件: 用汇编语言编写程序,实现两台计算机之间的通信。 要求完成的主要任务: ①制作RS-232C通信线,并用它连接两台计算机; ②在计算机上用不同的颜色设置接收、发送区域; ③能设置发送、接收的数据长度,并能显示接收的数据; ④能选择通信校验方式(奇校验、偶校验或无校验); ⑤可以将接收的数据作为文件保存起来; ⑥撰写设计说明书及调试心得。 时间安排: 第一阶段: 查阅相关资料 第二阶段: 课程设计 第三阶段: 撰写课程设计报告 第四阶段: 课程设计答辩 指导教师签名:年月日系主任(或责任教师)签名:年月日

串行通信程序设计 1方案论证 首先,要能进行串行通信,串口是基础。使用RS-232 DB-9串口,实现基本通信时,只需将其5号线(地线)相连,2、3号线(接收、发送数据线)分别交叉相连即可。 根据要求,此程序可分为界面显示、参数设置、发送数据、接收数据和保存文件五部分。以下将从这五个方面进行方案论证。 1.1 界面显示 一般情况下显示器的屏幕为25行、82列,不妨把整个屏幕看成25*80个存储单元。屏幕坐上角存储单元的坐标为(0,0),即行号为0,列号为0。因此可通过设置不同的行号和列号定位屏幕上的存储单元。 用不同颜色设置发送和接收区域,即用不同颜色的空格填充发送和接收区域。这就需要调用BIOS系统中断,先置光标位置,再写当前字符和属性。这两项功能都可调用BIOS显示输出10H号中断服务程序实现,详见表1-1 10H号中断服务程序部分功能。 表1-1 10H号中断服务程序部分功能 IBM PC的标准显示器适配器,有单色和彩色之分,其中后者能以文本和图形两种工作方式,既可以显示黑白图形又可以显示有16种颜色的彩色图形。彩色文本方式下,设置不同的属性字节即可实现不同前景和不同背景的组合。例如,0111表示灰白,1110表示黄,设置灰白底黄字的属性为01111110,十六进制表示为7EH。 显示发送和接收两个区域的方案大体分两种,一是两个带状区域,一是两个并排的矩形。从美观的角度来讲,后者更胜一筹。显示标题、提示、设置等信息时,只需先将光标定到合

C#使用SerialPort类设计串口通讯程序

使用SerialPort类设计串口通讯程序 一.概述 输送带控制模块的核心技术是与PLC的串口通讯,在Visual Studio 6.0中编写串口通讯程序,一般都使用Microsoft Communication Control(简称MSComm)的通讯控件,只要通过对此控件的属性和事件进行相应编程操作,就可以轻松地实现串口通讯。但在https://www.sodocs.net/doc/994078345.html,技术广泛应用的今天,Visual S https://www.sodocs.net/doc/994078345.html,没有将此控件加入控件库,所以人们采用了许多方法在Visual https://www.sodocs.net/doc/994078345.html,来编写串口通讯程序:第一种方法是通过采用Visual Studio 6.0中原来的MSComm控件这是最简单的,最方便的方法,但需要注册;第二种方法是采用微软在.NET推出了一个串口控件,基于.NET的P/Invoke调用方法实现;第三种方法是自己用API写串口通信,虽然难度高,但可以方便实现自己想要的各种功能。 现在微软推出了最新版本的Visual Studio 2005开发工具,可以不再采用第三方控件的方法来设计 串口通讯程序。NET Framework 2.0类库包含了SerialPort类,方便地实现了所需要串口通讯的多种功能,为了使MSComm编程方法快速转换到以SerialPort类为核心的串口通讯的设计方法,这里着重讨论了Visu al Studio 6.0的MSComm控件和SerialPort类设计方法的异同点。 二.SerialPort常用属性、方法和事件 1.命名空间 System.IO.Ports命名空间包含了控制串口重要的SerialPort类,该类提供了同步I/O 和事件驱动的I/ O、对管脚和中断状态的访问以及对串行驱动程序属性的访问,所以在程序代码起始位置需加入Using Sys tem.IO.Ports。 2.串口的通讯参数 串口通讯最常用的参数就是通讯端口号及通讯格式(波特率、数据位、停止位和校验位),在MSComm 中相关的属性是CommPort和Settings。SerialPort类与MSComm有一些区别: ?通讯端口号 [PortName]属性获取或设置通信端口,包括但不限于所有可用的COM 端口,请注意该属性返回类型为String,不是https://www.sodocs.net/doc/994078345.html,mPort的short类型。通常情况下,PortName正常返 回的值为COM1、COM2……,SerialPort类最大支持的端口数突破了CommPort控件中CommPor t属性不能超过16的限止,大大方便了用户串口设备的配置。 ?通讯格式 SerialPort类对分别用[BaudRate]、[Parity] 、[DataBits]、[StopBits]属性设置通讯格式中的波特率、校验位、数据位和停止位,其中[Parity]和[StopBits]分别是枚举类型Parity、StopBits,Parit y类型中枚举了Odd(奇)、Even(偶)、Mark、None、Space,Parity枚举了None、One、OnePointFi ve、Two。 SerialPort类提供了七个重载的构造函数,既可以对已经实例化的SerialPort对象设置上述相关属性的值,也可以使用指定的端口名称、波特率和奇偶校验位数据位和停止位直接初始化Seri alPort 类的新实例。 3.串口的打开和关闭 SerialPort类没有采用MSComm.PortOpen=True/False设置属性值打开关闭串口,相应的是调用类的Op en()和Close()方法。 4. 数据的发送和读取

串行通信及数据校验程序设计.

中北大学 单片机原理及接口技术 课程设计说明书 学生姓名:学号: 学院:计算机与控制工程学院 专业:自动化 题目:串行通信及数据校验程序设计 指导教师:职称: 2013年12月22日

中北大学 单片机及其接口技术课程设计任务书 12/13 学年第一学期 学院:计算机与控制工程学院 专业:自动化 学生姓名:学号 课程设计题目:串行通信及数据校验程序设计 起迄日期:12月16 日~12月20 日 课程设计地点:中北大学 指导教师:沈小林 下达任务书日期: 2013年12月16日

课程设计任务书

课程设计任务书

目录 一、设计任务 (2) 1.任务 (2) 2.通信技术要求 (2) 二、基本原理 (2) 1. AT89C51单片机的串行接口结构 (2) 2.串行口方式1的发送和接收 (4) 3.设置串行通信寄存器 (4) 三、系统方案比较与论证 (5) 1.汇编语言和C语言的特点及选择 (5) 2.并行通信与串行通信的比较 (5) 3.串行通信程序设计的比较 (6) 4.同步通信与异步通信的区别 (6) 四、系统电路设计 (6) 五、软件设计 (7) 1.发送程序设计 (7) 2.接收程序设计 (7) 3.校验程序设计 (8) 4.系统软件总体流程图 (9) 六、总结 (11) 七、参考文献 (11)

一、设计任务 1.任务 通过对单片机串行通信程序设计掌握单片机串行数据通讯的实现及数据校验的原理。 2.通信技术要求 (1)串行通信波特率:9600bps; (2)数据长度:20字节 二、基本原理 1.AT89C51单片机的串行接口结构 51单片机的串行接口是一个全双工的接口,它可以作为UART用,也可以作为同步移位寄存器用。51单片机串行接口的结构如下: (1)数据缓冲器(SBUF) 接受或发送的数据都要先送到SBUF缓存。接收SBUF和发送SBUF用同一直接地址99H,两者在物理结构上是相互独立的,单片机用它们来接收和发送数据,发送时用指令将数据送到SBUF即可启动发送;接收时用指令将SBUF中接收到的数据取出。 (2)串行控制寄存器(SCON) SCON用于串行通信方式的选择,收发控制及状态指示,各位含义如下: SM0,SM1:串行接口工作方式选择位,这两位组合成00,01,10,11对应于工作方式

串口通信程序设计

1基本理论基础 1.1串行通信的方式 通信的基本方式可以分为并行通信和串行通信两种。串行通信时数据用一根传输线逐为顺序传送。串行通信又分为两种类型:串行异步通信和串行同步通信。 串行异步通信是指通信中两个字符之间的时间间隔是不固定的,而在一个字符内各位的时间间隔是固定的。 同步通信时指在约定的数据通信数率下,发送方和接收方的时钟信号频率和相位始终保持一致,通信双方发送数据和接收数据具有完全一致的定时关系。 1.2串行通信数据传送方式 单工传送:单工传送时指在通信时只能由一方发送数据,另一方接收数据的通信方式。 半双工传送:指在通信时双方都能够接收或者发送,但是不能够同时接收和发送的通信方式。 全双工传送:通信双方之间有两条通路,发送信息和接收信息可以同时进行。 1.3串行通信接口标准RS-232C RS-232C标准是美国EIA于1969年公布的通信协议。它的作用是实现不同的厂商的计算机和各种外围设备进行串行连接。 2.INS 8250 2.1INS 8250的外部引脚和结构 INS 8250是通用异步收发器UART,用作异步通信接口电路。INS 8250的引脚信号基本上可以分为两大类:与CPU系统总线相连的信号线和与通信设备MODEM连接的信号线。

2.2INS的内部寄存器及其编程方法 2.2.1波特率因子寄存器(DLL/DLH) 波特率因子寄存器是用来控制串行数据传输的数率。波特率因子=1843200÷(分频值×16)内部设置波特率因子寄存器DLL/DLH,在初始化时将选用的波特率因子值的高低、低字节分别放入DLH和DLL中。 若设定通信波特率为1200bps,波特率因子寄存器的初始化程序为: MOV DX,3FBH MOV AL,80H OUT DX,AL MOV DX,3F8H MOV AL,60H OUT DX,AL MOV DX,3F9H MOV AL,00H OUT DX,AL 2.2.2通信线路控制寄存器(LCR) 通信线路控制寄存器LRC主要用来指定异步通信数据格式,即字符长度、停止位位数、奇偶校验。LRC的控制字如下 2.2.3通信线路状态寄存器 通信线路状态寄存器用来表示数据接收和数据发送时8250的状态。控制字如下 中断源提出的中断请求被允许还是被禁止是由允许中断寄存器控制。控制字格式如下

串行通信程序设计微机原理课设

摘要 计算机与外部进行信息交换的方式有两种,一种是并行通信,另一种是串行通信。其中串行通信时,数据和控制信息是一位接一位串行传输,这样虽然速度会慢一些,但是传输距离长,硬件电路也相对简单。因此在长距离通信系统及各类计算机网中,串行传输方式是主要的通信方式。计算机提供给用户的RS-232C接口就是一个标准的串行通信接口,主要用来把数据处理装置与数据通信装置连接在一起。RS-232C标准包括接口的机械,电气及功能方面的内容,许多场合都以这种借口规范作为连接标准。 串行通信是指计算机主机与外设之间以及主机系统与主机系统之间数据的串行传送。使用串口通信时,发送和接收到的每一个字符实际上都是一次一位的传送的,每一位为1或者为0,每一位数据占据一个固定的时间长度。 汇编语言是用指令的助记符,符号地址,标号等书写程序的语言,实际上是机器语言的一种符号表示,主要特点是可以使用助记符来表示机器指令的操作码和操作数,可以用标号和符号来代替地址,常量和变量。汇编语言是与机器语言密切相关的,是面向机器的语言。CPU不同的计算机有着不同的汇编语言,汇编语言源程序不能直接在计算机上运行,需要翻译成机器语言程序。 本次课程设计要求制作RS-232C通信线,用其实现两台计算机之间的通信。要求在计算机上用不同颜色设置接收和发送区域,能设置发送和接收的数据长度,显示接收数据,并能选择通信校验方式,将接收的数据作为文件保存起来。 关键字:汇编语言串行通信 RS-232C通信线源程序CPU

串行通信程序设计 1.串行通信的基本原理 1.1串行通信的基本概念 串行通信有两种工作方式:异步通信和同步通信。异步通信由于不需要同步信号,硬件连接简单而被广泛使用于串行部件,计算机与计算机,计算机于单片机及其仪表之间的数据交换。 (1)异步通信 所谓异步通信,是指以字符为单位传输数据,用起始位和停止位标志每个字符的开始和结束,两次传输时间间隔不固定。异步通信不需要同步信号,为了实现异步通信的要求,CPU与外设之间有两项规定,及字符格式和波特率的规定。在一个串行通信系统工作时,应该设定接收方和放松放的比特率相同;在异步通信方式中,任何一组数据总是以起始位开始,停止位结束,在起始位和停止位之间才是有效数据位,另外数据位的末尾是否用奇偶校验,起始位和停止位选用宽度等都有一定的规定。 (2)同步通信 异步通信为了可靠地传输数据,在每次传输数据时附加一些标志位。在大量数据传输时,为了提高速度,就去掉这些标志,这就是同步通信。采用同步传输,数据块开始处要用同步字符来指示,且在发送端和接收端之间要用时钟来实现同步。同步通信中使用的数据格式根据所采用的控制规程而定。 1.2串行通信中的数据传输方向 通常,串行通信数据在两个站之间是双向传输的,A站可作为发送端,B站作为接收端,也可以A站作为接收端,B站作为发送端,根据要求可分为半双工和全双工。 半双工:每次只能有一个站发送,即只能有A站发送到B站,或者有B站发送到A 站,A站和B站不能同时发送。 全双工:两个站都能同时发送成为全双工,数据传输方向示意图如图1-1所示。

串口通信原理与编程

在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以外,

串口通信Windows程序设计

串口通信Windows程序设计 一.工作环境 硬件连接好的串口设备(虚拟串口软件VSPM),Visual Studio 2008 二.基本知识 1.串口通信 串行口通信,IDE,USB,RS232,主要讲RS232接口,理论传输距离可以 达到50m,实际应用只有15m左右,传输速度较慢,波特率115200bps 时,速度才有14KB/S 2.串口通信传输方式 a)异步传输:异步传输将比特分成小组进行传送,小组可以 是8位的1个字符或更长。发送方可以在任何时刻发送这 些比特组,而接收方从不知道它们会在什么时候到达。双 机通讯需要设定开始位,数据位,校验位,停止位,双机 不需要同步时钟,速率慢。 b)同步传输:数据以帧的形式发送,双机时钟必须同步,否 则会出现传输错误,速度比异步传输快。 三.Windows串口程序设计基础 在Win32下,可以使用两种编程方式实现串口通信,其一是使用ActiveX控件,这种方法程序简单,但欠灵活。其二是调用Windows的API函数,这种方法可以清楚地掌握串口通信的机制,并且自由灵活。我们只介绍API串口通信部分。 同步操作时,API函数会阻塞直到操作完成以后才能返回(在多线程方式中,虽然不会阻塞主线程,但是仍然会阻塞监听线程);而异步操作方式,API函数会立即返回,操作在后台进行,避免线程的阻塞。

无论那种操作方式,一般都通过四个步骤来完成: 1.打开串口 2.配置串口 3.读写串口 4.关闭串口 (1)打开串口 HANDLE CreateFile( LPCTSTR lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDistribution, DWORD dwFlagsAndAttributes, HANDLE hTemplateFile); lpFileName:将要打开的串口逻辑名,如“COM1”;dwDesiredAccess:指定串口访问的类型,可以是读取、写入或二者并列;dwShareMode:指定共享属性,由于串口不能共享,该参数必须置为0;lpSecurityAttributes:引用安全性属性结构,缺省值为NULL; dwCreationDistribution:创建标志,对串口操作该参数必须置为OPEN_EXISTING; dwFlagsAndAttributes:属性描述,用于指定该串口是否进行异步操作,该值为FILE_FLAG_OVERLAPPED,表示使用异步的I/O;该值为0,表示同步I/O 操作; hTemplateFile:对串口而言该参数必须置为NULL;

单片机与PC机串行通信系统设计

随着计算机技术特别是单片机技术的发展,单片机的应用领域越来越广泛,单片机在工业控制、数据采集以及仪器仪表自动化等许多领域都起着十分重要的作用。但在实际应用中,在要求响应速度快、实时性强、控制量多的应用场合,单个单片机往往难以胜任,这时使用多个单片机接合PC机组成分布式系统是一个比较好的解决方案。这样,单片机的数据通信技术就变得十分重要,在某种程度上说,掌握了单片机的数据通信技术也就是掌握了单片机的核心应用技术。 现在单片机及PC机在结构、性能和经济上为实现远程串行通信提供了很好的条件,串行通信是指按照逐位顺序传递数据的通信方式,由于仅需三根传输线传送信息且通信距离相对较远,所以在控制领域的现场监测、分布控制等场合有着重要的应用价值。 本论文运用单片机系统的设计方法,对单片机与PC机的串行通信系统进行设计,通过总体方案的分析与设计,确定了所采用单片机的型号,并明确硬件设计与软件设计的内容,硬件设计方面需要对单片机控制系统的硬件电路,如时钟电路、复位电路进行设计,串口部分确定了以定时器T1工作在方式2作为波特率发生器,单片机与PC机采用了标准的RS-232C接口进行连接,其中存在着电平转换电路的设计,利用了PROTEL99SE软件进行通信系统硬件电路原理图的绘制,并生成报表。软件设计方面,利用VB的MSComm控件进行串口通信软件的开发,根据系统的功能要求,利用汇编程序进行单片机收发数据的程序编制,利用51汇编集成开发环境和STC-ISPV13下载型编程器对单片机汇编程序进行烧录。在系统软硬件调试的过程中,采用AT89C51单片机试验开发板进行功能测试。最后进行分析,验证系统的可行性。 关键词:PC机与单片机的串行通信;VB程序设计;AT89C51实验板

基本串口通信程序设计

基本串口通信程序设计 实验要求: 用TC对计算机的串口进行编程,并作一个简单的串口查询通讯程序。 实验方案: 用RS-232串口通讯线将两台计算机A、B的串口相连。 实验步骤: 1、首先对计算机串口通讯控制芯片8250的控制寄存器进行初始化和设置; 2、对计算机B的串口发送一个数据前,查询计算机A的串口的发送移位寄存器是否为空,如果是则发送数据,如果为否则继续查询,直到条件成立;执行完发送指令后,再次查询计算机A的口的发送移位寄存器是否为空,如果是则结束发送;如果为否,则继续查询,直到条件成立。 3、从计算机A的串口接受刚才从计算机B的串口发送的数据前,先查询计算机A的口的接收数据标志位是否为1,如果是则表示计算机A的口接收数据准备就绪,执行接收指令,即从计算机A的口读入数据,若否则表示没有准备好接收,继续查询计算机A的口的接收数据标志位,直到为1;接收完数据后,再次查询计算机A的串口的接受寄存器是否为空的标志位的状态,如果为1则程序转入计算机B的串口的数据发送程序;如果否,则继续查询等待,直到接收。 实验内容: 1.在COMDEBUG中针对串口通信各寄存器进行设置,掌握各寄存器在串口通信中 的作用及各参数的含义。 Com1口中的10各可编程寄存器 地址寄存器名称备注3F8H 发送保持寄存器(THR)DLAB=0 3F8H 接收缓冲寄存器(RBR)DLAB=0 3F8H 波特率因子寄存器[低](DLL)DLAB=1 3F9H 波特率因子寄存器[高](DLM)DLAB=1 3F9H 中断允许寄存器(IER)DLAB=0 3FAH 中断识别寄存器(IIR) 3FBH 线路控制寄存器(LCR) 3FCH Modem控制寄存器(MCR) 3FDH 线路状态寄存器(LSR) 3FEH Modem状态寄存器(MSR) 注:com1口的基地址为:3F8; com2口的基地址为:2F8。 在上表中,10个可编程寄存器,使用了7个地址,其中部分寄存器共用一个地址,由DLAB=0/1来区分,在DLAB=1,用于设定通讯所需的波特率; 8250的控制寄存器控制/状态字: 1)接收缓冲寄存器(RBR)和发送保持寄存器(THR) RBR暂存从线路上接收到的有效字符,等待本地读取。THR暂存等待发向线路的数据。它们共用同意I/O地址,在半双工工作环境下,互不干扰。 2)中断识别寄存器(IIR)和中断允许寄存器(IER)

相关主题