文档库 最新最全的文档下载
当前位置:文档库 › 基于FPGA与PC串口自收发通信-Verilog

基于FPGA与PC串口自收发通信-Verilog

基于FPGA与PC串口自收发通信-Verilog
基于FPGA与PC串口自收发通信-Verilog

FPGA与PC串口自收发通信

实现的功能如题,就是FPGA里实现从PC接收数据,然后把接收到的数据发回去。使用的是串口UART协议进行收发数据。上位机用的是通用的串口调试助手。

发送数据的波特率可选9600bps,19200bps,38400bps,57600bps,115200bps等,是可调的。发送格式为:1bit起始位,8bit数据,1bit停止位,无校验位。

以下的代码有比较详细的注释,经过下载验证,存在误码率(<5%),仅供学习!代码如下:

(顶层模块):

module my_uart_top(clk,rst_n,rs232_rx,rs232_tx);

input clk;

// 50MHz主时钟

input rst_n;

//低电平复位信号

input rs232_rx;

// RS232接收数据信号

output rs232_tx;

//

RS232发送数据信号

wire bps_start;

//接收到数据后,波特率时钟启动信号置位

wire clk_bps;

// clk_bps的高电平为接收或者发送数据位的中间采样点

wire[7:0] rx_data;

//接收数据寄存器,保存直至下一个数据来到

wire rx_int;

//接收数据中断信号,接收到数据期间始终为高电平

//----------------------------------------------------speed_select

speed_select(

.clk(clk),

//波特率选择模块,接收和发送模块复用,不支持全双工通信.rst_n(rst_n),

.bps_start(bps_start),

.clk_bps(clk_bps)

);

my_uart_rx

my_uart_rx(

.clk(clk),

//接收数据模块

.rst_n(rst_n),

.rs232_rx(rs232_rx),

.clk_bps(clk_bps),

.bps_start(bps_start),

.rx_data(rx_data),

.rx_int(rx_int)

);

my_uart_tx

my_uart_tx(

.clk(clk),

//发送数据模块

.rst_n(rst_n),

.clk_bps(clk_bps),

.rx_data(rx_data),

.rx_int(rx_int),

.rs232_tx(rs232_tx),

.bps_start(bps_start)

);

endmodule

module speed_select(clk,rst_n,bps_start,clk_bps);

input clk;

// 50MHz主时钟

input rst_n;

//低电平复位信号

input bps_start;

//接收到数据后,波特率时钟启动信号置位

output clk_bps;

// clk_bps的高电平为接收或者发送数据位的中间采样点

parameter

bps9600

= 5207,

//波特率为9600bps

bps19200

= 2603,

//波特率为19200bps

bps38400

= 1301,

//波特率为38400bps

bps57600

= 867,

//波特率为57600bps

bps115200

= 433;

//波特率为115200bps

parameter

bps9600_2

= 2603,

bps19200_2

= 1301,

bps38400_2

= 650,

bps57600_2

= 433,

bps115200_2 = 216;

reg[12:0] bps_para;

//分频计数最大值

reg[12:0] bps_para_2;

//分频计数的一半

reg[12:0] cnt;

//分频计数

reg clk_bps_r;

//波特率时钟寄存器

//----------------------------------------------------------

reg[2:0] uart_ctrl;

// uart波特率选择寄存器

//----------------------------------------------------------always @ (posedge clk or negedge rst_n) begin

if(!rst_n) begin

uart_ctrl <= 3'd0;

//默认波特率为9600bps

end

else begin

case (uart_ctrl)

//波特率设置

3'd0:

begin

bps_para <= bps9600;

bps_para_2 <= bps9600_2;

end

3'd1:

begin

. bps_para <= bps19200;

bps_para_2 <= bps19200_2;

end

3'd2:

begin

bps_para <= bps38400;

bps_para_2 <= bps38400_2;

end

3'd3:

begin

bps_para <= bps57600;

bps_para_2 <= bps57600_2;

end

3'd4:

begin

bps_para <= bps115200;

bps_para_2 <= bps115200_2;

end

default: ;

endcase

end

end

always @ (posedge clk or negedge rst_n)

if(!rst_n) cnt <= 13'd0;

else if(cnt

//波特率时钟计数启动

else cnt <= 13'd0;

always @ (posedge clk or negedge rst_n)

if(!rst_n) clk_bps_r <= 1'b0;

else if(cnt==bps_para_2 && bps_start) clk_bps_r <= 1'b1; // clk_bps_r高电平为接收或者发送数据位的中间采样点

else clk_bps_r <= 1'b0;

assign clk_bps = clk_bps_r;

endmodule

module

my_uart_rx(clk,rst_n,rs232_rx,clk_bps,bps_start,rx_data,rx_int);

input clk;

// 50MHz主时钟

input rst_n;

//低电平复位信号

input rs232_rx;

// RS232接收数据信号

input clk_bps;

// clk_bps的高电平为接收或者发送数据位的中间采样点

output bps_start;

//接收到数据后,波特率时钟启动信号置位

output[7:0] rx_data;

//接收数据寄存器,保存直至下一个数据来到

output rx_int;

//接收数据中断信号,接收到数据期间始终为高电平

//----------------------------------------------------------------reg rs232_rx0,rs232_rx1,rs232_rx2;

//接收数据寄存器,滤波用

wire neg_rs232_rx;

//表示数据线接收到下降沿

always @ (posedge clk or negedge rst_n) begin

if(!rst_n) begin

rs232_rx0 <= 1'b1;

rs232_rx1 <= 1'b1;

rs232_rx2 <= 1'b1;

end

else begin

rs232_rx0 <= rs232_rx;

rs232_rx1 <= rs232_rx0;

rs232_rx2 <= rs232_rx1;

end

end

assign neg_rs232_rx = rs232_rx2 & ~rs232_rx1;

//接收到下降沿后neg_rs232_rx置高一个时钟周期

//----------------------------------------------------------------reg bps_start_r;

reg[3:0]

num;

//移位次数

reg rx_int;

//接收数据中断信号,接收到数据期间始终为高电平always @ (posedge clk or negedge rst_n) begin if(!rst_n) begin

bps_start_r <= 1'bz;

rx_int <= 1'b0;

end

else if(neg_rs232_rx) begin

bps_start_r <= 1'b1;

//启动接收数据

rx_int <= 1'b1;

//接收数据中断信号使能

end

else if(num==4'd12) begin

bps_start_r <= 1'bz;

//数据接收完毕

rx_int <= 1'b0;

//接收数据中断信号关闭

end

end

assign bps_start = bps_start_r;

//----------------------------------------------------------------reg[7:0] rx_data_r;

//接收数据寄存器,保存直至下一个数据来到

//----------------------------------------------------------------

reg[7:0]

rx_temp_data;

//但前接收数据寄存器

reg rx_data_shift;

//数据移位标志

always @ (posedge clk or negedge rst_n) begin

if(!rst_n) begin

rx_data_shift <= 1'b0;

rx_temp_data <= 8'd0;

num <= 4'd0;

rx_data_r <= 8'd0;

end

else if(rx_int) begin

//接收数据处理

if(clk_bps) begin

//读取并保存数据,接收数据为一个起始位,8bit数据,一个结束位rx_data_shift <= 1'b1;

num <= num+1'b1;

if(num<=4'd8) rx_temp_data[7] <= rs232_rx;

//锁存9bit(1bit起始位,8bit数据)

end

else if(rx_data_shift) begin

//数据移位处理

rx_data_shift <= 1'b0;

if(num<=4'd8) rx_temp_data <= rx_temp_data >> 1'b1;

//移位8次,第1bit起始位移除,剩下8bit正好时接收数据

else if(num==4'd12) begin

num <= 4'd0;

//接收到STOP位后结束,num清零

rx_data_r <= rx_temp_data;

//把数据锁存到数据寄存器rx_data中

end

end

end

end

assign rx_data = rx_data_r;

endmodule

module

my_uart_tx(clk,rst_n,clk_bps,rx_data,rx_int,rs232_tx,bps_start);

input clk;

// 50MHz主时钟

input rst_n;

//低电平复位信号

input clk_bps;

// clk_bps的高电平为接收或者发送数据位的中间采样点

input[7:0] rx_data;

//接收数据寄存器

input rx_int;

//接收数据中断信号,接收到数据期间始终为高电平,在次利用它的下降沿来启动发送数据

output rs232_tx;

// RS232发送数据信号

output bps_start;

//接收或者要发送数据,波特率时钟启动信号置位

//---------------------------------------------------------

reg rx_int0,rx_int1,rx_int2;

//rx_int信号寄存器,捕捉下降沿滤波用

wire neg_rx_int;

// rx_int下降沿标志位

always @ (posedge clk or negedge rst_n) begin

if(!rst_n) begin

rx_int0 <= 1'b0;

rx_int1 <= 1'b0;

rx_int2 <= 1'b0;

end

else begin

rx_int0 <= rx_int;

rx_int1 <= rx_int0;

rx_int2 <= rx_int1;

end

end

assign neg_rx_int =

~rx_int1 & rx_int2;

//捕捉到下降沿后,neg_rx_int拉地保持一个主时钟周期

//---------------------------------------------------------reg[7:0] tx_data;

//待发送数据的寄存器

//---------------------------------------------------------reg bps_start_r;

reg tx_en;

//发送数据使能信号,高有效

reg[3:0] num;

always @ (posedge clk or negedge rst_n) begin

if(!rst_n) begin

bps_start_r <= 1'bz;

tx_en <= 1'b0;

tx_data <= 8'd0;

end

else if(neg_rx_int) begin

//接收数据完毕,准备把接收到的数据发回去bps_start_r <= 1'b1;

tx_data <= rx_data;

//把接收到的数据存入发送数据寄存器

tx_en <= 1'b1;

//进入发送数据状态中

end

else if(num==4'd11) begin

//数据发送完成,复位

bps_start_r <= 1'bz;

tx_en <= 1'b0;

end

end

assign bps_start = bps_start_r;

//---------------------------------------------------------reg rs232_tx_r;

always @ (posedge clk or negedge rst_n) begin

if(!rst_n) begin

num <= 4'd0;

rs232_tx_r <= 1'b1;

end

else if(tx_en) begin

if(clk_bps)

begin

num <= num+1'b1;

case (num)

4'd0:

rs232_tx_r <= 1'b0;

//发送起始位

4'd1:

.

rs232_tx_r <= tx_data[0];

//发送bit0

4'd2:

rs232_tx_r <= tx_data[1];

//发送bit1

4'd3: rs232_tx_r <= tx_data[2];

//发送bit2

4'd4: rs232_tx_r <= tx_data[3];

//发送bit3

4'd5: rs232_tx_r <= tx_data[4];

//发送bit4

4'd6: rs232_tx_r <= tx_data[5];

//发送bit5

4'd7:

rs232_tx_r <= tx_data[6];

//发送bit6

4'd8: rs232_tx_r <= tx_data[7];

//发送bit7

4'd9: rs232_tx_r <= 1'b0;

//发送结束位

. default: rs232_tx_r <= 1'b1;

endcase

end

else if(num==4'd11) num <= 4'd0;

//复位

end

end

assign rs232_tx = rs232_tx_r;

endmodule

如有侵权请联系告知删除,感谢你们的配合!

基于FPGA串口通信的电路和程序设计

中北大学 毕业设计中期总结 学生姓名:袁财源学号:1206044145 学院:仪器科学与技术 专业:电子科学与技术 设计题目:基于FPGA串口通信的 电路和程序设计 指导教师: 郭涛 2015 年1月5日

毕业设计中期总结

1.开题以来所做的具体工作和取得的进展或成果(方案、图纸、代码等支撑,任务书要求与已完成工作对照表) 1.设计方案 RS-232-C总线标准设有25条信号线,包括一个主通道和一个辅助通道,在多数情况下主要使用主通道,对于一般双工通信,仅需几条信号线就可实现,如一条发送线、一条接收线及一条地线。使用RS232串口通信接口模块的目的是用于电平转换。由于FPGA输出的TTL电平与串口发送的电平不一致,因此,采用电平转换器MAX232。MAX232是一种双组驱动器/接收器,片内含有一个电容性电压发生器,以便在单5V 电源供电时提供EIA/TIA-232-E电平,来实现RS232信号和单片机串口信号之间的电平转换。其工作电压3.0-5.5V,可将TTL电平转换成RS-232标准电平。从而实现了FPGA 与上位机之间的串口通信。 FPGA上位机 MAX232 电路主要框图 2.相关知识

MAX232芯片结构 第一部分是电荷泵电路。由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v 和-12v两个电源,提供给RS-232串口电平的需要。 第二部分是数据转换通道。由7、8、9、10、11、12、13、14脚构成两个数据通道。其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。TTL/CMOS数据从11引脚(T1IN)、10引脚(T2IN)输入转换成RS-232数据从14脚(T1OUT)、7脚(T2OUT)送到电脑DB9插头;DB9插头的RS-232数据从13引脚(R1IN)、8引脚(R2IN)输入转换成TTL/CMOS数据后从12引脚(R1OUT)、9引脚(R2OUT)输出。 第三部分是供电。15脚GND、16脚VCC(+5v)。 RS232 (DB9)引脚定义 1 :DCD :载波检测。主要用于Modem通知计算机其处于在线状态,即Modem检测到拨号音,处于在线状态。 2 :RXD:此引脚用于接收外部设备送来的数据;在你使用Modem时,你会发现RXD 指示灯在闪烁,说明RXD引脚上有数据进入。 3 :TXD:此引脚将计算机的数据发送给外部设备;在你使用Modem时,你会发现TXD 指示灯在闪烁,说明计算机正在通过TXD引脚发送数据。 4 :DTR:数据终端就绪;当此引脚高电平时,通知Modem可以进行数据传输,计算机已经准备好。 5 :GND:信号地;此位不做过多解释。 6 :DSR:数据设备就绪;此引脚高电平时,通知计算机Modem已经准备好,可以进行数据通讯了。 7 :RTS:请求发送;此脚由计算机来控制,用以通知Modem马上传送数据至计算机;否则,Modem将收到的数据暂时放入缓冲区中。 8 :CTS: 清除发送;此脚由Modem控制,用以通知计算机将欲传的数据送至Modem。 9 :RI : Modem通知计算机有呼叫进来,是否接听呼叫由计算机决定。

基于FPGA的通用异步收发器设计(串口通信)

FPGA串行通用异步收发器设计 实验目的:1、掌握QuartusII6.0等EDA工具软件的基本使用; 2、熟悉VHDL硬件描述语言编程及其调试方法; 3、学习用FPGA实现接口电路设计。 实验内容: 本实验目标是利用FPGA逻辑资源,编程设计实现一个串行通用异步收发器。实验环境为EDA实验箱。电路设计采用VHDL硬件描述语言编程实现,开发软件为QuartusII6.0。 1、UART简介 UART(Universal Asynchronous Receiver Transmitter通用异步收发器)是一种应用广泛的短距离串行传输接口。常常用于短距离、低速、低成本的通讯中。8250、8251、NS16450等芯片都是常见的UART器件。 基本的UART通信只需要两条信号线(RXD、TXD)就可以完成数据的相互通信,接收与发送是全双工形式。TXD是UART发送端,为输出;RXD是UART接收端,为输入。 UART的基本特点是: (1)在信号线上共有两种状态,可分别用逻辑1(高电平)和逻辑0(低电平)来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。 (2)起始位(Start Bit):发送器是通过发送起始位而开始一个字符传送,起始位使数据线处于逻辑0状态,提示接受器数据传输即将开始。 (3)数据位(Data Bits):起始位之后就是传送数据位。数据位一般为8位一个字节的数据(也有6位、7位的情况),低位(LSB)在前,高位(MSB)在后。 (4)校验位(parity Bit):可以认为是一个特殊的数据位。校验位一般用来判断接收的数据位有无错误,一般是奇偶校验。在使用中,该位常常取消。 (5)停止位:停止位在最后,用以标志一个字符传送的结束,它对应于逻辑1状态。 (6)位时间:即每个位的时间宽度。起始位、数据位、校验位的位宽度是一致的,停止位有0.5位、1位、1.5位格式,一般为1位。 (7)帧:从起始位开始到停止位结束的时间间隔称之为一帧。 (8)波特率:UART的传送速率,用于说明数据传送的快慢。在串行通信中,数据是按位进行传送的,因此传送速率用每秒钟传送数据位的数目来表示,称之为波特率。如波特率9600=9600bps(位/秒)。 FPGA UART系统组成:如下图所示,FPGA UART由三个子模块组成:波特率发生器;接收模块;发送模块; 2、模块设计:

基于fpga的串口通信

基于FPGA的串口通信设计 学号: 姓名: 班级: 指导教师: 电子与控制工程学院

一、串行通信系统 1.1概述 在计算机系统和微机网络的快速发展领域里串行通信在数据通信及控制系统中得到广泛的应用。UART 即Universal AsynchronousReceiver Transmitter 通用异步收发器 协议是数据通信及控制系统中广泛使用的一种全双工串行数据传输协议 在实际工业生产中有时并不使用UART的全部功能。只需将其核心功能集成即可。波特率发生器、接收器和发送器是UART的三个核心功能模块 利用Verilog-HDL语言对这三个功能模块进行描述并加以整合UART是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信。串行外设用到RS232-C异步串行接口 一般采用专用的集成电路即UART实现。如8250、8251、NS16450等芯片都是常见的UART器件 这类芯片已经相当复杂有的含有许多辅助的模块 如FIFO有时我们不需要使用完整UART的功能和这些辅助功能。或者设计上用到了FPGA/CPLD器件那么我们就可以将所需要的UART功能集成到FPGA内部。使用VHDL或Veriolog -HDL将UART的核心功能集成从而使整个设计更加紧凑、稳定且可靠。本文应用EDA技术 基于FPGA/CPLD器件设计与实现UART。 通信指人与人或人与自然之间通过某种行为或媒介进行的信息交流与传递从广义上指需要信息的双方或多方在不违背各自意愿的情况下无论采用何种方法使用何种媒质 将信息从某方准确安全传送到另方。通信在不同的环境下有不同的解释在出现电波传递通信后通信(Communication)被单一解释为信息的传递是指由一地向另一地进行信息的传输与交换其目的是传输消息。然而通信是在人类实践过程中随着社会生产力的发展对传递消息的要求不断提升使得人类文明不断进步。在各种各样的通信方式中利用“电”来传递消息的通信方法称为电信(Telecommunication) 这种通信具有迅速、准确、可靠等特点且几乎不受时间、地点、空间、距离的限制 因而得到了飞速发展和广泛应用。 1.2串行通信简介 计算机与计算机,计算机与外部设备进行数据交换也称为通信,一般有两种方式并行通信和串行通信。信息的各位数据被同时传送的通信方法是并行通信并行通信依靠I/O接口来实现。并行通信中数据有多少位就需要多少条信号传输线。这种通信方式快,但由于传输线较多,所以成本较高,仅适合近距离通信通常传送距离小于30米。当距离大于30米时则多采用串行通信方式串行通信是指外部设备和计算机间使用一根数据线另外需要地线可能还需要控制线进行数据

如何用VC++实现串口通信

用VC 6.0实现串行通信的三种方法 中国科学院王颖 ---- 摘要:本文介绍了在Windows平台下串行通信的实现机制,讨论了根据不同的条件用Visual C++ 设计串行通信程序的三种方法,并结合实际,实现对温度数据的接收监控。 ---- 在实验室和工业应用中,串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛。依据不同的条件实现对串口的灵活编程控制是我们所需要的。 ---- 在光学镜片镀膜工艺中,用单片机进行多路温度数据采集控制,采集结果以串行方式进入主机,每隔10S向主机发送一次采样数据,主机向单片机发送相关的控制命令,实现串行数据接收,处理,记录,显示,实时绘制曲线。串行通信程序开发环境为VC++ 6.0。 ---- Windows下串行通信 ---- 与以往DOS下串行通信程序不同的是,Windows不提倡应用程序直接控制硬件,而是通过Windows 操作系统提供的设备驱动程序来进行数据传递。串行口在Win 32中是作为文件来进行处理的,而不是直接对端口进行操作,对于串行通信,Win 32 提供了相应的文件I/O函数与通信函数,通过了解这些函数的使用,可以编制出符合不同需要的通信程序。与通信设备相关的结构有COMMCONFIG ,COMMPROP,COMMTIMEOUTS,COMSTAT,DCB,MODEMDEVCAPS,MODEMSETTINGS共7个,与通信有关的Windows API函数共有26个,详细说明可参考MSDN帮助文件。以下将结合实例,给出实现串行通信的三种方法。 ---- 实现串行通信的三种方法 ---- 方法一:使用VC++提供的串行通信控件MSComm 首先,在对话框中创建通信控件,若Control 工具栏中缺少该控件,可通过菜单Project --> Add to Project --> Components and Control插入即可,再将该控件从工具箱中拉到对话框中。此时,你只需要关心控件提供的对Windows 通讯驱动程序的API 函数的接口。换句话说,只需要设置和监视MSComm控件的属性和事件。 ---- 在ClassWizard中为新创建的通信控件定义成员对象(CMSComm m_Serial),通过该对象便可以对串口属性进行设置,MSComm 控件共有27个属性,这里只介绍其中几个常用属性: ---- CommPort 设置并返回通讯端口号,缺省为COM1。 ---- Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。 ---- PortOpen 设置并返回通讯端口的状态,也可以打开和关闭端口。 ---- Input 从接收缓冲区返回和删除字符。 ---- Output 向发送缓冲区写一个字符串。 ---- InputLen 设置每次Input读入的字符个数,缺省值为0,表明读取接收缓冲区中的全部内

串口通信FPGA实现

FPGA设计与应用 串口通信实验报告 班级:1105103 姓名:苏林效 学号:1110510321 日期:2014年10月29日

实验性质:验证性实验类型:必做 开课单位:电信院学时:2学时 一、实验目的 1、了解串口通信的基本原理; 2、掌握锁相环的基本原理和使用方法; 3、掌握起始位和停止位的含义及实现方法; 4、掌握VHDL状态机的基本使用方法; 5、掌握基本的接口设计和调试技巧; 二、实验准备 2.1 串口通信原理(1分) 串口通信是以字节为单位,按位传输数据和接收数据的。 先看一下发送数据:串行线缆的两端事先约定好串行传输的参数(传输速度、传输格式等),之后进行传输,①当没有数据传输的时候,发送端向数据线上发送“1”;②当要传输数据时,发送端先发送一个“0”来表示要传输数据了,这样当接收端检测到“0”便可以知道有数据到来了;③开始传输后,数据以约定的速度和格式传输;④每次传输完成一个字节之后,都在其后发送一个停止位“1”。这样,发送数据就结束了。 再来看接收数据,初始状态是等待状态,接收的一直是“1”,当检测到0时进入检验状态,在检验状态下如果再检测到0(一般采用过采样)则进入接收数据状态,当接收完8位比特数后判断是否有停止位,如果有则此字节接收结束,重新进入等待状态准备接受下一字节。 2.2 锁相环的基本原理(1分) 锁相环是以锁定输入载波信号的相位为目标的一种载波环实现形式。它由三部分组成:鉴相器(PD)、环路滤波器(LPF)和压控振荡器(VCO)。如上图。 锁相环的工作原理:压控振荡器的输出经过采集并分频,后与基准信号同时

输入鉴相器。鉴相器通过比较上述两个信号的相位差,输出结果通过环路滤波器,滤除噪声和高频分量,然后输出一个直流脉冲电压,用它来控制VCO ,使它的频率改变,使()lim 0c p t θ=。经过较短时间后,VCO 的输出稳定于某一值。环路一旦进入锁定状态后,压控振荡器的输出信号与环路的输入信号(参考信号)相位时刻保持一致。 三、代码及测试 3.1程序及分析(2分) 顶层原理图如上所示,主要包括三个模块,锁相环(输出57.69MHz )、分频(输出接受时的10倍采样速率和数码管显示速率)、接受(按57.6kbps 接受从串口发来的数据)。 分频模块代码: LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY DIV IS PORT(CLK : IN STD_LOGIC; --锁相环输出时钟57.69M COUT1 : OUT STD_LOGIC; --分频器输出采样时钟576k COUT2 : OUT STD_LOGIC);

FPGA串口通信汇总

FPGA实验报告 目录 FPGA实验报告 (1) 目录 (1)

基于VHDL的串口通信实现设计 (3) 摘要 (3) 正文 (3) 1.研究背景知识 (3) 1.1串口简介 (3) 1.2串口通信参数 (3) 2.系统整体设计 (5) 2.1 系统框图 (5) 2.2原理图 (5) 2.3管脚介绍: (6) 3. 系统模块设计 (6) 3.1分频模块 (6) 3.11流程图 (6) 3.12程序 (7) 3.2接收模块 (8) 3.21流程图 (8) 3.22程序 (9) 3.3发送模块 (10) 3.31流程图 (10) 3.32程序 (11) 4. 系统调试 (12) 4.1 时序调试 (12) 4.2硬件调试 (13) 5.总结 (14)

基于VHDL的串口通信实现设计 摘要 串口是计算机上一种非常通用设备通信的协议,其特点是通信线路简单,成本低,特别适用于远距离通信,因此有较为广泛的应用。为了深入了解串口,本课程设计基于VHDL语言,利用FPGA开发板实现了板间串口通信。在程序设计中,考虑到串口波特率、数据格式等参数,共采用了四个模块:分频模块(即波特率产生模块),接受模块,发送模块,显示模块。通过软件和开发板调试,实现了板和串口调试助手收发数据,软件改变波特率等参数,并在数码管显示的功能。 关键词:串口VHDL FPGA 分频接收发送显示 正文 1.研究背景知识 1.1串口简介 串行接口Serial Interface是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。 串口通信的两种最基本的方式:同步串行通信方式和异步串行通信方式。 1.2串口通信参数 双方为了可以进行通信,必须要遵守一定的通信规则,这个共同的规则就是通信端口的初始化。通信端口的初始化有以下几项必须设置: 1.数据的传输速率 传输双方通过传输线的电压改变来交换数据,但传输线的电压改变的速度必须和接收端的接收速度保持一致,RS-232通常用于异步传输,即双方并没有一个可参考的同步时钟作为基准。由于没有一个参考时钟,双方所发送的高低电位

PC机之间串口通信的实现-Read

PC机之间串口通信的实现 一、实验目的 1.熟悉微机接口实验装置的结构和使用方法。 2.掌握通信接口芯片8251和8250的功能和使用方法。 3.学会串行通信程序的编制方法。 二、实验内容与要求 1.基本要求 主机接收开关量输入的数据(二进制或十六进制),从键盘上按“传输”键(可自行定义),就将该数据通过8251A传输出去。终端接收后在显示器上显示数据。具体操作说明如下: (1)出现提示信息“start with R in the board!”,通过调整乒乓开关的状态,设置8位数据; (2)在小键盘上按“R”键,系统将此时乒乓开关的状态读入计算机I中,并显示出来,同时显示经串行通讯后,计算机II接收到的数据; (3)完成后,系统提示“do you want to send another data? Y/N”,根据用户需要,在键盘按下“Y”键,则重复步骤(1),进行另一数据的通讯;在键盘按除“Y”键外的任意键,将退出本程序。 2.提高要求 能够进行出错处理,例如采用奇偶校验,出错重传或者采用接收方回传和发送方确认来保证发送和接收正确。 三、设计报告要求 1.设计目的和内容 2.总体设计 3.硬件设计:原理图(接线图)及简要说明 4.软件设计框图及程序清单 5.设计结果和体会(包括遇到的问题及解决的方法) 四、8251A通用串行输入/输出接口芯片 由于CPU与接口之间按并行方式传输,接口与外设之间按串行方式传输,因此,在串行接口中,必须要有“接收移位寄存器”(串→并)和“发送移位寄存器”(并→串)。能够完成上述“串←→并”转换功能的电路,通常称为“通用异步收发器”(UART:Universal

FPGA与单片机实现数据RS232串口通信的设计

FPGA与单片机实现数据RS232串口通信 的设计 发布时间:2010-9-2 发布人:21世纪电子网 摘要:本文针对由FPGA构成的高速数据采集系统数据处理能力弱的问题,提出FPGA与单片机实现数据串行通信的解决方案。在通信过程中完全遵守RS232协议,具有较强的通用性和推广价值。 1 前言 现场可编程逻辑器件(FPGA)在高速采集系统中的应用越来越广,由于FPGA对采集到的数据的处理能力比较差,故需要将其采集到的数据送到其他CPU系统来实现数据的处理功能,这就使FPGA系统与其他CPU系统之间的数据通信提到日程上,得到人们的急切关注。本文介绍利用VHDL语言实现 FPGA与单片机的串口异步通信电路。 整个设计采用模块化的设计思想,可分为四个模块:FPGA数据发送模块,FPGA 波特率发生控制模块,FPGA总体接口模块以及单片机数据接收模块。本文着重对FPGA数据发送模块实现进行说明。 2 FPGA数据发送模块的设计 根据RS232 异步串行通信来的帧格式,在FPGA发送模块中采用的每一帧格式为:1位开始位 8位数据位 1位奇校验位 1位停止位,波特率为2400。本系统设计的是将一个16位的数据封装成高位帧和低位帧两个帧进行发送,先发送低位帧,再发送高位帧,在传输数据时,加上文件头和数据长度,文件头用555555来表示,只有单片机收到555555时,才将下面传输的数据长度和数据位进行接收,并进行奇校验位的检验,正确就对收到的数据进行存储处理功能,数据长度可以根据需要任意改变。由设置的波特率可以算出分频系数,具体算法为分频系数X=CLK/(BOUND*2)。可由此式算出所需的任意波特率。下面是实现上述功能的VHDL源程序。 Library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all; entity atel2_bin is port( txclk: in std_logic; --2400Hz的波特率时钟 reset: in std_logic; --复位信号 din: in std_logic_vector(15 downto 0); --发送的数据 start: in std_logic; --允许传输信号 sout: out std_logic --串行输出端口 ); end atel2_bin; architecture behav of atel2_bin is signal thr,len: std_logic_vector(15 downto 0); signal txcnt_r: std_logic_vector(2 downto 0); signal sout1: std_logic;

基于FPGA的串口控制器设计

基于FPGA的串口控制器设计 简介 使用硬件描述语言 (HDL) 设计和开发验证FPGA的成为当前的主流因素。使用行为级描述不只增加了产品的设计效率,也在设计中有独特的验证方式。目前最流行的HDL语言为Verilog 和 VHDL。这篇文章将会举例说明用 Verilog语言的设计和验证数字异步串行收发器UART。 UART介绍 通用异步串行收发器UART中有二个独立的VHDL模块。一个模块实现发射功能, 当另一个实现接收功能,发射和接收功能模块在顶端设计时组合到一起使用,接收和发射的组合是通信通道所必需的。数据写入发射器,从接收器读出,所有的数据是以二进制8字节的信号通过CPU接口。在顶端设计时,地址有发射器映射,而且接收器通道能容易地建立从儿进入接口,两者工用一个称为mclkx 16主控时钟,在每个模块中 mclkx 16 被分成独立的波特率时钟。 UART的功能概况 UART的基本功能概况见下表. 在左边显示传输保持记录,移位记录,传输控制时钟,全部集中在发射机的txmit端。在右边的是显示接收移位寄存器, 接收记录和控制逻辑时钟,所有都包含在接收模块的rxcver端,这两个模组都单独的投入与产出,大部分的控制线,只有双向数据总线, 主时钟和复位线共享的模块。

顶层UART系统的I/O功能描述 UART的标准数据格式 图3显示了UART的串行数据格式,串行数据包含在帧8个数据字节,以及编码信息比特,在连续传输线路高通,在传输初始化时开始低一点.,接下来的低一点开始到8比特的数据信息, 低位对于后边高位有重要的作用。然后后边的8 bits数据进行奇偶校验 ,反馈8位数据的结果。 UART时序图 下面显示怎么将从寄存器里出来的数据写给移位寄存器,并在上升沿速率时钟时,转向tx输出。 发送时间如下表,如何得到数据从rx传输到接收移位寄存器然后存储。

51单片机和计算机之间实现串口通信的电路图

51单片机和计算机之间实现串口通信的电路图 串口通讯参考程序如下: 来源:深入浅出AVR单片机 #include unsigned char UART_RX; //定义串口接收数据变量 unsigned char RX_flag; //定义穿行接收标记 /**************************************************************************************** ***** 函数名:UART串口初始化函数 调用:UART_init(); 参数:无 返回值:无 结果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用) 备注:振荡晶体为12MHz,PC串口端设置[ 4800,8,无,1,无] /**************************************************************************************** ******/ void UART_init (void){ EA = 1; //允许总中断(如不使用中断,可用//屏蔽) ES = 1; //允许UART串口的中断 TMOD = 0x20; //定时器T/C1工作方式2 SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收) TH1 = 0xF3; //定时器初值高8位设置 TL1 = 0xF3; //定时器初值低8位设置 PCON = 0x80; //波特率倍频(屏蔽本句波特率为2400) TR1 = 1; //定时器启动 } /**************************************************************************************** ******/ /**************************************************************************************** ***** 函数名:UART串口接收中断处理函数 调用:[SBUF收到数据后中断处理] 参数:无 返回值:无 结果:UART串口接收到数据时产生中断,用户对数据进行处理(并发送回去)备注:过长的处理程序会影响后面数据的接收

基于FPGA的串口通信电路设计与实现

基于FPGA的串口通信电路设计与实现 发表时间:2018-11-07T09:39:41.587Z 来源:《防护工程》2018年第17期作者:马龙[导读] 由于现代工业企业中在线监测的日益增长。需要PC机与更多设备进行通信,串口通信具有实现简单,使用灵活。数据传输准确等优点。 陕西烽火电子股份有限公司陕西宝鸡 721000 摘要:由于现代工业企业中在线监测的日益增长。需要PC机与更多设备进行通信,串口通信具有实现简单,使用灵活。数据传输准确等优点。在工业监控和实时监控系统中得到了广泛应用。由于监测设备的增加。PC机原有的串口不能再满足通信的需求,传统的设计方法是使用硬件扩展八个串口,但是额外增加了硬件设计成本和实际编程的难度。然而FPGA的UARTIP可灵活定制的优点使得基于黜的设计方法无需额外的硬件串口扩展,减少了硬件开发调试的难度,同时满足串行传输的要求。基于此,本文主要对基于FPGA的串口通信电路设计与实现进行分析探讨。 关键词:基于FPGA;串口通信;电路设计;实现 1、前言 FPGA(Field-Programmable Gate Array),即现场可编程门阵列,它是作为专用集成电路领域中一种半定制电路出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA中具有丰富的触发器和I/O口,采用描述语言(VHDL和VerilogHDL)进行设计,用户可以根据需要,描述出具有各种功能的电路。基于以上原因,我们可以利用FPGA实现多串口通信中的数据转换和中断控制功能,从而简化电路、缩小PCB面积,也可以很方便的进行升级改动和模块移植。 2、设计要求 整个设计的硬件电路以DSP和FPGA为主构架,DSP和FPGA之间通过DSP的EMIF接口连接。其中,DSP是主处理器,用于实现串口数据的处理,FPGA作为DSP的外围电路,实现UART模块的串行数据的接收和发送、数据的串并/并串转换及接收中断的产生,同时,实现多串口的中断控制功能。当有接收数据时,FPGA通过中断方式通知DSP。 UART模块的数据格式:波特率可以按标准波特率设置;按字节接收,每个字节前包含一个起始位(低电平,逻辑值0),无校验位,最后是一位停止位和不定长度的空闲位(高电平,逻辑值1);接收到一个完整字节后产生一个中断(高电平,逻辑值1),当数据被读取后,中断信号复位(低电平,逻辑值0)。中断控制器应能实现8路UART模块的中断接收和处理,最后给DSP输出一个中断信号,输入的各中断信号之间无优先级设定。 3、设计方案 完整的设计由时钟管理模块、接口模块、UART模块和中断控制器组成。时钟管理模块产生设计中所需各种时钟,包括主处理时钟和接收与发送的波特率时钟;接口模块实现DSP和FPGA之间的中断、读写功能;UART模块由接收和发送子模块组成,实现数据的串行接收和串行发送功能;中断控制器由中断采样子模块和中断处理子模块组成,实现8路UART中断接收和处理功能。下面分别对这些模块的设计给予描述。 3.1 时钟管理模块 设输入FPGA的时钟为50MHz,则主处理时钟设计为50MHz。U A R T 的接收和发送采用相同的波特率进行,本设计中采用115200b/s进行收发,这就需要对50MHz时钟进行分频以产生所需的波特率。 3.2 接口模块 接口模块连接时钟管理模块、UART模块和中断处理器,并与DSP采用EMIF总线相连接。与DSP相关的信号有:wr_n、rd_n、cs_n、addrs、data_bus和dsp_int,在cs_n和wr_n有效时,DSP通过addrs选通不同的UART模块,将需要发送的并行数据发送给发送寄存器,执行发送功能。DSP响应外部中断时,在cs_n和rd_n有效时,通过addrs读取中断控制器的中断矢量和UART模块接收的数据。 3.3 UART模块 3.3.1 发送模块 根据UART模块的数据格式,发送状态机如图1所示。

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! 也不知道到底是什么串

基于FPGA的串口通信设计

基于FPGA的UART设计与实现 0引言 通用异步收发器(Universal Asynchronous Receiver /Transmitter , UART) 可以和各种标准串行接口,如RS232和RS485等进行全双工异步通信,具有传输距离远、成本低、可靠性高等优点。一般UART由专用芯片如8250, 16450来 实现,但专用芯片引脚都较多,内含许多辅助功能,在实际使用时往往只需要用到UART 勺基本功能,使用专用芯片会造成资源浪费和成本提高。 一般而言UART和外界通信只需要两条信号线RXD和TXD其中RXD是UART 的接收端,TXD是UART勺发送端,接收与发送是全双工形式。由于可编程逻辑器件技术的快速发展,FPGA勺功能日益强大,其开发周期短、可重复编程的优点也越来越明显,在FPGA 芯片上集成UART功能模块并和其他模块组合可以很方便地实现一个能与其他设备进行串行通信的片上系统。 FPGA(Field Programmable Gate Array) 现场可编程门阵列在数字电路的设 计中已经被广泛使用。这种设计方式可以将以前需要多块集成芯片的电路设计到一块大模块可编程逻辑器件中,大大减少了电路板的尺寸,增强了系统的可靠性和设计的灵活性。 1 UART功能设计 1.1 UART的工作原理 异步通信时,UART发送/接收数据的传输格式表1所示,一个字符单位由开始位、数据位、停止位组成。 表1 UART发送/接收数据的传输格式 异步通信的一帧传输经历以下步骤: (1)无传输。发送方连续发送信号,处于信息“ 1”状态。 (2)起始传输。发送方在任何时刻将传号变成空号,即“1”跳变到“O', 并持续1位时间表明发送方开始传输数据。而同时,接收方收到空号后,开始与发送方同步,并期望收到随后的数据。 (3)奇偶传输。数据传输之后是可供选择的奇偶位发送或接收。 (4)停止传输。最后是发送或接收的停止位,其状态恒为“1”。 发送或接收一个完整的字节信息,首先是一个作为起始位的逻辑“0”位, 接着是8个数据位,然后是停止位逻辑“ 1”位,数据线空闲时为高或“ T状态。起始位

串口通讯方法的三种实现

串口基本信息 用一台电脑实验串口自发自收,实验前要将串口(以9针为例)的发送引脚(2脚)和接受引脚(3脚)短接。 三线连接:适用于计算机之间尤其是PC机和单片机之间的数据通信。其连接信号对为(TxD,RxD)、(RxD,TxD)、(SG,SG)。即发送数据TxD端和接受数据RxD端交叉连接,信号地SG对应连接。 七线交叉连接:适用于同型号的计算机之间的连接,如PC机间的数据通信。其连接信号对为:(TxD,RxD)、(RxD,TxD)、(SG,SG)、(RTS,CTS)、(CTS,RTS)、(DSR.DTR)、(DTR,DSR)。其中,TxD、RxD、SG与前面信号的含义相同,RTS为请求发送,CTS为准许发送,DSR为数据装置准备好,DTR为数据终端准备好。在本地连接的微机系统中,RTS、CTS、DTR、DSR用作硬件联络控制信号。 目前使用的串口连接线有DB9和DB25两种连接器,用户可以国家使用的具体机器选择相应的连接器。 一个串口通讯类在https://www.wendangku.net/doc/f68131250.html,/network/serialport.shtml。 PC机的RS-232接口的电平标准是-12V标示“1”,和+12V表示“0”,有些单片机的信号电平时TTL 型,即大于2.4v表示“1”,小于0.5v表示“0”,因此采用RS-232总线进行异步通信是,发送端和接受端要有一个电平转换接口。 串口通讯方法的三种实现 串口是计算机上一种非常通用的设备通信协议。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS一232口。同时,串口通信协议也可以用于获取远程采集设备的数据。 串口通信(Serial Communication),是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通讯方式。串口通信方便易行,应用广泛。在Windows应用程序的开发中,我们常常需要面临与外围数据源设备通信的问题。计算机和单片机(如MSC—51)都具有串行通信口,可以设计相应的串El通信程序,完成二者之间的数据通信任务。 1串口通讯原理 串口通信的原理非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。 典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其它线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。 2串口通讯实现 在.net平台下使用C#语言实现串口通信的方法主要有三种:第一种方法是采用VB6.0中提供的MSComm控件,这种方法编程简单.但MSComm控件在使用前需要在系统中注册;第二种方法是采用微软在.net2.0及其以后版本提供的内置的串口操作类--System.IO.SerialPort,使用简单,但欠灵活;第三种方法是Windows的API函数,虽然编程难度高,但这种方法可以清楚地掌握串口通信的机制,并且高效、自由、灵活。 无论那种采用方式实现串口通讯,都需要通过以下四个步骤来完成: 1)打开串口 MSComm控件是通过设置PortOpen属性值来打开和关闭串口.具体语法为:MSComm. PortOpen=True/False. SerialPort类则是调用类的Open()和Close()方法来实现串口的打开和关闭。 API函数是通过CreateFile来打开串口.因为在Win32系统中,串口被看作一个文件,使用与文件相同的操作方式进行操作。 2)配置串口

FPGA高速串行通信

FPGA高速串行通信 1 引言 在许多实际运用的场合中,数字信号传输具有数据量大,传输速度高,采用串行传输等特点。这就要求数据收发双方采用合理的编解码方式及高速器件。数字信号传输一般分并行传输、串行传输两种。并行传输具有数据源和数据目的地物理连接方便,误码率低,传输速率高。但是并行传输方式要求各条线路同步,因此需要传输定时和控制信号,而其各路信号在经过转发与放大处理后,将引起不同的延迟与畸变,难以实现并行同步。若采用更复杂的技术、设备与线路,其成本会显著上升。而高速远程数据传输一般采用串行同步传输。传统建立准确的时钟信号的方法是采用锁相环技术。但锁相环有若干个明显缺陷,一是其同步建立时间及调整精度即使采用变阶的方法也很难兼顾;二是锁相环需要一个高精度高频率的本地时钟。本文所讨论的两种串行同步传输方法,无需高频率时钟信号,就可完全数字化。采用Altera公司的ACEXlK系列器件完成电路设计,且外围电路简单,成本低,效果好。 2主要器件介绍 编码和解码采用ACEXlK系列器件EPlK100QC208-2。ACEXlK器件是Altera 公司针对通信、音频处理及类似场合应用而设计的。该系列器件具有如下特性: 高性能。采用查找表(LUT)和嵌入式阵列块(EAB)相结合的结构,适用于实现复杂逻辑功能和存储器功能,例如通信中应用的DSP、多通道数据处理、数据传递和微控制等; 高密度。典型门数为1万到10万门,有多达49 152位的RAM(每个EAB有4 096位RAM)。 系统性能。器件内核采用2.5 V电压,功耗低,其多电压引脚驱动2.5 V、3.3 V、5.0 V的器件,也可被这些电压所驱动,双向I/O引脚执行速度可达250 MHz; 灵活的内部互联。具有快速连续式延时可预测的快速通道互连。

基于FPGA的UART串口接收模块设计.doc

UART串口接收模块设计 实验目标:实现FPGA接收其他设备通过UART协议发送过来的数据。 知识点: 1、URAT通信协议工业环境下数据接收实现。 2、In system sources and probes editor(ISSP)调试工具的使用。 UART发送端发送一个字节数据时序图: 对于其中的每一位进行采样,一般情况下每一位数据的中间点是最稳定的,因此一般应用中, : 采集中间时刻时的数据即可,如下图所示 但是在工业应用中,往往有非常强的电磁干扰,只采样一次就作为该数据的电平判定,是不保险的,有可能恰好采集到被干扰的信号而导致结果出错,因此需要使用多次采样求概率的方式进行。 以下为改进型的单bit数据接收方式示意图: 12345678910111213141516 在这张图中,将每一位数据又平均分成了16小段,对于Bit_x这一位数据,考虑到数据在刚刚发生变化和即将发生变化的这一时期,数据极有可能不稳定的(用红色标出的两段),在这两个时间段采集数据,很有可能得到错误的结果,因此这两段时间的电平无效,采集时直接忽略。而中间这一时间段(用绿色标出),

数据本身是比较稳定的,一般都代表了正确的结果。但是也不排除该段数据受强电磁干扰而出现错误的电平脉冲,因此对这一段电平,进行多次采样,并求高低电平发生的概率,6次采集结果中,取出现次数多的电平作为采样结果。例如,采样6次的结果分别为1/1/1/1/0/1/,则取电平结果为1,若为0/0/1/0/0/0,,则取电平结果为0,当6次采样结果中1和0各占一半(各3次),则可判断当前通信线路环境非常恶劣,数据不具有可靠性。 串口发送模块包含两个主要组件: 1、起始位检测进程(低电平,下降沿) 2、波特率产生模块 3、数据接收模块 串口接收模块整体结构图: 波特率时钟计算:

C语言实现串口通信

摘要: 本文说明了异步串行通信(RS-232)的工作方式,探讨了查询和中断两种软件接口利弊,并给出两种方式的C语言源程序的I/O通道之一,以最简单方式组成的串行双工线路只需两条信号线和一条公共地线,因此串行通信既有线路简单的优点同时也有它的缺点,即通信速率无法同并行通信相比,实际上EIA RS-232C在标准条件下的最大通信速率仅为20Kb/S。 尽管如此,大多数外设都提供了串行口接口,尤其在工业现场 RS-232C的应用更为常见。IBM PC及兼容机系列都有RS-232的适配器,操作系统也提供了编程接口,系统接口分为DOS功能调用和BIOS 功能调用两种:DOS INT 21H的03h和04h号功能调用为异步串行通信的接收和发送功能;而BIOS INT 14H有4组功能调用为串行通信服务,但DOS和BIOS功能调用都需握手信号,需数根信号线连接或彼此间互相短接,最为不便的是两者均为查询方式,不提供中断功能,难以实现高效率的通信程序,为此本文采用直接访问串行口硬件端口地址的方式,用C语言编写了串行通信查询和中断两种方式的接口程序。 1.串行口工作原理 微机串行通信采用EIA RS-232C标准,为单向不平衡传输方式,信号电平标准±12V,负逻辑,即逻辑1(MARKING)表示为信号电平-12V,逻辑0(SPACING)表示为信号电平12V,最大传送距离15米,最大传送速率19.6K波特,其传送序列如图1,平时线路保持为1,传送数据开始时,先送起始位(0),然后传8(或7,6,5)个数据位(0,1),

接着可传1位奇偶校验位,最后为1~2个停止位(1),由此可见,传送一个ASCII字符(7位),加上同步信号最少需9位数据位。 @@T8S12300.GIF;图1@@ 串行通信的工作相当复杂,一般采用专用芯片来协调处理串行数据的发送接收,称为通用异步发送/接收器(UART),以节省CPU的时间,提高程序运行效率,IBM PC系列采用8250 UART来处理串行通信。在BIOS数据区中的头8个字节为4个UART的端口首地址,但DOS 只支持2个串行口:COM1(基地址0040:0000H)和COM2(基地址0040:0002H)。8250 UART共有10个可编程的单字节寄存器,占用7个端口地址,复用地址通过读/写操作和线路控制寄存器的第7位来区分。这10个寄存器的具体功能如下: COM1(COM2) 寄存器 端口地址功能DLAB状态 3F8H(2F8H) 发送寄存器(写) 0 3F8H(2F8H) 接收寄存器(读) 0 3F8H(2F8H) 波特率因子低字节1 3F9H(2F9H) 波特率因子高字节1 3F9H(2F9H) 中断允许寄存器0 3FAH(2FAH) 中断标志寄存器 3FBH(2FBH) 线路控制寄存器 3FCH(2FCH) MODEM控制寄存器 3FDH(2FDH) 线路状态寄存器

相关文档
相关文档 最新文档