当前位置:文档之家› 模拟串口全双工

模拟串口全双工

模拟串口全双工
模拟串口全双工

/*由于mega16串口就一个在节省成本情况下应邀用普通IO口模拟串口通信,下面是128的实例程序,实现了全双工通信,不过占用两个定时器和一个外部中断资源,仅供考虑

*/

/*

作者:青檐铃风

2012.5.13

*/

// Target : Mega128

// Crystal: 8.0000Mhz

#include

#include

#define U8 unsigned char

#define bool unsigned char

#define U16 unsigned int

#define time1init TCNT1H=0XF9; TCNT1L=0X7D;//2400BIT/S 初值=0xFFFF-(1000000/baud/2)*8

#define time3init TCNT3H=0XF9; TCNT3L=0X7D;//2400BIT/S

/*++++++++++++++++++++++++++++++++++=宏定义=++++++++++++++++++++++++++++++++++++*/

U8 vmRS232;// 记录模拟串口接收脚的高低电平

// 脚定义

#define GET_VM232_RX() (PIND &0x01) // 端口D的PD0模拟接收

#define SET_VM232_TX() {PORTA|=BIT(0);} // 端口A的PA0发送

#define CLR_VM232_TX() {PORTA&=~BIT(0);} // 端口A的PA0发送

/*++++++++++++++++++++++=++++++++++++++++++++++++*/

// 模拟串口的状态码

enum {

START,//接收起始位

SDATA,//数据位

STOP,//停止位标志

U8 inRS232 = 0; // 模拟232的数据接收输入指针

U8 outRS232 = 0; // 模拟232的数据接收取出指针

U8 vmRS232Buf[20]={0}; // 模拟232的数据接收缓冲区

U8 data=0;

void delay(unsigned int x)

{

unsigned int i,j;

for(i=x;i>0;i--)

for(j=0;j<330;j++);

}

void vm_rs232_rx(void) // 模拟232接收函数flag标志是否有接收到起始位

{

static U8 status = START;//静态变量每次进入时不会重新初始化

static U8 cnt = 0;//三中取二的计数标志

static U8 number = 0;//八位数据位标志

static U8 rData;//读到的数据暂存地

switch(status)

{

case START:

if(++cnt >=1)

{

cnt = 0;

number = 0;

status = SDATA;

}

break;

case SDA TA:

if(++cnt >=2)

{

cnt = 0;

if((PIND&0x01))

{

rData |= 0x80;

}

else

{

rData &= 0x7F;

}

if(++number<8)//因为串口接收数据时从低位到高位的所以每次读出访在高位在一次右移一位

{

rData >>= 1;

}

if(number==8)

{

number = 0;

status = STOP;

}

}

break;

case STOP:

if(++cnt>=1)

{

cnt = 0;

vmRS232Buf[inRS232++] =rData;//保存读到的数据

if(inRS232==20)

inRS232=0;

PORTA|=BIT(1);

status = START;//

vmRS232=0;//取消读标志

//TIMSK&=~BIT(2);//关定时器发送

EIMSK=0x01; //开外部中断int_0,对应按键K20

}

break;

default:

cnt = 0;

status = START;

break;

}

}

///////////////////////////////////////////发送函数/////////////////////////////

bool flgVmRs232tx = 0; // 模拟232是否有数据要发送的标志,1有数据要发送,完成清零U8 vmRS232SBUF;// 模拟232要发送的一字节缓冲

void vm_rs232_tx(void) // 模拟232发送函数

{

static U8 status = START;

static U8 cnt = 0;

static U8 number = 0;

if(flgVmRs232tx)

{

switch(status)

{

case START:

CLR_VM232_TX();

if(++cnt >=2)

{

cnt = 0;

status = SDATA;

}

break;

case SDA TA:

if(vmRS232SBUF & 0x01)

{

SET_VM232_TX();

}

else

{

CLR_VM232_TX();

}

if(++cnt >=2)

{

cnt = 0;

if(++number <=8)

{

vmRS232SBUF >>= 1;

}

else

{

number = 0;

status = STOP;

}

}

break;

case STOP:

SET_VM232_TX();

if(++cnt >=2)

{

cnt = 0;

status = START;

flgVmRs232tx = 0;

// ETIMSK&=~BIT(2);// 关中断//关了接收数据多了就会出错

//EIMSK=0x01; //开外部中断int_0,对应按键K20

}

break;

default:

SET_VM232_TX();

cnt = 0;

status = START;

flgVmRs232tx = 0;

break;

}

}

}

// 波特率都是2400BIT/S ,416US/BIT

// 3中取2 ,每208US抽样

// 208US中断采样1个模拟串口

void timer1_init(void)

{

TCCR1B=0X01;//没分频2;//8M 8分频/

// TCNT1H=0XFF;

// TCNT1L=0X30;//38400BIT/S//30;2400BIT/S

time1init

TIMSK|=BIT(2);

// SREG|=BIT(7);

}

void timer3_init(void)

{

TCCR3B=0X01;//没分频02;//8M 8分频/

TCCR3A=0X00;

//TCNT3H=0XFF;

//TCNT3L=0X30;

time3init

ETIMSK|=BIT(2);

// SREG|=BIT(7);

}

/*+++++++++++++++++++++++++++++++++= MAIN =++++++++++++++++++++++++++++++++++++++*/

void port_init(void)

{

DDRA = 0x07;//PA0为输出口

PORTA = 0x07;//PA0输出1

DDRD = 0x00; //PD0输读入模拟rxd

PORTD = 0x03;//PD0输入口上拉

}

void init_devices(void)

{

//stop errant interrupts until set up

CLI(); //disable all interrupts

port_init();

timer1_init();

timer3_init();

// MCUCR = 0x00;

EICRA=0x00;//低电平触发成功2;//下降沿触发失败

EIMSK=0x01; //开外部中断int_0,对应按键K20

SEI();//re-enable interrupts

//all peripherals are now initialized

}

void main(void)

{

init_devices();

// 收到什么就回发什么

while(1)

{

// while((PIND&0x02))

while(flgVmRs232tx==1); //等待发送完再转载

if(outRS232!=inRS232)//vmRS232SBUF!=data)

{

vmRS232SBUF=vmRS232Buf[outRS232++];

if(outRS232==20)

outRS232=0;

//TCNT3H=0XFF;

//TCNT3L=0X30;

time3init

// data=vmRS232Buf[0];

flgVmRs232tx=1;

//ETIMSK|=BIT(2);//发送关了会不能及时接收数据长了会漏接}

// }

}

}

////////////////////////////////////////

#pragma interrupt_handler ext_int0_isr:2 //指定外部中断函数

void ext_int0_isr(void)

{

// TCNT1H=0XFF;

// TCNT1L=0X30;

time1init

//TIMSK&=~BIT(2);

//TIMSK|=BIT(2);

PORTA&=~BIT(1);

vmRS232=1;

//TIMSK|=BIT(2);

EIMSK=0x00;//关外部中断int_0,对应按键K20

}

////////////////////////////////

#pragma interrupt_handler time1_isr:15 //定时器1溢出

void time1_isr(void)

{

//TCNT1H=0XFF;

// TCNT1L=0X30;

time1init

// 在这采样接收脚保证不漂移

if(vmRS232)//判断是否需要读

{

vm_rs232_rx();

}

/* if(flgVmRs232tx)

{

vm_rs232_tx();

} */

}

#pragma interrupt_handler time3_isr:30//定时器3溢出

void time3_isr(void)

{

// TCNT3H=0XFF;

// TCNT3L=0X30;

time3init

// 在这采样接收脚保证不漂移

if(flgVmRs232tx)

{

vm_rs232_tx();

}

}

/*++++++++++++++++++++++++++++++++++=end=++++++++++++++++++++++++++++++ ++++++++++*/

KEIL中如何用虚拟串口调试串口程序

KEIL中如何用虚拟串口调试串口程序 发表于2008/5/7 15:30:22 以前没接触过串口,一直都以为串口很复杂。最近在做一个新项目,用单片机控制GSM模块。单片机和GSM模块接口就是串口。调试完后觉得串口其实很简单。“不过如此”。这可能是工程师做完一个项目后的共同心态吧。下面详细介绍下如何用虚拟串口调试串口发送接收程序。 需要用到三个软件:KEIL,VSPD XP5(virtual serial ports driver xp5.1虚拟串口软件),串口调试助手。 1、首先在KEIL里编译写好的程序。 2、打开VSPD,界面如下图所示: 左边栏最上面的是电脑自带的物理串口。点右边的add pair,可以添加成对的串口。一对串口已经虚拟互联了,如果添加的是COM3、COM4,用COM3发送数据,COM4就可以接收数据,反过来也可以。 3、接下来的一步很关键。把KEIL和虚拟出来的串口绑定。现在把COM3和KEIL 绑定。在KEIL中进入DEBUG模式。在最下面的COMMAND命令行,输入MODE COM3 4800,0,8,1(设置串口3的波特率、奇偶校验位、数据位、停止位,打开COM3串口,注意设置的波特率和程序里设置的波特率应该一样)ASSIGN COM3 SOUT(把单片机的串口和COM3绑定到一起。因为我用的单片机是AT892051,只有一个串口,所以用SIN,SOUT,如果单片机有几个串口,可以选择S0IN,S0OUT,S1IN,S1OUT。)

4、打开串口调试助手 可以看到虚拟出来的串口COM3、COM4,选择COM4,设置为波特率4800,无校验位、8位数据位,1位停止位(和COM3、程序里的设置一样)。打开COM4。 现在就可以开始调试串口发送接收程序了。可以通过KEIL发送数据,在串口调试助手中就可以显示出来。也可以通过串口调试助手发送数据,在KEIL中接收。这种方法的好处是不用硬件就可以调试。这是网上一篇文章介绍的方法,联系我实际的使用做了整理。有用的着的人就不用继续摸索了

全双工与半双工知识

全双工与半双工知识 半双工定义 半双工(Half Duplex)数据传输指数据可以在一个信号载体的两个方向上传输,但是不能同时传输。例如,在一个局域网上使用具有半双工传输的技术,一个工作站可以在线上发送数据,然后立即在线上接收数据,这些数据来自数据刚刚传输的方向。像全双工传输一样,半双工包含一个双向线路(线路可以在两个方向上传递数据)。 数据通信中,数据在线路上的传送方式可以分为单工通信、半双工通信和全双工通信三种。 半双工通信:半双工通信是指数据可以沿两个方向传送,但同一时刻一个信道只允许单方向传送,因此又被称为双向交替通信。若要改变传输方向,需由开关进行切换。半双工方式要求收发两端都有发送装置和接收装置。由于这种方式要频繁变换信道方向,故效率低,但可以节约传输线路。半双工方式适用于终端与终端之间的会话式通信。 半双工即Half duplex Communication,是指在通信过程的任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在。采用半双工方式时,通信系统每一端的发送器和接收器,通过收/发开关转接到通信线上,进行方向的切换,因此,会产生时间延迟。收/发开关实际上是由软件控制的电子开关。 当计算机主机用串行接口连接显示终端时,在半双工方式中,输入过程和输出过程使用同一通路。有些计算机和显示终端之间采用半双工方式工作,这时,从键盘打入的字符在发送到主机的同时就被送到终端上显示出来,而不是用回送的办法,所以避免了接收过程和发送过程同时进行的情况。 编辑本段半双工解析 半双工传输是指接收与发送共用一个载波信道,但同一时刻只能发送或只能接收数据的传输方式。例如,局域网中的半双工数据传输方式是指:一个工作站发送数据,然后立即在同一信道上接收来自相同方向上的数据。另一方面,全双工传输(Full Duplex Transmission)指同时发生在两个方向上的一种数据传输方式。 例如:无线电话机就是一种半双工设备,在同一时间内只允许一方讲话。相反,电话机则是一种全双工设备,其通话双方可以同时进行对话。当某局域网中的两台计算机在实现通信时,同一时刻只能在同一方向上传送数据,这是因为大多数局域网中使用的基带网络都只支持单个信号。换句话说,基带网络采用的是半双工工作模式。 只要有合适的设备支持,在某些特定类型的局域网中实现全双工通信是完全可能的。关键是首先解决每个方向上的通信流量信道问题。该问题能否解决主要取决于所使用的网络媒体。如:同轴电缆是由中心导体、绝缘材料层、网状织物构成的屏蔽层以及外部隔离材料层组成,所以其不具备在两个方向上同时运行通信流量的物理方式,除非每次连接时另安装两根电缆这样也可支持运行。另一方面,双绞线电缆由两根具有绝缘保护层的铜导线组成,所以在理论上,使用双绞线电缆作为媒体的网络能

单片机模拟串口

随着单片机的使用日益频繁,用其作前置机进行采集和通信也常见于各种应用,一般是利用前置机采集各种终端数据后进行处理、存储,再主动或被动上报给管理站。这种情况下下,采集会需要一个串口,上报又需要另一个串口,这就要求单片机具有双串口的功能,但我们知道一般的51系列只提供一个串口,那么另一个串口只能靠程序模拟。 本文所说的模拟串口,就是利用51的两个输入输出引脚如P1.0和P1.1,置1或0分别代表高低电平,也就是串口通信中所说的位,如起始位用低电平,则将其置0,停止位为高电平,则将其置1,各种数据位和校验位则根据情况置1或置0。至于串口通信的波特率,说到底只是每位电平持续的时间,波特率越高,持续的时间越短。如波特率为9600BPS,即每一位传送时间为1000ms/9600=0.104ms,即位与位之间的延时为为0.104毫秒。单片机的延时是通过执行若干条指令来达到目的的,因为每条指令为1-3个指令周期,可即是通过若干个指令周期来进行延时的,单片机常用11.0592M的的晶振,现在我要告诉你这个奇怪数字的来历。用此频率则每个指令周期的时间为(12/11.0592)us,那么波特率为9600BPS每位要间融多少个指令周期呢?指令周期s=(1000000/9600)/(12/11.0592)=96,刚好为一整数,如果为4800BPS则为96x2=192,如为19200BPS则为48,别的波特率就不算了,都刚好为整数个指令周期,妙吧。至于别的晶振频率大家自已去算吧。现在就以11.0592M的晶振为例,谈谈三种模拟串口的方法。 方法一:延时法 通过上述计算大家知道,串口的每位需延时0.104秒,中间可执行96个指令周期。 #define uchar unsigned char sbit P1_0 = 0x90; sbit P1_1 = 0x91; sbit P1_2 = 0x92; #define RXD P1_0 #define TXD P1_1 #define WRDYN 44 //写延时 #define RDDYN 43 //读延时 //往串口写一个字节 void WByte(uchar input) { uchar i=8; TXD=(bit)0; //发送启始 位 Delay2cp(39); //发送8位数据位 while(i--) { TXD=(bit)(input&0x01); //先传低位 Delay2cp(36); input=input>>1; } //发送校验位(无)

单工,半双工,全双工的含义及区别

1、单工 单工就是指A只能发信号,而B只能接收信号,通信是单向的,就象灯塔之于航船——灯塔发出光信号而航船只能接收信号以确保自己行驶在正确的航线上。 2、半双工 半双工就是指A能发信号给B,B也能发信号给A,但这两个过程不能同时进行。最典型的例子就象我们在影视作品中看到的对讲机一样: 007:呼叫总部,请求支援,OVER 总部:收到,增援人员将在5分钟内赶到,OVER 007:要5分钟这么久?!要快呀!OVER 总部:…… GAME OVER 在这里,每方说完一句话后都要说个OVER,然后切换到接收状态,同时也告之对方——你可以发言了。如果双方同时处于收状态,或同时处于发状态,便不能正常通信了。 3、全双工 全双工比半双工又进了一步。在A给B发信号的同时,B也可以给A发信号。典型的例子就是打电话。 A:我跟你说呀…… B:你先听我说,情况是这样的…… A和B在说的同时也能听到对方说的内容,这就是全双工。 对于全双工以太,IEEE制订了802.3x全双工/流控制标准,该标准对全双工方式下的流控制机制做了具体的规定。在各以太标准(10/100/1000 Base)中,除100 Base T4之外,均具有全双工能力,但在实际应用中,似乎只有Gb以太(即千兆以太)才使用全双工方式。

以太网的MAC协议是CSMA/CD,但在全双工以太中是不需要冲突检测(CD)的。这能使Gb以太突破40余米的段长限制(更准确地说是41.2m,这个数据可以根据IEEE定时规则的限制计算出来,这里就不详细介绍了)。在实际应用中如果需要网络中的某个站点能工作在全双工方式下,则必须在该站点安装支持全双工的网卡,并要求与全双工站点连接的HUB/路由器等连网设备配备有全双工端口。 这样看来,如果希望工作在全双工方式下,首先要有硬件的支持。 全双工以太的主要优势在于它能够在二个独立的信道上同时实现二个方向上的数据传输,借以提高链路的总带宽,所以它只适用于文件服务器一类的需要同时进行双向数据传输的站点。对于一般只进行单向数据传输的站点,全双工以太并无优势可言,所以全双工以太在应用上有很大的局限性。全双工以太主要用在交换机互连的场合,尤其是Gb以太交换机。Win2K中,网卡与双工相关的设置在本地连接 - 属性 - 配置 - 高级里有一项“Link Speed & Duplex”,其值一般都是“Auto Detect”。建议不做改动。 交换机上有Duplex灯,如果亮表示工作在双工方式。目前,绝大多数的交换机均能自动识别与支持双工方式,无需手工设置。 半双工 科技名词定义 中文名称:半双工 英文名称:half duplex 定义:

单工半双工全双工的含义及区别

单工半双工全双工的含 义及区别 Company number:【0089WT-8898YT-W8CCB-BUUT-202108】

1、单工 单工就是指A只能发信号,而B只能接收信号,通信是单向的,就象灯塔之于航船——灯塔发出光信号而航船只能接收信号以确保自己行驶在正确的航线上。 2、半双工 半双工就是指A能发信号给B,B也能发信号给A,但这两个过程不能同时进行。最典型的例子就象我们在影视作品中看到的对讲机一样: 007:呼叫总部,请求支援,OVER 总部:收到,增援人员将在5分钟内赶到,OVER 007:要5分钟这么久!要快呀!OVER 总部:…… GAME OVER 在这里,每方说完一句话后都要说个OVER,然后切换到接收状态,同时也告之对方——你可以发言了。如果双方同时处于收状态,或同时处于发状态,便不能正常通信了。3、全双工 全双工比半双工又进了一步。在A给B发信号的同时,B也可以给A发信号。典型的例子就是打电话。 A:我跟你说呀…… B:你先听我说,情况是这样的…… A和B在说的同时也能听到对方说的内容,这就是全双工。 对于全双工以太,IEEE制订了全双工/流控制标准,该标准对全双工方式下的流控制机制做了具体的规定。在各以太标准(10/100/1000 Base)中,除100 Base T4之外,均

具有全双工能力,但在实际应用中,似乎只有Gb以太(即千兆以太)才使用全双工方式。 以太网的MAC协议是CSMA/CD,但在全双工以太中是不需要冲突检测(CD)的。这能使Gb以太突破40余米的段长限制(更准确地说是41.2m,这个数据可以根据IEEE定时规则的限制计算出来,这里就不详细介绍了)。在实际应用中如果需要网络中的某个站点能工作在全双工方式下,则必须在该站点安装支持全双工的网卡,并要求与全双工站点连接的HUB/路由器等连网设备配备有全双工端口。 这样看来,如果希望工作在全双工方式下,首先要有硬件的支持。 全双工以太的主要优势在于它能够在二个独立的信道上同时实现二个方向上的数据传输,借以提高链路的总带宽,所以它只适用于文件服务器一类的需要同时进行双向数据传输的站点。对于一般只进行单向数据传输的站点,全双工以太并无优势可言,所以全双工以太在应用上有很大的局限性。全双工以太主要用在交换机互连的场合,尤其是Gb 以太交换机。 Win2K中,网卡与双工相关的设置在本地连接 - 属性 - 配置 - 高级里有一项“Link Speed & Duplex”,其值一般都是“Auto Detect”。建议不做改动。 交换机上有Duplex灯,如果亮表示工作在双工方式。目前,绝大多数的交换机均能自 动识别与支持双工方式,无需手工设置。 半双工 科技名词定义 中文名称:

用单片机普通I_O口模拟串口的一种方法

电子报/2005年/12月/18日/第011版 单片机应用 用单片机普通I/O口模拟串口的一种方法 南昌李春玲 MCS-51系列单片机片内有一个串行I/O端口,通过引脚RXD (P3.0)和TXD(P3.1)与外设进行全双工的串行异步通信。串行端口有四种基本工作方式:方式0主要用于外接移位寄存器,以扩展单片机的I/O接口;方式1多用于双机之间或与外设的通信;方式2、方式3除有方式1的功能外,还可用作主从式多机通信,构成分布式多机系统。 在应用系统中,若需要多个串口,且各串口工作方式要求不同,如:通信波特率不一样,通常的方法是扩展一片可编程串行接口芯片,如8251或8250,但这样增加了硬件开销,且需要占用较多的I/O资源。本文介绍一种用单片机普通I/O口模拟串口的方法。 以A、B两个单片机之间的串行通信为例,电路如图1所示。使用了P1口中的3条普通I/O口,其中P1.0为串行发送端(模拟TXD),P1.1为串行接收端(模拟RXD),P1.2作为对方单片机的中断申请信号INTO的输入线(模拟内部串行口中断源RI/TI)。 串行通信信息帧的发送与接收由软件编程实现。工作过程如下(以A机发送、B机接收为例): 1.A机从P1.2口输出中断申请信号。 2.A机通过P1.0口发送一帧模拟信息。串行通信采用异步传送格式:包括1位起始位(低电平)、7或8位数据编码、1位奇偶校验位(可不要)、1位停止位(高电平)。串行通信中,如果数据传送的波特率为1200bps,则每位信息维持时间为0.833ms。 程序段TTXD完成上述发送功能。信息帧为10位(1位起始位、8位数据编码、无奇偶校验位、1位停止位)。 3.B机接收到INTO的中断申请信号后,自动进入中断服务程序,同步进行模拟异步接收。当P1.1口从高变低时,说明一帧开始,然后依次接收8位数据编码,采样数据在每一位的中间进行,故接收与发送要错开半位,最后检测到高电平后,跳出中断。一次中断完成一帧信息的接收,获得一个字节的数据。 INTO的中断服务程序段RRXD完成上述接收功能。 程序清单如下: TTXD:MOV A,#DATA;发送字节送A CLR P1.2;送中断申请信号 SETB P1.0 LCALL DELAY417

单片机IO口模拟串口程序(发送+接收)

前一阵一直在做单片机的程序, 由于串口不够,需要用10 口来模拟出一个串口。 经过若干曲 折并参考了一些现有的资料,基本上完成了。现在将完整的测试程序,以及其中一些需要总 结的部分 贴出来。 程序硬件平台:11.0592M 晶振,STC 单片机(兼容51) /*************************************************************** * 在单片机上模拟了一个串口,使用 P2.1作为发送端 * 把单片机中存放的数据通过 P2.1作为串口 TXD 发送出去 ***************************************************************/ #in elude #i nclude #in clude typedef unsigned char uchar; int i; uchar code in fo[]= { 0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x5 5 }; // SCON: serail mode 1,8-bit UART // T0工作在方式1,十六位定时 // SMOD=1; 0xFE; II 定时器0初始值,延时417us ,目的是令模拟串口的波特率为 2400bps fosc=11.0592MHz TL0 = 0x7F; II 2400bps fosc=11.0592MHz II TH0 = 0xFD; II 定时器0初始值,延时417us ,目的是令模拟串口的波特率 为 2400bps fosc=18.432MHz II TL0 = 0x7F; II 定时器0初始值,延时417us ,目的是令模拟串口的波特率为 2400bps fosc=18.432MHz } void WaitTF0( void ) { sbit n ewTXD = P2A 1; 〃模拟串口的发送端设为 P2.1 void Uartlnit() { SCON = 0x50; TMOD |= 0x21; PCON |= 0x80; TH0 定时器0初始值,延时417us ,目的是令模拟串口的波特率为

单工,半双工,全双工的含义及区别

单工,半双工,全双工的 含义及区别 Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】

1、单工单工就是指A只能发信号,而B只能接收信号,通信是单向的,就象灯塔之于航船——灯塔发出光信号而航船只能接收信号以确保自己行驶在正确的航线上。 2、半双工半双工就是指A能发信号给B,B也能发信号给A,但这两个过程不能同时进行。最典型的例子就象我们在影视作品中看到的对讲机一样:007:呼叫总部,请求支援,O V E R 总部:收到,增援人员将在5分钟内赶到,O V E R 007:要5分钟这么久!要快呀!O V E R 总部:…… G A M E O V E R 在这里,每方说完一句话后都要说个OVER,然后切换到接收状态,同时也告之对方——你可以发言了。如果双方同时处于收状态,或同时处于发状态,便不能正常通信了。3、全双工全双工比半双工又进了一步。在A给B发信号的同时,B也可以给A发信号。典型的例子就是打电话。

A:我跟你说呀…… B:你先听我说,情况是这样的…… A和B在说的同时也能听到对方说的内容,这就是全双工。对于全双工以太,IEEE制订了全双工/流控制标准,该标准对全双工方式下的流控制机制做了具体的规定。在各以太标准(10/100/1000 Base)中,除100 Base T4之外,均具有全双工能力,但在实际应用中,似乎只有Gb以太(即千兆以太)才使用全双工方式。 以太网的MAC协议是CSMA/CD,但在全双工以太中是不需要冲突检测(CD)的。这能使Gb以太突破40余米的段长限制(更准确地说是41.2m,这个数据可以根据IEEE定时规则的限制计算出来,这里就不详细介绍了)。在实际应用中如果需要网络中的某个站点能工作在全双工方式下,则必须在该站点安装支持全双工的网卡,并要求与全双工站点连接的HUB/路由器等连网设备配备有全双工端口。这样看来,如果希望工作在全双工方式下,首先要有硬件的支持。全双工以太的主要优势在于它能够在二个独立的信道上同时实现二个方向上的数据传输,借以提高链路的总带宽,所以它只适用于文件服务器一类的需要同时进行双向数据传输的站点。对于一般只进行单向数据传输的站点,全双工以太并无优势可言,所以全双工以太在应用上有很大的局限性。全双工以太主要用在交换机互连的场合,尤其是G b以太交换机。

STC单片机虚拟串口发送程序(超简单)

STC单片机(STC12C5A32S)虚拟串口发送程序 //虚拟串口发送子函数 void Uart(uint8 a) { ACC=a; //TXD3是已经定义的任意的发送端口 TR1=1; TXD3=0; //发送起始位 while(TF1==0); TF1=0; //TF1必须清零,因为只有启用T1中断才会自动清零 TXD3=ACC0; //发送8个位也可以用移位来发送,ACC0-ACC7也必须先定义 while(TF1==0); //表示ACC的8个位,如果用移位发送,就不用这样定义。 TF1=0; TXD3=ACC1; while(TF1==0); TF1=0; TXD3=ACC2; while(TF1==0); TF1=0; TXD3=ACC3; while(TF1==0); TF1=0; TXD3=ACC4; while(TF1==0); TF1=0; TXD3=ACC5; while(TF1==0); TF1=0; TXD3=ACC6; while(TF1==0); TF1=0; TXD3=ACC7; while(TF1==0); TF1=0; TXD3=1; //发送停止位 while(TF1==0); TF1=0; TR1=0; } 该子函数使用T1定时器,T0也可以。采用8位自动重装,重装值为A0 Main() { TMOD = 0x21; //T0:模式1,16位定时器。T1:模式2,8位定时器,自动重装AUXR &= 0x3f; //定时器0和定时器1与普通8051定时器一样(不同的单片机设置可能

不同) TL1 = 0xa0; //虚拟串口波特率:9600 TH1 = 0xa0; ET0 = 1; ET1 = 0; //T1中断一定不要使用,要不接收会错误 TR0 = 1; TR1 = 0; Uart(0xaa); //0xaa是发送的数据,如果接收有误,在发送一个字节后可加点延时//延时 While(1); //具体程序此处省略 } 注:因本人实验的硬件不需要模拟串口来接收数据,故没给出虚拟串口接收程序。 以上程序已验证成功。

51单片机模拟spi串行接口程序

51单片机模拟spi串行接口程序 51单片机模拟spi串行接口程序,在keilc51下编写 sbit CS=P3^5; sbit CLK= P1^5; sbit DataI=P1^7; sbit DataO=P1^6; #define SD_Disable() CS=1 //片选关 #define SD_Enable() CS=0 //片选开 unsigned char SPI_TransferByte(unsigned char val) { unsigned char BitCounter; for(BitCounter=8; BiCounter!=0; BitCounter--) { CLK=0; DataI=0; // write if(val&0x80) DataI=1; val<<=1; CLK=1; if(DataO)val|=1; // read } CLK=0; return val; }sbit CLK= P1^5; sbit DataI=P1^7;

sbit DataO=P1^6; #define SD_Disable() CS=1 //片选关 #define SD_Enable() CS=0 //片选开 unsigned char SPI_TransferByte(unsigned char val) { unsigned char BitCounter; for(BitCounter=8; BiCounter!=0; BitCounter--) { CLK=0; DataI=0; // write if(val&0x80) DataI=1; val<<=1; CLK=1; if(DataO)val|=1; // read } CLK=0; return val; } sbit CLK= P1^5; sbit DataI=P1^7; sbit DataO=P1^6; #define SD_Disable() CS=1 //片选关 #define SD_Enable() CS=0 //片选开

全双工与半双工

网络的全双工与半双工 平时我们经常会说:“这个网络是10Mbps的,那个网络是100Mbps的”。但如果我问你:“这10Mbps、100Mbps是指的全双工呢?还是半双工呢?”也许你就回答不上来了。是的,关于网络的“双工”问题,真正弄清楚的人并不多,很多从事组网或网络管理工作多年的技术人员,也无法说清楚“全双工”和“半双工”的具体含义和差别。难道这很深奥吗?不!只是我们平时没有在意这个问题罢了。现在,我们就来谈谈网络的“全双工”和“半双工”。 一、什么是“全双工”、“半双工”所谓“双工”,是“双向工作”的意思。与电视和广播的单向工作不同,计算机网络有数据发送,也有数据接收,所以必然是双向的,因此也就是双工的。关于声卡的全双工和半双工,想必大家都清楚,声卡的录音(声音进入)和播放(声音输出)能同时进行就是全双工声卡,不能就是半双工声卡。网络的全双工和半双工也是同样的道理。如果在发送数据的同时也能够接收数据,那么网络就是“全双工网络”;如果发送和接收数据在同一时刻只能进行其一,那么网络就是“半双工网络”。 二、双工网络带宽如何计算那么,我们平时所说的“10Mbps、100Mbps”是指全双工带宽呢?还是半双工带宽呢?我这样回答你:我们所说的十兆以太网、百兆以太网、千兆以太网,甚至新近出现的万兆以太网,都是指在一个回路上的网络带宽,即单向带宽。 现在的双绞线网络使用两对线分别用于数据的发送和接收,也就是说具有两个回路。既然双绞线有两个回路,那么是不是说100Mbps双绞线网络的实际带宽就是200Mbps呢?实际上并非绝对如此,这要看这两个回路是否处于“全双工”工作状态,即发送线对和接收线对同时在工作。 在全双工双绞线网络中,接收线对和发送线对同时在工作,每一线对的带宽都是100Mbps,这样在双绞线网络中,实际传送的带宽是200Mbps。就像双向车道一样,车辆流量的计算应是两个方向的车辆流量之和,网络带宽的计算也是如此。 在半双工双绞线网络中,在某一时刻,如果发送线对处于发送状态,则接收线对只能处于闲置状态,即使在物理线路上允许接收也不行,因为是不是全双工状态取决于与双绞线连接的网络设备是否支持全双工,而双绞线只是提供了物理介质而已。打个浅显的比方,高速公路都是双向(即双工)的,但是如果高速公路两端的收费站都只有一个车道,同一时刻只能有一辆车驶入或驶出,那么双向车道又有什么用呢?所以,100Mbps的半双工网络的带宽是

51单片机IO口模拟串口通讯C源程序

51单片机IO口模拟串口通讯C源程序 #include sbit BT_SND =P1^0; sbit BT_REC =P1^1; /********************************************** IO 口模拟232通讯程序 使用两种方式的C程序占用定时器0 **********************************************/ #define MODE_QUICK #define F_TM F0 #define TIMER0_ENABLE TL0=TH0; TR0=1; #define TIMER0_DISABLE TR0=0; sbit ACC0= ACC^0; sbit ACC1= ACC^1; sbit ACC2= ACC^2; sbit ACC3= ACC^3; sbit ACC4= ACC^4; sbit ACC5= ACC^5; sbit ACC6= ACC^6; sbit ACC7= ACC^7; void IntTimer0() interrupt 1 { F_TM=1; } //发送一个字符 void PSendChar(unsigned char inch) { #ifdef MODE_QUICK ACC=inch; F_TM=0; BT_SND=0; //start bit TIMER0_ENABLE; //启动 while(!F_TM); BT_SND=ACC0; //先送出低位

F_TM=0; while(!F_TM); BT_SND=ACC1; F_TM=0; while(!F_TM); BT_SND=ACC2; F_TM=0; while(!F_TM); BT_SND=ACC3; F_TM=0; while(!F_TM); BT_SND=ACC4; F_TM=0; while(!F_TM); BT_SND=ACC5; F_TM=0; while(!F_TM); BT_SND=ACC6; F_TM=0; while(!F_TM); BT_SND=ACC7; F_TM=0; while(!F_TM); BT_SND=1; F_TM=0; while(!F_TM); TIMER0_DISABLE; //停止timer #else unsigned char ii; ii=0; F_TM=0; BT_SND=0; //start bit

串行通讯简单认识 单工、半双工和全双工的定义

串行通讯简单认识单工、半双工和全双工的定义 串行通讯简单认识 串行通讯的基本概念:与外界的信息交换称为通讯。基本的通讯方式有并行通讯和串行通讯两种。 一条信息的各位数据被同时传送的通讯方式称为并行通讯。并行通讯的特点是:各数据位同时传送,传送速度快、效率高,但有多少数据位就需多少根数据线,因此传送成本高,且只适用于近距离(相距数 米)的通讯。 一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位传送,传按位顺序进行,最少只需一根传输线即可完成,成本低但送速度慢。串行通讯的距离可以从几米到几千 米。 根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。信息只能单向传送为单工;信息能双向传送但不能同时双向传送称为半双工;信息能够同时双向传送则称为全双工。 串行通讯又分为异步通讯和同步通讯两种方式。在单片机中,主要使用异步通讯方式。 MCS_51单片机有一个全双工串行口。全双工的串行通讯只需要一根输出线和一根输入线。数据的输出又称发送数据(TXD),数据的输入又称接收数据(RXD)。串行通讯中主要有两个技术问题,一个是数据传送、另一个是数据转换。数据传送主要解决传送中的标准、格式及工作方式等问题。数据转换是指数据的串并行转换。具体说,在发送端,要把并行数据转换为串行数据;而在接收端,却要把接收到的串行 数据转换为并行数据。 单工、半双工和全双工的定义 如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。 如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。 如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。 电话线就是二线全双工信道。由于采用了回波抵消技术,双向的传输信号不致混淆不清。双工信道有时也将收、发信道分开,采用分离的线路或频带传输相反方向的信号,如回线传输。

利用VIRTUAL TERMINAL模拟单片机串口收发实验

利用VIRTUAL TERMINAL模拟单片机串口收发实验 程序 #include //包含头文件 //毫秒级延时函数 void delay(unsigned int x) { unsigned char i; while(x--) { for(i=0;i<120;i++); } } //字符发送函数 void putchar(unsigned char data1) { SBUF=data1; //将待发送的字符送入发送缓冲器 while(TI==0); //等待发送完成 TI=0; //发送中断标志请0 } //字符串发送函数 void putstring(unsigned char *dat) { while(*dat!='\0') //判断字符串是否发送完毕 { putchar(*dat); //发送单个字符 dat++; //字符地址加1,指向先下一个字符 delay(5); } } //主函数 void main(void) { unsigned char c=0; SCON=0x50; //串口方式1 ,允许接收 TMOD=0x20; //T1工作于方式2 PCON=0x00; //波特率不倍增 TL1=0xfd; //波特率设置 TH1=0xfd; //

EA=1; //开总中断 ES=1; //开串口接收中断 //TI = 0; TR1=1; //定时器开启 delay(200); putstring("abc\r\n"); //串口向终端发送字符串,结尾处回车换行putstring("----------------------\r\n"); delay(50); while(1) { } } // void revdata(void) interrupt 4 { unsigned char temp; if(RI==0) return; //如果没有接收中断标志,返回 ES=0; //关闭串口中断 RI=0; //清串行中断标志位 temp=SBUF; //接收缓冲器中的字符 putchar(temp); //将接收的字符发送出去 ES=1; //开启串口中断 }

51单片机汇编模拟串口通信程序

51单片机汇编模拟串口通信程序 T2作为波特率控制UART_RXD 是硬中断0或1口,如果能进入中断,说明该线有一个起始位产生,进入中断后调 用下面的接收程序。退出硬中断之前还需要将硬中断标志重新复位。 UART_TXD是任何其它IO即可。 UART_SEND: PUSH IE PUSH DPH PUSH DPL PUSH PSW PUSH 00H PUSH ACC CLR EA SETB UART_TXD ;START BIT MOV R0,A CLR TR2 ;TR2置1,计数器2启动,时间计数启动。 MOV A,RCAP2L;计数器2重新装载值 MOV TL2,A ;置计数器2初值;T2需要重新装载 MOV A,DPH MOV A,RCAP2H MOV TH2,A MOV A,R0 SETB TR2 ;TR2置1,计数器 JNB TF2,$ CLR TF2 JNB TF2,$ CLR TF2 CLR UART_TXD ;START BIT JNB TF2,$

CLR TF2 JNB TF2,$ CLR TF2 MOV R0,#08H UART_SEND_LOOP: RRC A MOV UART_TXD,C ;8 BIT JNB TF2,$ CLR TF2 JNB TF2,$ CLR TF2 DJNZ R0,UART_SEND_LOOP SETB UART_TXD ;END BIT JNB TF2,$ CLR TF2 JNB TF2,$ CLR TF2 POP ACC POP 00H POP PSW POP DPL POP DPH POP IE RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; UART_REC: PUSH IE PUSH DPH PUSH DPL CLR EA

单工-半双工-全双工的含义及区别

单工-半双工-全双工的含义及区别

1、单工 单工就是指A只能发信号,而B只能接收信号,通信是单向的,就象灯塔之于航船——灯塔发出光信号而航船只能接收信号以确保自己行驶在正确的航线上。 2、半双工 半双工就是指A能发信号给B,B也能发信号给A,但这两个过程不能同时进行。最典型的例子就象我们在影视作品中看到的对讲机一样: 007:呼叫总部,请求支援,OVER 总部:收到,增援人员将在5分钟内赶到,OVER 007:要5分钟这么久?!要快呀!OVER 总部:…… GAME OVER 在这里,每方说完一句话后都要说个OVER,然后切换到接收状态,同时也告之对方——你可以发言了。如果双方同时处于收状态,或同时处于发状态,便不能正常通信了。 3、全双工 全双工比半双工又进了一步。在A给B发信号的同时,B也可以给A发信号。典型的例子就是打电话。 A:我跟你说呀…… B:你先听我说,情况是这样的…… A和B在说的同时也能听到对方说的内容,这就是全双工。 对于全双工以太,IEEE制订了802.3x全双工/流控制标准,该标准对全双工方式下的流控制机制做了具体的规定。在各以太标准(10/100/1000 Base)中,除100 Base T4之外,均具有全双工能力,但在实际应用中,似乎只有Gb以太(即千兆以太)才使用全双工方式。 以太网的MAC协议是CSMA/CD,但在全双工以太中是不需要冲突检测(CD)的。这能使Gb以太突破40余米的段长限制(更准确地说是41.2m,这个数据可以根据IEEE定时规则的限制计算出来,这里就不详细介绍了)。在实际应用中如果需要网络中的某个站点能工作在全双工方式下,则必须在该站点安装支持

用定时器 T0 或 T1 模拟串行口程序

/************************************************************************* 用定时器T0 或T1 模拟串行口程序。 最高波特率(12 clock): 本程序收、发波特率相同。 11.059MHz -- 最高波特率收: 9600, 最低波特率:300 30.000MHz -- 最高波特率收: 28800 最低波特率:300 40.000MHz -- 最高波特率收: 38400 最低波特率:300 ... 使用说明: 1. 本程序使用一个定时器和任意2 个I/O 口模拟一个串行口。 2. 1位起始位,8位数据位,1位停止位。发数据位时先发低位。 3. 支持半双工通讯。收、发波特率相同。 4. 应把定时器中断优先级设置为最高级。 5. 本程序每接收一个字节后就把它放到一个队列缓冲区中(也可使用环行缓冲区), 待缓冲区满后,将缓冲区中的内容原样发回。这是为了测试多字节连续收发的 能力和简化程序。实际应用中应防止缓冲区溢出。 6. 由接收转换到发送时要先调用soft_send_enable (); 由发送转换到接收时要先调用 soft_receive_enable ()。 7. 发送最后一个字节后如果要立刻转为接收,必须等待最后一个字节后发送完毕 w hile ( rs_f_TI == 0) ; // 等待最后一个字节发送完毕 ************************************************************************** 编程说明: ---------------- 发送: 由接收转换到发送时要先调用soft_send_enable (), 它为发送做初始化的工作。 以后就可以调用rs_send_byte () 启动发送一个字节的过程。 发送口平时为高电平,rs_send_byte ()函数使发送口变为低电平开始发送起始位; 同时设置和启动定时器,为发送数据位在预定的时刻产生定时器中断。发送数据位和停止位都在定时器的中断服务程序中进行。 中断服务程序中处理4 种情况:发送数据位、发送停止位、发送完毕、处理错误。---------------- 接收: 由发送转换到接收时要先调用soft_receive_enable (), 它为接收做初始化的工 作。定时器以3 到4 倍波特率的频率产生中断(参见rs_TE ST0 的定义)检测P C 机发送的起始位。一旦检测到起始位,立刻把定时器产生中断的频率调整到与波特率相同,准备在下一个定时器中断中接收第1 个数据位。 中断服务程序中处理以下情况: 1. 收到的是P C 机发送的起始位: 调整定时器产生中断的频率与波特率相同。 2. 收到第8 位数据位: 存储接收到的字节。 3. 收到第1--7 位数据位: 存储到收、发移位暂存器。 4. 收到停止位: 调用soft_recei v e_enable(),检测PC 机发出的下一个起始位。 5. 处理出错的情况。 **************************************************************************/

RS485数据全双工、半双工的定义与应用

RS485数据全双工、半双工的定义与应用 在串行通信中,数据通常是在两个站(如终端和微机)之间进行传送,按照数据流的方向可分成三种基本的传送方式:全双工、半双工、和单工,但单工目前已很少采用。 1、全双工方式(full duplex) 当数据的发送和接收分流,分别由两根不同的传输线传送时,通信双方都能在同一时刻进行发送和接收操作,这样的传送方式就是全双工制,如图1所示。在全双工方式下,通信系统的每一端都设置了发送器和接收器,因此,能控制数据同时在两个方向上传送。全双工方式无需进行方向的切换,因此,没有切换操作所产生的时间延迟,这对那些不能有时间延误的交互式应用(例如远程监测和控制系统)十分有利。这种方式要求通讯双方均有发送器和接收器,同时,需要2根数据线传送数据信号,可能还需要控制线和状态线,以及地线。 图1 2、半双式方式(half duplex) 若使用同一根传输线既作接收又作发送,虽然数据可以在两个方向上传送,但通信双方不能同时收发数据,这样的传送方式就是半双工制,如图2所示。采用半双工方式时,通信系统每一端的发送器和接收器,通过收/发开关转接到通信线上,进行方向的切换,因此,会产生时间延迟。收/发开关实际上是由软件控制的电子开关。 图2 3.单工方式 如果在通信过程的任意时刻,信息只能由一方甲传到另一方乙,则称为单工。

图3 4.各种工作模式说的应用范围 1)全双工多用在要实现两端都可以控制云台上,其它的使用用途还在查找中….. 2)半双工多用在键盘矩阵的连接,语音对讲(来帮对讲系统)、硬盘录像机等。一般常见的设备之间的通讯都是使用的此模式。 3)单工多用在单向的云台控制。即我们常见的正向、反向控制数据等,我们光端机常规的都是这种工作方式。 在接受客户订单时,一定要区分数据的类型,特别是半双工和全双工,单工只需确认数据是正向和反向。

多址和双工的区别

TD-SCDMA、WCDMA、CDMA2000三种方式的共性是多址方式用都用到CDMA,三者最主要的区别是双工方式不同,TD-SCDMA是时分双工TDD,WCDMA和CDMA2000 是频分双工FDD。 所以要入门,首先要搞懂什么是多址方式,什么是双工方式。 多址方式中的“址”就像给每个手机用户给一个“住址”,但这个住址不是按照门牌号区分的,而是按照时间T、频率F和扩频码字C共同区分的。多址方式中的“多”表示多个用户可以同时通话,比如办公室小格子里的小红和隔壁小格子里的小黑可以同时打电话,之所以不是轮流打,是因为通信网络给同时打电话的小红和小黑都分配了不同的“住址”,这样接收手机信号的基站就能通过“住址”这个标识把小红和小黑区分出来了,没有多址方式,小红和小黑的信号的混在一起了分不开了。 多址方式分为时分多址TDMA、频分多址FDMA和码分多址CDMA,D表示分,M表示多,A表示址。从效果上看三种方式等价,这个效果就是办公室格子间的同事们都同时打电话。时分多址TDMA就是大家的手机轮流给基站发送信号,但是轮流的非常非常快,每个手机发送的时间只占1秒的几十万分之一,再加上手机的一些信号处理,人耳感觉不到轮流中等待的那段时间,感觉就像连续通话一样。时分多址TDMA的“址”就是轮流分得的发送时间。频分多址FDMA就是大家的手机在不同的频率上给基站同时发送信号,各个频率就像不同的车道,互不干扰。频分多址FDMA的“址”就是分配给用户的不同车道。 码分多址CDMA就像大家发送信号前,给自己的信号上贴个大头贴,基站接收到大家一起发来的信号后,通过大头贴就能分辨出谁是小红、谁是小黑。这个大头贴就是扩频码字,扩频的意思的大大增加了传送的数据量,需要扩展车道,这是因为大家发送数据时给每个数据都额外传送这个大头贴,所以要用更宽的车道来传。码分多址CDMA的“址”就是标识用户的大头贴。 在实际中,并不一定仅由时间T、频率F或扩频码字C决定一个用户的“住址”,经常是几个因素一起决定,就像小红在指定车道上开着贴着自己大头贴的车,这就叫FDMA-CDMA,

相关主题
文本预览
相关文档 最新文档