串口RS232通信程序

2019-08-01 15:21发布

串口有9个管脚,其中只有三个是最重要的,分别是
下载 (5.47 KB)2009-12-16 23:26 pin 2: RxD (receive data).接收数据 pin 3: TxD (transmit data).发送数据 pin 5: GND (ground).      串行通信时序
我们先来看看字节0x55的发送
下载 (6.28 KB)2009-12-16 23:26 0x55的二进制代码是01010101,但发送时由低字节开始的,因此发送次序依次为1-0-1-0-1-0-1-0. 串行通信电平 ·
"1" is sent using -10V (or between -5V and -15V).
·
"0" is sent using +10V (or between 5V and 15V).

由于计算机RS232的电平与电路板(通常+5V)之间电平的不同所以要用到转换芯片 如果PCB板电源+-5V的话用MAX232 如果PCB板(FPGA)电源是+-3.3V的话用MAX3232 下载 (35.72 KB)2009-12-16 23:26
这个图的串口如果采用母头的话,要用交叉公母线,保证是PCB板上这边的RxD连计算机的TxD(3 Pin),PCB板这边的TxD连计算机的RxD(2 Pin).
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
19条回答
thf2008
1楼-- · 2019-08-01 19:02
怎么图片都显示不了?只能麻烦大家打开图片来看了
thf2008
2楼-- · 2019-08-01 19:50
继续
thf2008
3楼-- · 2019-08-01 22:51
串行通信波特率这里要弄清楚波特率与比特率的差别:比特率是数字信号的传输速率,它用单位时间内传输的二进制代码的有效位(bit)数来表示,其单位为每秒比特数bit/s(bps)、每秒千比特数(Kbps)或每秒兆比特数(Mbps)来表示(此处K和M分别为1000和1000000,而不是涉及计算机存储器容量时的1024和1048576)。波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,其单位为波特(Baud)。
波特率与比特率的关系为:比特率=波特率X单个调制状态对应的二进制位数两相调制(单个调制状态对应1个二进制位)的比特率等于波特率;四相调制(单个调制状态对应2个二进制位)的比特率为波特率的两倍;八相调制(单个调制状态对应3个二进制位)的比特率为波特率的三倍;依次类推。对于串行通信来说,或者说是对于普通的数字电路来说,都是两相调制(单个调制状态对应1个二进制位),因此波特率=比特率(通常叫波特率)。
PS
:可以看看下面图就知道什么是四相调制。
下载 (34.49 KB)2009-12-16 23:35 如果系统时钟是1.8432MHz,那16分频就得到115200Hz reg
[3:0] BaudDivCnt;
always @(posedge clk) BaudDivCnt <= BaudDivCnt + 1;

wire BaudTick = (BaudDivCnt==15);
thf2008
4楼-- · 2019-08-02 04:29
[localimg=180,145]5[/localimg]  

其中Baud<<BaudGeneratorAccWidth,Baud左移BaudGeneratorAccWidth位,相当于Baud乘以2的BaudGeneratorAccWidth次方。

参照上面的程序与公式推导可以把程序修改如下:

parameter
ClkFrequency = 25000000; // 25MHz
parameter Baud = 115200;
parameter BaudGeneratorAccWidth = 16;
parameter BaudGeneratorInc = (Baud<<BaudGeneratorAccWidth)/ClkFrequency;

reg [BaudGeneratorAccWidth:0] BaudGeneratorAcc;
always @(posedge clk)
  BaudGeneratorAcc <= BaudGeneratorAcc[BaudGeneratorAccWidth-1:0] + BaudGeneratorInc;

wire BaudTick = BaudGeneratorAcc[BaudGeneratorAccWidth];




当要注意的是,上面程序中BaudGeneratorInc的计算公式出错,因为在Verilog语言中中间结果只能32位,而这个公式计算的结果超过了32位。所以要把这行改为

parameter
BaudGeneratorInc = ((Baud<<(BaudGeneratorAccWidth-4))+(ClkFrequency>>5))/(ClkFrequency>>4);




程序改变,得到的波特率不变。
thf2008
5楼-- · 2019-08-02 08:29
 精彩回答 2  元偷偷看……
thf2008
6楼-- · 2019-08-02 14:26
希望对大家有用

一周热门 更多>