串行通信介绍一、常用通信方式直接并行、串行、各种总线方式(种类最多,VXI、8总线、CPCI等)二、串行通信基本概念工作模式:全双工-双方都可以同时收发半双工-每方都可以发送或接收,收/发分时同步通信:一般由发送方提供时钟,一个时钟对应一位数据异步通信:没有时钟,双方有约定的波特率,XXbps三、常用串口RS232、RS422、RS485、SPI、USB、RJ-45网口、I2C。其中SPI是标准的同步通信方式,带有时钟。其他是异步通信,也可以通过软件配置为同步通信。四、以RS232为例介绍RS-232接口9芯定义:1.9针接头定义针脚信号定义作用1DCD载波检测ReceivedLineSignalDetector(DataCarrierDetect)2RXD接收数据ReceivedData3TXD发送数据TransmitData4DTR数据终端准备好DataTerminalReady5SGND信号地SignalGround6DSR数据准备好DataSetReady7RTS请求发送RequestToSend8CTS清除发送ClearToSend9RI振铃提示RingIndicatorEIA-RS-232C对电气特性、逻辑电平和各种信号线功能都作了规定。在TxD和RxD上:逻辑1(MARK)=-3V~-15V逻辑0(SPACE)=+3~+15V由于计算机和单片机等只能接受逻辑0-GND,逻辑1-1.5V、3.3V、5V等。所以使用必须加一个接口处理片子,如MAX322,其内部集成了5V升压至+12V和正变负(产生-12V)功能。2.通信过程1)双方约定好波特率-对于串口通信最重要;2)设备在闲置时端口为高电平,收到低电平后开始通信-起始位接收端收到8位数据后再收到一个高电平-停止位。复位再准备下一个数据的接收。我们图示看一下,如图1所示。图1串口数据发送示意图图1串口数据发送示意图,实际上是一个时域示意图,就是信号随着时间变化的对应关系。比如在单片机的发送引脚上,左边的是先发生的,右边的是后发生的,数据位的切换时间就是波特率分之一秒。3)发送数据过程:起始位+8位数据+停止位(0)(1)4)接收数据过程收到起始位后接收8位数据,再收到停止位后复位,准备下一次接收。五、RS232、RS422、RS485比较三者的通信协议完全相同,区别在电气指标上。电气指标:规定RS232RS422R485工作方式单端差分差分节点数1收、1发1发10收1发32收最大传输电缆长度50英尺400英尺400英尺最大传输速率20Kb/S10Mb/s10Mb/s最大驱动输出电压+/-25V-0.25V~+6V-7V~+12V驱动器输出信号电平(负载最小值)负载+/-5V~+/-15V+/-2.0V+/-1.5V驱动器输出信号电平(空载最大值)空载+/-25V+/-6V+/-6V驱动器负载阻抗(欧姆)3K~7K10054摆率(最大值)30V/ìsN/AN/A接收器输入电压范围+/-15V-10V~+10V-7V~+12V接收器输入门限+/-3V+/-200mV+/-200mV接收器输入电阻(欧姆)3K~7K4K(最小)≥12K驱动器共模电压-3V~+3V-1V~+3V接收器共模电压-7V~+7V-7V~+12VRS-422、RS-485与RS-232不一样,数据信号采用差分传输方式,也称作平衡传输,它使用一对双绞线,将其中一线定义为A,另一线定义为B,如图2。图2通常情况下,发送驱动器A、B之间的正电平在+2~+6V,是一个逻辑状态,负电平在-2~-6V,是另一个逻辑状态。另有一个信号地C,在RS-485中还有一“使能”端,而在RS-422中这是可用可不用的。“使能”端是用于控制发送驱动器与传输线的切断与连接。当“使能”端起作用时,发送驱动器处于高阻状态,称作“第三态”,即它是有别于逻辑“1”与“0”的第三态。接收器也作与发送端相对的规定,收、发端通过平衡双绞线将AA与BB对应相连,当在收端AB之间有大于+200mV的电平时,输出正逻辑电平,小于-200mV时,输出负逻辑电平。接收器接收平衡线上的电平范围通常在200mV至6V之间。参见图3。图39针定义:六、单片机UARTC8051系列单片机内部集成了标准串口,外加接口片子就可以直接跟RS232、422、485、USB通信,该系列单片机也集成I2C、SPI串口功能,不需要接口片子,直接使用就行。剩下的工作就是软件编程了。单片机会把数据进行包装,达到串口要求格式发送出去,也将接收到的数据解包,程序中直接调用原始数据。七、编程软件编程就是设定波特率等参数,判断标志位或者中断,来读取数据和发送数据,效果的差别主要在于,等待标志位时程序不能做别的动作,中断则可以。下面是C语言和汇编语言的例子。#includereg52.hvoidConfigUART(unsignedintbaud);voidmain(){ConfigUART(9600);//配置波特率为9600while(1){while(!RI);//等待接收完成RI=0;//清零接收中断标志位SBUF=SBUF+1;//接收到的数据+1后,发送回去while(!TI);//等待发送完成TI=0;//清零发送中断标志位}}/*串口配置函数,baud-通信波特率*/voidConfigUART(unsignedintbaud){SCON=0x50;//配置串口为模式1TMOD&=0x0F;//清零T1的控制位TMOD|=0x20;//配置T1为模式2TH1=256-(11059200/12/32)/baud;//计算T1重载值TL1=TH1;//初值等于重载值ET1=0;//禁止T1中断TR1=1;//启动T1}这个程序还是用在主循环里等待接收中断标志位和发送中断标志位的方法来编写的,而实际工程使用串口的时候就用到串口中断了,来看一下用中断实现的程序。请注意一点,因为接收和发送触发的是同一个串口中断,所以在串口中断函数中就必须先判断是哪种中断,然后再作出相应的处理。#includereg52.hvoidConfigUART(unsignedintbaud);voidmain(){EA=1;//使能总中断ConfigUART(9600);//配置波特率为9600while(1);}/*串口配置函数,baud-通信波特率*/voidConfigUART(unsignedintbaud){SCON=0x50;//配置串口为模式1TMOD&=0x0F;//清零T1的控制位TMOD|=0x20;//配置T1为模式2TH1=256-(11059200/12/32)/baud;//计算T1重载值TL1=TH1;//初值等于重载值ET1=0;//禁止T1中断ES=1;//使能串口中断TR1=1;//启动T1}/*UART中断服务函数*/voidInterruptUART()interrupt4{if(RI)//接收到字节{RI=0;//手动清零接收中断标志位SBUF=SBUF+1;//接收的数据+1后发回,左边是发送SBUF,右边是接收SBUF}if(TI)//字节发送完毕{TI=0;//手动清零发送中断标志位}};------------------------------------;-GenerAtedInitiAlizAtionFile--;------------------------------------$include(C8051F120.inc)publicInit_DeviceINITSEGMENTCODErsegINIT;PeripherAlspecificinitiAlizAtionfunctions,;CAlledfromtheInit_DevicelAbelORG0000HLJMPMAINORG023HLJMPTRINTERORG0300H;本程序使用单片机C8051F121,RS232串口,波特率9600bps,中断接收;频综1:ADF5355:2150~5300MHz,步进10KHz;;频综2:HMC704:5550~6125MHz,步进2.5KHz,X4后形成22.2~24.5GHz本振,HMC704内部带/2,所以步进需要1.25KHz。;郑瑶频综控制程序;串口数据格式:三个字节频率,一个字节衰减,频率最高为为控制信息位,0-频综1控制数据,1-频综2控制数据。;每次必须发4个字节数据,不论是改变频率还是改变衰减值,我们接收数据后进行判断,相同的频率或衰减就不再送。;******************************************************SEN1bitP2.7CLK1bitP2.5SDA1bitP2.6SEN2bitP2.4CLK2bitP2.2SDA2bitP2.3ATT1BITP1.2ATT2BITP1.3ATT4BITP1.4ATT8BITP1.5ATT16BITP1.6ATT32BITP1.7SWPZ1BITP2.0SWPZ2BITP0.5ADD1_OEQU33HADD2_OEQU34HADD3_OEQU35HADD1_NEQU36HADD2_NEQU37HADD3_NEQU38HUART0_COUNTEQU39HUART0_RIEQU3AHATT_OEQU3BHATT_NEQU3CHNDATA1HEQU3EHNDATA1LEQU3FHFDATA1HEQU40HFDATA1MEQU41HFDATA1LEQU42HNDATA2EQU43HFDATA2HEQU44HFDATA2MEQU45HFDATA2LEQU46HPZ1RFEQU47HFM1EQU48HFM2EQU49HFM3EQU4AHFM4EQU4BHFM5EQU4CHFZ1EQU4DHFZ2EQU4EHFZ3EQU4FHFZ4EQU50HFZ5EQU51HYS1EQU52HYS2EQU53HYS3EQU54HYS4EQU55HYS5EQU56HADD1_NTEQU57HADD2_NTEQU58HADD3_NTEQU59H;主程序;******************************************************MAIN:NOPMOVSP,#60HLCALLInit_DeviceMOVR4,#0FFHDJNZR4,$NOPMOVADD1_O,#00HMOVADD2_O,#00HMOVADD3_O,#00HMOVADD1_N,#00HMOVADD2_N,#00HMOVADD3_N,#00HMOVATT_O,#00HMOVATT_N,#00HNOPLCALLSENDATTNOPLCALLADDTODATA1NOPLCALLSENDPZ1NOPLCALLADDTODATA2NOPLCALLSENDPZ2NOPMOVUART0_COUNT,#00HMOVUART0_RI,#00HSETBEASETBEACLRTI0MOVSFRPAGE,#CONFIG_PAGEMOVP0MDOUT,#023hMOVP1MDOUT,#0FChMOVP2MDOUT,#0FEhMOVXBR0,#004hMOVXBR2,#040hNOPMAIN_LOOP:NOPMOVA,UART0_RIANLA,#01HJZMAIN_LOOPMOVUART0_RI,#00HLOOP2:MOVA,UART0_RIANLA,#01HJZLOOP2MOVUART0_RI,#00HLOOP3:MOVA,UART0_RIANLA,#01HJZLOOP3MOVUART0_RI,#00HLOOP4:MOVA,UART0_RIANLA,#01HJZLOOP4MOVUART0_RI,#00HNOPMOVA,ADD1_NCJNEA,ADD1_O,NEWFREMOVA,ADD2_NCJNEA,ADD2_O,NEWFREMOVA,ADD3_NCJNEA,ADD3_O,NEWFREAJMPATTNEWFRE:MOVADD1_O,ADD1_NMOVADD2_O,ADD2_N