请问通信设计是做什么
通信设计主要从事的工作是设计通信系统,像发射机,接收机,信道误码,编码方式之类的东西。该行业的发展速度太快,对人才的需求量又相当大,容易进入国际知名的跨国公司或者在国内享有盛誉的IT企业,并且待遇相当优厚。
通信技术是以现代的声、光、电技术为硬件基础,辅以相应软件来达到信息交流目的。上个世纪末,多媒体的广泛推广、互联网的应用极大地推动了通信工程专业的发展,展望这个世纪初期,宽带技术、光通信也已经崭露头角。通信工程专业所研究的内容涵盖了当今最流行、发展最迅猛的领域。在美国发展速度最快的公司中,像Cisco(思科)、3Com等都是以通信技术作为其发展的主体,Cisco的总裁更是成为全球财富增长最快的人。在我国,不光是老牌的IT厂商联想提供了大量的网络服务,有“巨大中华”之称的通信产业四大企业(巨龙、大唐、中兴、华为)业绩也非常惊人,其良好的发展前景、宽松的发展环境、现代化的企业管理已成为毕业生们择业的首选。
更多关于通信设计是做什么,进入:https://m.abcgonglue.com/ask/c212fe1615837231.html?zd查看更多内容
//两个51单片机,两机的串口交叉连线,双机互发数据
//接收方采用两位数显示收到的数据
//下列双机通信程序,适用于双方同时使用
//经过编译、仿真成功
//显示函数应该根据自己的设备进行改写
//===============================
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar Rbuf = 0
uchar code dis_7[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0x00}//共阴段码
//段码表 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F, off
//-------------------------------
void delay(uint k)
{
uint i, j
for(i = 0i <ki++) for(j = 0j <200j++)
}
//-------------------------------
void Display(uchar x)
{
P0 = dis_7[x / 16] //输出高四位
P2 = 0xFE
delay(2)
P0 = dis_7[x % 16] //输出低四位
P2 = 0xFD
delay(2)
}
//-------------------------------
void UART()interrupt 4
{
if(RI) {
RI = 0 //清除中断标志
Rbuf = SBUF
}
if(TI) {
TI = 0 //清除中断标志
}
}
//-------------------------------
void main()//主函数
{
uchar t1, i
SCON = 0x50//串口工作在方式1
PCON &= 0x7F //SMOD=0
TMOD = 0x20//定时器1当做波特率发生器
TH1 = 0xFD //初值, 9600 @ 11.0592MHz
TL1 = 0xFD
TR1 = 1
while (1){
for (i = 0i <250i++) Display(Rbuf)
SBUF = t1//发送数据
t1++
}
}
//===============================
问题的提出
在工业控制及测量领域较为常用的网络之一就是物理层采用RS-485通信接口所组成的工控设备网络。这种通信接口可以十分方便地将许多设备组成一个控制网络。从目前解决单片机之间中长距离通信的诸多方案分析来看,RS-485总线通信模式由于具有结构简单、价格低廉、通信距离和数据传输速率适当等特点而被广泛应用于仪器仪表、智能化传感器集散控制、楼宇控制、监控报警等领域。但RS485总线存在自适应、自保护功能脆弱等缺点,如不注意一些细节的处理,常出现通信失败甚至系统瘫痪等故障,因此提高RS-485总线的运行可靠性至关重要。
图1 RS485通信接口原理图
2 硬件电路设计中需注意的问题
2.1 电路基本原理
某节点的硬件电路设计如图1所示,在该电路中,使用了一种RS-485接口芯片SN75LBC184,它采用单一电源Vcc,电压在+3~+5.5 V范围内都能正常工作。与普通的RS-485芯片相比,它不但能抗雷电的冲击而且能承受高达8 kV的静电放电冲击,片内集成4个瞬时过压保护管,可承受高达400 V的瞬态脉冲电压。因此,它能显著提高防止雷电损坏器件的可靠性。对一些环境比较恶劣的现场,可直接与传输线相接而不需要任何外加保护元件。该芯片还有一个独特的设计,当输入端开路时,其输出为高电平,这样可保证接收器输入端电缆有开路故障时,不影响系统的正常工作。另外,它的输入阻抗为RS485标准输入阻抗的2倍(≥24 kΩ),故可以在总线上连接64个收发器。芯片内部设计了限斜率驱动,使输出信号边沿不会过陡,使传输线上不会产生过多的高频分量,从而有效扼制电磁干扰。在图1中,四位一体的光电耦合器TLP521让单片机与SN75LBC184之间完全没有了电的联系,提高了工作的可靠性。基本原理为:当单片机P1.6=0时,光电耦合器的发光二极管发光,光敏三极管导通,输出高电压(+5 V),选中RS485接口芯片的DE端,允许发送。当单片机P1.6=1时,光电耦合器的发光二极管不发光,光敏三极管不导通,输出低电压(0 V),选中RS485接口芯片的RE端,允许接收。SN75LBC184的R端(接收端)和D端(发送端)的原理与上述类似。
2.2 RS-485的DE控制端设计
在RS-485总线构筑的半双工通信系统中,在整个网络中任一时刻只能有一个节点处于发送状态并向总线发送数据,其他所有节点都必须处于接收状态。如果有2个节点或2个以上节点同时向总线发送数据,将会导致所有发送方的数据发送失败。因此,在系统各个节点的硬件设计中,应首先力求避免因异常情况而引起本节点向总线发送数据而导致总线数据冲突。以MCS51系列的单片机为例,因其在系统复位时,I/O口都输出高电平,如果把I/O口直接与RS-485接口芯片的驱动器使能端DE相连,会在CPU复位期间使DE为高,从而使本节点处于发送状态。如果此时总线上有其他节点正在发送数据,则此次数据传输将被打断而告失败,甚至引起整个总线因某一节点的故障而通信阻塞,继而影响整个系统的正常运行。考虑到通信的稳定性和可靠性,在每个节点的设计中应将控制RS485总线接口芯片的发送引脚设计成DE端的反逻辑,即控制引脚为逻辑“1”时,DE端为“0”;控制引脚为逻辑“0”时,DE端为“1”。在图1中,将CPU的引脚P1.6通过光电耦合器驱动DE端,这样就可以使控制引脚为高或者异常复位时使SN75LBC184始终处于接收状态,从而从硬件上有效避免节点因异常情况而对整个系统造成的影响。这就为整个系统的通信可靠奠定了基础。
此外,电路中还有1片看门狗MAX813L,能在节点发生死循环或其他故障时,自动复位程序,交出RS-485总线控制权。这样就能保证整个系统不会因某一节点发生故障而独占总线,导致整个系统瘫痪。
2.3 避免总线冲突的设计
当一个节点需要使用总线时,为了实现总线通信可靠,在有数据需要发送的情况下先侦听总线。在硬件接口上,首先将RS-485接口芯片的数据接收引脚反相后接至CPU的中断引脚INT0。在图1中,INT0是连至光电耦合器的输出端。当总线上有数据正在传输时,SN75LBC184的数据接收端(R端)表现为变化的高低电平,利用其产生的CPU下降沿中断(也可采用查询方式),能得知此时总线是否正“忙”,即总线上是否有节点正在通信。如果“空闲”,则可以得到对总线的使用权限,这样就较好地解决了总线冲突的问题。在此基础上,还可以定义各种消息的优先级,使高优先级的消息得以优先发送,从而进一步提高系统的实时性。采用这种工作方式后,系统中已经没有主、从节点之分,各个节点对总线的使用权限是平等的,从而有效避免了个别节点通信负担较重的情况。总线的利用率和系统的通信效率都得以大大提高,从而也使系统响应的实时性得到改善,而且即使系统中个别节点发生故障,也不会影响其他节点的正常通信和正常工作。这样使得系统的“危险”分散了,从某种程度上来说增强了系统的工作可靠性和稳定性。
2.4 RS-485输出电路部分的设计
在图1中,VD1~VD4为信号限幅二极管,其稳压值应保证符合RS-485标准,VD1和VD3取12 V,VD2 和VD4取7 V,以保证将信号幅度限定在-7~+12 V之间,进一步提高抗过压的能力。考虑到线路的特殊情况(如某一节点的RS-485芯片被击穿短路),为防止总线中其他分机的通信受到影响,在SN75LBC184的信号输出端串联了2个20 Ω的电阻R1和R2,这样本机的硬件故障就不会使整个总线的通信受到影响。在应用系统工程的现场施工中,由于通信载体是双绞线,它的特性阻抗为120 Ω左右,所以线路设计时,在RS485网络传输线的始端和末端应各接1个120 Ω的匹配电阻(如图1中的R3),以减少线路上传输信号的反射。
2.5 系统的电源选择
对于由单片机结合RS-485组建的测控网络,应优先采用各节点独立供电的方案,同时电源线不能与RS-485信号线共用同一股多芯电缆。RS-485信号线宜选用截面积0.75 mm2以上的双绞线而不是平直线,并且选用线性电源TL750L05比选用开关电源更合适。TL750L05必须有输出电容,若没有输出电容,则其输出端的电压为锯齿波形状,锯齿波的上升沿随输入电压变化而变化,加输出电容后,可以抑制该现象。
3 软件的编程
SN75LBC184在接收方式时,A、B为输入,R为输出;在发送方式时,D为输入,A、B为输出。当传送方向改变一次后,如果输入未变化,则此时输出为随机状态,直至输入状态变化一次,输出状态才确定。显然,在由发送方式转入接收方式后,如果A、B状态变化前,R为低电平,在第一个数据起始位时,R仍为低电平,CPU认为此时无起始位,直到出现第一个下降沿,CPU才开始接收第一个数据,这将导致接收错误。由接收方式转入发送方式后,D变化前,若A与B之间为低电压,发送第一个数据起始位时,A与B之间仍为低电压,A、B引脚无起始位,同样会导致发送错误。克服这种后果的方案是:主机连续发送两个同步字,同步字要包含多次边沿变化(如55H ,0AAH),并发送两次(第一次可能接收错误而忽略) ,接收端收到同步字后,就可以传送数据了,从而保证正确通信。
为了更可靠地工作,在RS485总线状态切换时需要适当延时,再进行数据的收发。具体的做法是在数据发送状态下,先将控制端置“1”,延时0.5 ms左右的时间,再发送有效的数据,数据发送结束后,再延时0.5 ms,将控制端置“0”。这样的处理会使总线在状态切换时,有一个稳定的工作过程。数据通信程序基本流程图如图2所示。
图2 数据通信程序基本流程图
单片机通信节点的程序基本上可以分为6个主要部分,分别为预定义部分、初始化部分、主程序部分、设备状态检测部分、帧接收部分和帧发送部分。预定义部分主要定义了通信中使用的握手信号,用于保存设备信息的缓冲区和保存本节点设备号的变量。设备状态检测部分应能在程序初始化后,当硬件发生故障时,作出相应的反应。主程序部分应能接收命令帧,并根据命令的内容作出相应的回应。为缩短篇幅,这里仅给出主程序部分的代码。如下所示:
while(1) { //主循环
if(recv_cmd(&type)==0) //发生帧错误或帧地址与本机
//地址不符,丢弃当前帧后返回
continue
switch(type) {
case __ACTIVE_://主机询问从机是否存在
send_data(__OK_, 0,dbuf)//发送应答信息
break
case __GETDATA_:
len = strlen(dbuf)
send_data(__STATUS_, len,dbuf)//发送状态信息
break
default:
break //命令类型错误,丢弃当前帧后返回
}
}
4 结论
RS-485由于使用了差分电平传输信号,传输距离比RS-232更长,最多可以达到3000 m,因此很适合工业环境下的应用。但与CAN总线等更为先进的现场工业总线相比,其处理错误的能力还稍显逊色,所以在软件部分还需要进行特别的设计,以避免数据错误等情况发生。另外,系统的数据冗余量较大,对于速度要求高的应用场所不适宜用RS-485总线。虽然RS-485总线存在一些缺点,但由于它的线路设计简单、价格低廉、控制方便,只要处理好细节,在某些工程应用中仍然能发挥良好的作用。总之,解决可靠性的关键在于工程开始施工前就要全盘考虑可采取的措施,这样才能从根本上解决问题,而不要等到工程后期再去亡羊补牢。
从机地址分别为01和02
从机的串口相同引脚相互并联作为一个串口连接于主机串口,注意接线正确。
主机命令:地址号 + 命令字符串
从机命令:地址号 + 命令字符串
然后在各自收发代码中利用地址号来区别命令执行
其它请参阅如下网址本人的答复:
http://zhidao.baidu.com/question/12535506.html
http://zhidao.baidu.com/question/12522809.html
http://zhidao.baidu.com/question/11725744.html
http://zhidao.baidu.com/question/11040704.html
http://zhidao.baidu.com/question/10941227.html
补充:
串行通讯的基本知识
每台计算机都提供了一个或多个串行端口。它们被依次命名为:COM1、COM2 等等。在标准的 PC 中,鼠标通常被连接到 COM1 端口。调制解调器可能连接到 COM2,扫描仪被连接到 COM3,等等。串行端口提供了计算机与这些外部串行设备之间的数据传输通道。
串行端口的本质功能是作为 CPU 和串行设备间的编码转换器。当数据从 CPU 经过串行端口发送出去时,字节数据被转换为串行的位。在接收数据时,串行的位将被转换为字节数据。
我的理解:串行口数据通信的实质是ASCII(美国标准信息交换码)的传输。你可理解是传输ASCII码,而实际传输的是ASCII码(其二进制形式,8位组成一字节)。它又可看成是8位二进制数,例字符A 其二进制表示为 01000001,MSCOMM发送时完全按照此二进制信号发送,由低位至高位传输。又能理解为10进制的64。在计算机内通常以16进制表示为41。由2个8位二进制数据组成16位二进制数,通常用于数据的二进制通信。你的程序代码采用以文本方式取回数据,这是在MSCOMM控件内部进行解决,而无须VB编程员来处理。
见MSCOMM控件的:
InputMode 常数
常数 值 描述
comInputModeText 0 (缺省)通过 Input 属性以文本方式取回数据。
comInputModeBinary 1 通过 Input 属性以二进制方式检取回数据。
以下是由MICROSOFT提供的关于串行通讯和MSCOMM控件的一些说明,可能对你答辩有用,供参考。
串行通讯的基本知识
每台计算机都提供了一个或多个串行端口。它们被依次命名为:COM1、COM2 等等。在标准的 PC 中,鼠标通常被连接到 COM1 端口。调制解调器可能连接到 COM2,扫描仪被连接到 COM3,等等。串行端口提供了计算机与这些外部串行设备之间的数据传输通道。
串行端口的本质功能是作为 CPU 和串行设备间的编码转换器。当数据从 CPU 经过串行端口发送出去时,字节数据被转换为串行的位。在接收数据时,串行的位将被转换为字节数据。
要完成数据的传输,还需要进一步一个解释层。在操作系统一边,Windows 使用了通讯驱动程序 Comm.drv,以便使用标准的 Windows API 函数发送和接收数据。驱动程序通常由串行设备制造商提供,以便将其硬件与 Windows 连接。在使用 Communications 控件时,实际上使用了 API 函数,API 函数将被 Comm.drv 解释并传输给设备驱动程序。
作为程序员,只需关心如何与 Windows 打交道。作为 Visual Basic 程序员,只需要关心 Communications 控件提供的对 Windows 通讯驱动程序的 API 函数的接口。换句话说,只需要设置和监视 Communications 控件的属性和事件。
建立串行端口连接
使用 Communications 控件的第一步是建立与串行端口的连接。下表列出了用于建立串行端口连接的属性:
属性 描述
CommPort 设置或返回通讯端口号。
Settings 以字符串形式设置或返回波特率、奇偶校验、数据位和停止位。
PortOpen 设置或返回通讯端口的状态。以及打开和关闭端口。
打开串行端口
要打开串行端口,可以使用 CommPort、PortOpen 和 Settings 属性。例如:
'打开串行端口
MSComm1.CommPort = 2
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
CommPort 属性确定打开哪个串行端口。假如 COM2 上连接有一个调制解调器,则在上面的例子中需要将值设置为 2 (COM2) 才能连接到该调制解调器。CommPort 属性值可以设置为 1 到 16 之间的任何值(缺省值为 1),然而,如果将该值设置为系统中并不存在的 COM 端口,将会产生错误。
Settings 属性可以用来指定波特率、奇偶校验、数据位数和停止位数。按照缺省规定,波特率被设置为 9600。奇偶校验设置为了进行数据校验。这通常是不用的,并设置为"N"。数据位数指定了代表一个数据块的比特数。停止位指出了何时接收到一个完整数据块。
在指定了要打开的端口,以及如何进行数据通讯之后,就可以使用 PortOpen 属性建立连接了。它是一个布尔值,即取值范围为 True 或 False。然而,如果端口无效,或者 CommPort 属性设置有误,或者该设备不支持指定的设置,就会产生错误;即使没有产生错误,外部设备也不能正常工作。将 PortOpen 属性设置为 False 即可关闭该端口。
缓冲区内存分配
InBufferSize 和 OutBufferSize 属性指定了为接收和发送缓冲区分配的内存数量。按照缺省规定,它们被分别设置为上图所示的值。这两个值设置得越大,应用程序中可用的内存就越少。然而,如果缓冲区太小,就要冒缓冲区溢出的风险,除非采用握手信号。
注意 鉴于现在大多数微机可用的内存量,由于有更多的可用资源,缓冲区内存分配已不那么至关紧要了。换言之,可以把缓冲区的值设得高一些而不影响应用程序的性能。
RThreshold 和 SThreshold 属性
RThreshold 和 SThreshold 属性,表示在 OnComm 事件发生之前,接收缓冲区或发送缓冲区中可以接收的字符数。OnComm 事件被用来监视和响应通讯状态的变化。如果将每个属性的值都设置为零 (0),就可以避免发生 OnComm 事件。如果将该值设置为非零的值(比如 1),那么每当缓冲区中接收到一个字符时,就会产生 OnComm 事件。
Output 属性被用来向发送缓冲区发出命令和数据。
与 Input 属性类似,数据可以以文本或二进制格式发送。Output 属性必须用字符串变体型发送文本,用 Byte 数组变体型发送二进制数据。
可用 Output 属性发送命令、文字字符串或 Byte 数组数据。
MSComm 控件
MSComm 控件通过串行端口传输和接收数据,为应用程序提供串行通讯功能。
语法
MSComm
说明
MSComm 控件提供下列两种处理通讯的方式:
事件驱动通讯是处理串行端口交互作用的一种非常有效的方法。在许多情况下,在事件发生时需要得到通知,例如,在 Carrier Detect (CD) 或 Request To Send (RTS) 线上一个字符到达或一个变化发生时。在这些情况下,可以利用 MSComm 控件的 OnComm 事件捕获并处理这些通讯事件。OnComm 事件还可以检查和处理通讯错误。所有通讯事件和通讯错误的列表,参阅 CommEvent 属性。
在程序的每个关键功能之后,可以通过检查 CommEvent 属性的值来查询事件和错误。如果应用程序较小,并且是自保持的,这种方法可能是更可取的。例如,如果写一个简单的电话拨号程序,则没有必要对每接收一个字符都产生事件,因为唯一等待接收的字符是调制解调器的"确定"响应。
每个使用的 MSComm 控件对应着一个串行端口。如果应用程序需要访问多个串行端口,必须使用多个 MSComm 控件。可以在 Windows"控制面板"中改变端口地址和中断地址。
尽管 MSComm 控件有很多重要的属性,但首先必须熟悉几个属性。
属性 描述
CommPort 设置并返回通讯端口号。
Settings 以字符串的形式设置并返回波特率、奇偶校验、数据位、停止位。
PortOpen 设置并返回通讯端口的状态。也可以打开和关闭端口。
Input 从接收缓冲区返回和删除字符。
Output 向传输缓冲区写一个字符串。
OnComm 事件
无论何时当 CommEvent 属性的值变化时,就产生 OnComm 事件,标志发生了一个通讯事件或一个错误。
语法
Private Sub object_OnComm ()
OnComm 事件语法包括下列部分:
部分 描述
object 对象表达式,其值是"应用于"列表中的对象。
说明
CommEvent 属性包含实际错误或产生 OnComm 事件的数码。注意,设置 Rthreshold 或 Sthreshold 属性为 0,分别使捕获 comEvReceive 和 comEvSend 事件无效。
MSComm 控件常数
Handshake 常数
常数 值 描述
comNone 0 无握手。
comXonXoff 1 XOn/Xoff 握手。
comRTS 2 Request-to-send/clear-to-send 握手。
comRTSXOnXOff 3 Request-to-send 和 clear-to-send 握手皆可。
OnComm 常数
常数 值 描述
comEvSend 1 发送事件。
comEvReceive 2 接收事件。
comEvCTS 3 clear-to-send 线变化。
comEvDSR 4 data-set ready 线变化。
comEvCD 5 carrier detect 线变化。
comEvRing 6 振铃检测。
comEvEOF 7 文件结束。
Error 常数
常数 值 描述
comEventBreak 1001 接收到中断信号
comEventCTSTO 1002 Clear-to-send 超时
comEventDSRTO 1003 Data-set ready 超时
comEventFrame 1004 帧错误
comEventOverrun 1006 端口超速
comEventCDTO 1007 Carrier detect 超时
comEventRxOver 1008 接收缓冲区溢出
comEventRxParity 1009 Parity 错误
comEventTxFull 1010 传输缓冲区满
comEventDCB 1011 检索端口 设备控制块 (DCB) 时的意外错误
InputMode 常数
常数 值 描述
comInputModeText 0 (缺省)通过 Input 属性以文本方式取回数据。
comInputModeBinary 1 通过 Input 属性以二进制方式检取回数据。
Output 属性
往传输缓冲区写数据流。该属性在设计时无效,在运行时为只读。
语法
object.Output [ = value ]
Output 属性语法包括下列部分:
部分 描述
object 对象表达式,其值是"应用于"列表中的对象。
value 要写到传输缓冲区中的一个字符串。
说明
Output 属性可以传输文本数据或二进制数据。用 Output 属性传输文本数据,必须定义一个包含一个字符串的 Variant。发送二进制数据,必须传递一个包含字节数组的 Variant 到 Output 属性。
正常情况下,如果发送一个 ANSI 字符串到应用程序,可以以文本数据的形式发送。如果发送包含嵌入控制字符、Null 字符等等的数据,要以二进制形式发送。
数据类型
Variant