第一篇:RS232串口通信原理简介
串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。
串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。
典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配:
波特率:这是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如300波特表示每秒钟发送300个bit。当我们提到时钟周期时,我们就是指波特率例如如果协议需要4800波特率,那么时钟是4800Hz。这意味着串口通信在数据线上的采样率为4800Hz。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。
数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据不会是8位的,标准的值是5、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。
停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。
奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位位1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。
第二篇:串口通信实验报告范文
华南农业大学
实验报告
----------目录----------
1、实验任务和目的..............................................................................................................2、实验准备..........................................................................................................................3、实验步骤................................................................................................................................4、实验分析与总结....................................................................................................................(1)、分析.............................................................................................................................(2)、总结.............................................................................................................................1、实验任务和目的
了解串行通信的背景知识后,通过三线制制作一条串口通信线(PC-PC),并编程实现两台PC间通过RS-232C通信。要求两台PC机能进行实时的字符通信,并了解工业自动化控制中的基本通信方式。
2、实验准备
1、检查PC是否具有串行通信接口,并按其针脚类准备一条串口通信线缆。
2、串口包的安装,下载javacomm20-win32.zip并解压,将win32com.dll复制到
3、实验步骤
1、将实验所需RS-232缆线准备好,并将JAVA串口包复制到相应地目录下。
2、查找有关串口通信的书籍以及在网上查找相应地串口通信代码。
3、用JAVA编程软件JCreator编写代码。
4、实验分析与总结
(1)、分析
(I)、对串口读写之前需要先打开一个串口并检测串口是否被占用: public void open(){//打开串口以及输入输出流
recieve=false;
try
{serialPort=(SerialPort)portId.open(“Serial Communication”, 2000);}
catch(PortInUseException e){System.out.println(“端口正被占用!”);}
try
{serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);}
catch(UnsupportedCommOperationException e){System.out.println(“不支持通信”);}
try
{
outputStream=serialPort.getOutputStream();
inputStream=serialPort.getInputStream();
1-完整运行程序如图所示:
图1
(2)、总结
通过本次串口实验,我对串口通信的知识了解的更透彻,这是在刚开始对串口通信知识不了解的情况下就编程而造成许多错误之后才得到的结果。在网上查找资料的时候也接触到了不少其他的编程语言例如VB,delphi,C#等,这也让我对这些从没有学过的语言有所了解,我想这些知识对以后的实验工作都有帮助。
3--
第三篇:单片机串口通信方式总结
IIC总线通信协议————数据传输高位在前p233 1,起始和停止条件
开始信号:SCL为高电平,SDA由高电平向低电平跳变,开始传送数据。void start()// 开始位 { SDA = 1;
//SDA初始化为高电平“1”
SCL = 1;
//开始数据传送时,要求SCL为高电平“1”
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
SDA = 0;
//SDA的下降沿被认为是开始信号
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
SCL = 0;
//SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)} 结束信号:SCL为高电平,SDA由低电平向高电平跳变,结束传送数据。void stop()// 停止位 { SDA = 0;
//SDA初始化为低电平“0”
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
SCL = 1;
//结束数据传送时,要求SCL为高电平“1”
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
SDA = 1;
//SDA的上升沿被认为是结束信号 }
2,数据格式(数据输入)
在IIC总线开始信号后,送出的第一个字节数据是用来选择器件地址和数据方向的,其格式为
从器件收到地址型号后与自己的地址比较,一致则此器件就是主器件要找的器件,并返回ACK(不管是写数据还是地址都会返回)。IIC传送数据时SCL为低电平时SDA可改变高低电平,SCL转跳为高时数据输入(此时SDA不能跳变),发送数据:bit WriteCurrent(unsigned char y){ unsigned char i;bit ack_bit;
//储存应答位
for(i = 0;i < 8;i++)// 循环移入8个位
{
SDA =(bit)(y&0x80);
//通过按位“与”运算将最高位数据送到S
//因为传送时高位在前,低位在后
_nop_();
//等待一个机器周期
SCL = 1;
//在SCL的上升沿将数据写入AT24Cxx
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
SCL = 0;
//将SCL重新置为低电平,以在SCL线形成传送数据所需的8个脉冲
y <<= 1;
//将y中的各二进位向左移一位
} SDA = 1;
// 发送设备(主机)应在时钟脉冲的高电平期间(SCL=1)释放SDA线,//以让SDA线转由接收设备(AT24Cxx)控制
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
SCL = 1;
//根据上述规定,SCL应为高电平
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
_nop_();
//等待一个机器周期
ack_bit = SDA;//接受设备(AT24Cxx)向SDA送低电平,表示已经接收到一个字节
//若送高电平,表示没有接收到,传送异常
SCL = 0;
//SCL为低电平时,SDA上数据才允许变化(即允许以后的数据传递)
return ack_bit;
// 返回AT24Cxx应答位 } 读数据:unsigned char ReadData()// 从AT24Cxx移入数据到MCU { unsigned char i;unsigned char x;
//储存从AT24Cxx中读出的数据
for(i = 0;i < 8;i++){
SCL = 1;
//SCL置为高电平
x<<=1;
//将x中的各二进位向左移一位
x|=(unsigned char)SDA;//将SDA上的数据通过按位“或“运算存入x中
SCL = 0;
//在SCL的下降沿读出数据
} return(x);
//将读取的数据返回 } 发送数据步骤:
oid WriteSet(unsigned char add, unsigned char dat)// 在指定地址addr处写入数据WriteCurrent { start();
//开始数据传递
WriteCurrent(OP_WRITE);//选择要操作的AT24Cxx芯片,并告知要对其写入数据
WriteCurrent(add);
//写入指定地址
WriteCurrent(dat);
//向当前地址(上面指定的地址)写入数据
stop();
//停止数据传递
delaynms(4);
//1个字节的写入周期为1ms, 最好延时1ms以上 } 读数据步骤:
/*************************************************** 函数功能:从AT24Cxx中的当前地址读取数据 出口参数:x(储存读出的数据)
***************************************************/ unsigned char ReadCurrent(){ unsigned char x;start();
//开始数据传递
WriteCurrent(OP_READ);
//选择要操作的AT24Cxx芯片,并告知要读其数据
x=ReadData();
//将读取的数据存入x stop();
//停止数据传递
return x;
//返回读取的数据 } /*************************************************** 函数功能:从AT24Cxx中的指定地址读取数据 入口参数:set_add 出口参数:x
***************************************************/ unsigned char ReadSet(unsigned char set_add)// 在指定地址读取 { start();
//开始数据传递
WriteCurrent(OP_WRITE);
//选择要操作的AT24Cxx芯片,并告知要对其写入数据
WriteCurrent(set_add);
//写入指定地址
return(ReadCurrent());
//从指定地址读出数据并返回 }
单总线协议————数据传输低位在前——p237 1,初始化单总线器件
初始化时序程序:
函数功能:将DS18B20传感器初始化,读取应答信号 出口参数:flag
***************************************************/ bit Init_DS18B20(void){ bit flag;
//储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在
DQ = 1;
//先将数据线拉高
for(time=0;time<2;time++)//略微延时约6微秒
;DQ = 0;
//再将数据线从高拉低,要求保持480~960us for(time=0;time<200;time++)//略微延时约600微秒
;
//以向DS18B20发出一持续480~960us的低电平复位脉冲
DQ = 1;
//释放数据线(将数据线拉高)
for(time=0;time<10;time++)
;//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲)
flag=DQ;
//让单片机检测是否输出了存在脉冲(DQ=0表示存在)
for(time=0;time<200;time++)//延时足够长时间,等待存在脉冲输出完毕
;return(flag);
//返回检测成功标志 }
单总线通信协议中存在两种写时隙:写0写1。主机采用写1时隙向从机写入1,而写0时隙向从机写入0。所有写时隙至少要60us,且在两次独立的写时隙之间至少要1us的恢复时间。两种写时隙均起始于主机拉低数据总线。产生1时隙的方式:主机拉低总线后,接着必须在15us之内释放总线,由上拉电阻将总线拉至高电平;产生写0时隙的方式为在主机拉低后,只需要在整个时隙间保持低电平即可(至少60us)。在写时隙开始后15~60us期间,单总线器件采样总电平状态。如果在此期间采样值为高电平,则逻辑1被写入器件;如果为0,写入逻辑0。
下图为写时隙(包括1和0)时序
上图中黑色实线代表系统主机拉低总线,黑色虚线代表上拉电阻将总线拉高。下面是代码:
WriteOneChar(unsigned char dat){ unsigned char i=0;for(i=0;i<8;i++)
{
DQ =1;
// 先将数据线拉高
_nop_();
//等待一个机器周期
DQ=0;
//将数据线从高拉低时即启动写时序
DQ=dat&0x01;
//利用与运算取出要写的某位二进制数据,//并将其送到数据线上等待DS18B20采样
for(time=0;time<10;time++)
;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样
DQ=1;
//释放数据线
for(time=0;time<1;time++)
;//延时3us,两个写时序间至少需要1us的恢复期
dat>>=1;
//将dat中的各二进制位数据右移1位
}
for(time=0;time<4;time++)
;//稍作延时,给硬件一点反应时间 }
对于读时隙,单总线器件仅在主机发出读时隙时,才向主机传输数据。所有主机发出读数据命令后,必须马上产生读时隙,以便从机能够传输数据。所有读时隙至少需要60us,且在两次独立的读时隙之间至少需要1us恢复时间。每个读时隙都由主机发起,至少拉低总线1us。在主机发出读时隙后,单总线器件才开始在总线上发送1或0。若从机发送1,则保持总线为高电平;若发出0,则拉低总线。
当发送0时,从机在读时隙结束后释放总线,由上拉电阻将总线拉回至空闲高电平状态。从机发出的数据在起始时隙之后,保持有效时间15us,因此主机在读时隙期间必须释放总线,并且在时隙起始后的15us之内采样总线状态。
下图给出读时隙(包括0或1)时序
图中黑色实线代表系统主机拉低总线,灰色实线代表总局拉低总线,而黑色的虚线则代表上拉电阻总线拉高。代码为:
unsigned char ReadOneChar(void){
unsigned char i=0;
unsigned char dat;//储存读出的一个字节数据
for(i=0;i<8;i++)
{
DQ =1;
// 先将数据线拉高
_nop_();
//等待一个机器周期
DQ = 0;
//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序
dat>>=1;
_nop_();
//等待一个机器周期
DQ = 1;
//将数据线“人为”拉高,为单片机检测DS18B20的输出电平作准备
for(time=0;time<2;time++)
;
//延时约6us,使主机在15us内采样
if(DQ==1)
dat|=0x80;//如果读到的数据是1,则将1存入dat
else
dat|=0x00;//如果读到的数据是0,则将0存入dat
//将单片机检测到的电平信号DQ存入r[i]
for(time=0;time<8;time++)
;
//延时3us,两个读时序之间必须有大于1us的恢复期
}
return(dat);
//返回读出的十进制数据 }
每个单总线器件内部都光刻了一个全球唯一的64位二进制序列码,用于该单总线器件的识别
SPI总线协议
SPI总线有四种工作方式(SP0, SP1, SP2, SP3),其中使用的最为广泛的是SPI0和SPI3方式。
SPI是一个环形总线结构,由ss(cs)、sck、sdi、sdo构成,其时序其实很简单,主要是在sck的控制下,两个双向移位寄存器进行数据交换。
上升沿发送、下降沿接收、高位先发送。
上升沿到来的时候,sdo上的电平将被发送到从设备的寄存器中。
下降沿到来的时候,sdi上的电平将被接收到主设备的寄存器中。读代码:
unsigned char ReadCurrent(void){
unsigned char i;unsigned char x=0x00;
//储存从X5045中读出的数据
SCK=1;
//将SCK置于已知的高电平状态
for(i = 0;i < 8;i++){
SCK=1;
//拉高SCK
SCK=0;
//在SCK的下降沿输出数据
x<<=1;//将x中的各二进位向左移一位,因为首先读出的是字节的最高位数据
x|=(unsigned char)SO;//将SO上的数据通过按位“或“运算存入 x
} return(x);
//将读取的数据返回
} 写代码:
void WriteCurrent(unsigned char dat){
unsigned char i;SCK=0;
//将SCK置于已知的低电平状态
for(i = 0;i < 8;i++)// 循环移入8个位
{
SI=(bit)(dat&0x80);
//通过按位“与”运算将最高位数据送到S
//因为传送时高位在前,低位在后
SCK=0;
SCK=1;
//在SCK上升沿写入数据
dat<<=1;
//将y中的各二进位向左移一位,因为首先写入的是字节的最高位
} } RS232通讯协议 串行通讯方式3 RS485通讯协议 串行通讯方式1
第四篇:串口通信实验报告
实验三
双机通信实验
一、实验目的
UART 串行通信接口技术应用
二、实验实现的功能
用两片核心板之间实现串行通信,将按键信息互发到对方数码管显示。
三、系统硬件设计
(1)单片机的最小系统部分
(2)电源部分
(3)人机界面部分
数码管部分
按键部分
(4)串口通信部分
四、系统软件设计
#include
sbit H1=P3^6;sbit H2=P3^7;sbit L1=P0^5;sbit L2=P0^6;sbit L3=P0^7;
uint m=0,i=0,j;uchar temp,prt;/***y延时函数***/ void delay(uint k){ uint i,j;
}
/***键盘扫描***/ char scan_key(){ H1=0;H2=0;
L1=1;L2=1;L3=1;if(L1==0){ delay(5);if(L1==0){ L1=0;H1=1;H2=1;if(H1==0)} //定义局部变量ij
//外层循环 for(i=0;i { m=1;return(m);} if(H2==0){ m=4;return(m);} } } //KEY1键按下 //KEY4键按下 if(L2==0){ delay(5);if(L2==0){ L2=0;H1=1;H2=1;if(H1==0) { m=2;return(m);} if(H2==0){ m=5;return(m);} } } //KEY5键按下 //KEY2键按下 if(L3==0){ delay(5);if(L3==0){ L3=0;H1=1;H2=1;if(H1==0){ m=3; //KEY3键按下 } return(m);} if(H2==0){ m=6;return(m);} } } return(0); // KEY6键按下 /***主函数***/ main(){ P1M1=0x00;P1M0=0xff; SCON=0x50;//设定串行口工作方式1 TMOD=0x20;//定时器1,自动重载,产生数据传输速率 TH1=0xfd;//数据传输率为9600 TR1=1;//启动定时器1 P0&=0xf0;while(1){ //如果有按键按下 if(scan_key()){ SBUF=scan_key();//发送数据 while(!TI);TI=0;} if(RI){ RI=0;} // // 等待数据传送 清除数据传送标志 //是否有数据到来 // 清除数据传送标志 temp=SBUF; // 将接收到的数据暂存在temp中 P1=code0[temp];// 数据传送到P1口输出 delay(500);} } //延时500ms 五、实验中遇到的问题及解决方法 (1)串行口和定时器的工作方式设定是关键,本次是按需传输的是两位十六进制数,串行口为工作方式1,定时器为8位自动重载;(2)采用P0&=0xf0语句使4个数码管静态点亮; (3)在发送和接受过程中,用标识位TI和RI来检测发送和接受是否完成;(4)在用电脑和单片机进行串口通信测试时,电脑的传世速率一定要和单片机的传输速率相等,否则显示会出现错误。 指导老师签字: 日期: 通信的目的:传递消息中所包含的信息。 消息:是物质或精神状态的一种反映,例如语音、文字、音乐、数据、图片或活动图像等。信息:是消息中包含的有效内容。 信道:将来自发送设备的信号传送到接收端的物理媒质。分为有线信道和无线信道两大类。模拟通信系统是利用模拟信号来传递信息的通信系统。 数字通信系统是利用数字信号来传递信息的通信系统。 信源编码与译码目的:提高信息传输的有效性、完成模/数转换 信道编码与译码目的:增强抗干扰能力 加密与解密目的:保证所传信息的安全 数字调制与解调目的:形成适合在信道中传输的带通信号 同步目的:使收发两端的信号在时间上保持步调一致。 数字通信的特点 优点: 抗干扰能力强,且噪声不积累 传输差错可控 便于处理、变换、存储 便于将来自不同信源的信号综合到一起传输 易于集成,使通信设备微型化,重量轻 易于加密处理,且保密性好 缺点: 需要较大的传输带宽 对同步要求高 通信系统的分类 按通信业务分类:电报通信系统、电话通信系统、数据通信系统、图像通信系统 … … 按调制方式分类:基带传输系统和带通(调制)传输系统 调制传输系统又分为多种调制,详见书中表1-1。 按信号特征分类:模拟通信系统和数字通信系统 按传输媒介分类:有线通信系统和无线通信系统 按工作波段分类:长波通信、中波通信、短波通信 … … 按信号复用方式分类:频分复用、时分复用、码分复用 通信方式: 单工通信:消息只能单方向传输的工作方式 半双工通信:通信双方都能收发消息,但不能同时收发的工作方式 全双工通信:通信双方可同时进行收发消息的工作方式 并行传输:将代表信息的数字信号码元序列以成组的方式在两条或两条以上的并行信道上同时传输 优点:节省传输时间,速度快:不需要字符同步措施 缺点:需要 n 条通信线路,成本高 串行传输 :将数字信号码元序列以串行方式一个码元接一个码元地在一条信道上传输优点:只需一条通信信道,节省线路铺设费用 缺点:速度慢,需要外加码组或字符同步措施第五篇:通信原理