PIC单片机485通信接收
- 格式:doc
- 大小:20.50 KB
- 文档页数:3
//从机程序//01数据帧//02命令帧//03功能帧 01 确认 02 否认#include<avr/io.h>#include<avr/interrupt.h>#include<inttypes.h>#include<util/delay.h>#include <avr/pgmspace.h>#include<string.h>#define myaddr 0x01 //定义本机地址#define rx_485(); asm("cbi 0x13,2"); //portd.2清零改为接收状态#define tx_485(); asm("sbi 0x13,2"); //portd.2置位改为发送状态volatile struct conn{unsigned char buf[70];unsigned char data[64];unsigned char srcadd;//源地址unsigned char aimadd;//目的地址unsigned char tp;//帧类型int num;int tmp;unsigned char ver; //验证码;unsigned char err; //错误码; 01:帧校验错}tx,rx;volatile unsigned char com; //命令const unsigned char flash_str[] PROGMEM = "0123456789";ISR(USART_RXC_vect){rx.buf[rx.tmp]=UDR;/*testif(rx.tmp==0 && rx.buf[rx.tmp]=='t'){totx();tx.num=16;strcpy(tx.buf,"can i help you");tx.buf[15]=0x0D;UCSRB|=(1<<UDRIE);//发送帧};*/if(rx.tmp==0 && rx.buf[rx.tmp]!=myaddr) //地址不对直接返回{//禁止接收0.15秒。
单片机485串口读写冲突一、什么是单片机485串口读写冲突?单片机485串口读写冲突指的是在使用单片机的485串口进行通讯时,由于发送和接收数据使用同一个线路,当发送和接收数据同时发生时,会导致冲突问题。
二、造成单片机485串口读写冲突的原因1. 通讯速率设置不合理。
当通讯速率过高时,可能会出现数据传输不完整或者出现丢包现象;当通讯速率过低时,可能会导致数据传输过慢。
2. 硬件电路设计问题。
如果硬件电路设计不合理,例如电源稳压不好或者信号线干扰等问题都有可能导致单片机485串口读写冲突。
3. 软件程序设计问题。
如果软件程序设计不合理,例如在发送数据时没有及时判断是否有接收到的数据或者在接收数据时没有及时判断是否有需要发送的数据等问题都有可能导致单片机485串口读写冲突。
三、如何解决单片机485串口读写冲突1. 通过硬件电路优化来解决。
例如增加滤波器或者隔离器等元器件来减少信号干扰;增加稳压电源来保证系统电源的稳定性等。
2. 通过软件程序优化来解决。
例如在发送数据时先判断是否有接收到的数据,如果有则先处理接收到的数据再发送;在接收数据时先判断是否有需要发送的数据,如果有则先发送需要发送的数据再处理接收到的数据等。
3. 通过调整通讯速率来解决。
可以逐步调整通讯速率,找到最合适的通讯速率,从而减少单片机485串口读写冲突问题。
四、如何避免单片机485串口读写冲突1. 合理设计硬件电路。
在设计硬件电路时应该注意信号线干扰和电源稳定性等问题,尽可能地减少这些干扰因素对系统的影响。
2. 合理设置通讯速率。
应该根据具体情况来设置通讯速率,并且要逐步调整以找到最合适的通讯速率。
3. 合理编写软件程序。
在编写软件程序时应该注意及时判断是否有需要发送或者接收的数据,并且要避免同时进行发送和接收操作。
4. 选择合适的单片机485芯片。
应该选择性能稳定、抗干扰能力强、通讯速度快等特点较好的单片机485芯片,从而避免单片机485串口读写冲突问题。
单片机上的RS485接口RS232虽然应用很广泛,但因为它推出较早,在现代网络通信中已经暴露出明显的缺点。
比如以下几点:1)数据传输速率慢。
RS232所规定的20KB/s的传输速率虽然能满足异步通信要求,通常异步通信速率限制在19.2KB/s以下对某些同步系统来说,不能满足传送速率要求。
2)传送距离短。
RS232接口一般装置之间电缆长度为15m,即使有较好的线路器件优良的信号质量,电缆长度也不会超过60m。
3)没有规定标准的连接器,因而出现了互不兼容的25芯连接器。
4)接口处各信号间容易产生串扰。
RS485接口的出现就弥补了RS232的不足,而出现了一种新的接口标准,并且由于良好的性能,RS485获得了广泛的应用,其具有以下特点:1)RS485的电气特性:逻辑“1”以两线间的电压差为+(2~6)V表示;逻辑“0”以两线间的电压差为(2~6)V表示。
接口信号电平比RS232降低了,就不易损坏接口电路的芯片,且该电平与TTL电平兼容,可方便与TTL电路连接。
2)RS485的数据最高传输速率为10MB/s。
3)RS485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。
4)RS485接口的最大传输距离标准值为4000英尺,实际上可达1000米,另外RS232接口在总线上只允许连接1个收发器,即单站能力。
而RS485接口在总线上是允许连接多达128个收发器。
即具有多站能力,这样用户可以利用单一的RS485接口方便地建立起设备网络。
RS485收发器SN65HVD3082的使用方法1)SN65HVD3082简介此芯片是半双工RS485收发器。
5V供电,全完符合TIA/EIA485A标准。
PIC单片机在连续接收串口数据时遇到的小问题
关于PIC单片机串口数据接收,如果数据接口一直可以检测数据,那么即使关闭RCIE,实际上也会接收数据。
当数据源源不断地进来时,你再使能RCIE的时候,其实也只能接收到关闭之后的两个数据,此后再也无法进入中断。
解决这样的方法为关闭引脚为串口的定义,让其成为普通引脚而非串口引脚。
格式为
PIE1&=0xdf;
RCSTA&=0x7f;//关闭
PIE1|=0x20;
RCSTA|=0x80;//开启
关于PIE和RCSTA置位的前后顺序其实也有关系,这样为正确顺序。
而在有限的时间内将接收到的数据进行处理时,数组的赋值比单个字符赋值的时间要长这因素也要被考虑到。
485通信程序(51单片机)什么是485通信?RS-485是一种串行通信协议,它使用差分信号传输数据。
485通信支持了在两个或以上设备之间传输数据的需求,比如用于电子计算机、通信设备、工业自动化等等。
RS-485已广泛应用于数控机床、自动化设备控制等领域中。
单纯的485通信包含四种通信模式:点对点、总线形、多主机和简介式通信。
其中,点对点通信指的是一对一的通信方式;总线形通信指的是一对多的群通信方式,所有设备都在同一条总线上发送和接收数据;多主机通信指的是多台主机的通信方式,多个设备都可以同时发送数据;简介式通信是一种用于仅需要发送少量数据的情况的通信方式。
下面介绍一下485通信的部分基本知识1.485通信的传输距离远,一般可以达到1200米。
2.485通信具有较强的抗干扰能力。
3.485通信使用差分信号进行传输,信号稳定,传输速率也比较快。
4.485通信可以支持多个设备同时进行通信,但是在同一时间内只有一个设备可发送数据。
5.在采用485通信时,一定要注意通讯端口的设置,如波特率、数据位、停止位等。
程序实现原理该程序使用了51单片机作为主控制器实现了基本的485通信,具体实现如下:1.通信模式的设置在程序开始时,需要设置通信模式。
如果通信模式为点对点通信,则可以直接使用UART通信模块进行通信;如果是多点通信,则需要使用485通信芯片。
2.通讯端口的配置在进行485通讯时,需要进行通讯端口的配置,包括波特率、数据位、停止位等参数的设定。
在485通信模式下,只有一个设备可为主设备,其他设备均为被设备。
在发送数据时,主设备的TXD口要与外部总线的D+口相连,而D-口不连接,从设备的TXD口要与D-口相连,而D+口不连接。
在接收数据时,主设备的RXD口要与D+口相连,而D-口不连接,从设备的RXD口要与D-口相连,而D+口不连接。
3.数据的发送和接收在发送和接收数据时,需要采用特定的方式进行报文的封装和解析。
基于RS-485协议实现单片机与单片机之间的通讯摘要:介绍以RS-485为通讯方式的两个单片机之间的通讯,同时给出单片机与单片机之间的通讯程序设计。
关键词:RS-485通讯单片机串行通讯0 引言随着工业化的发展,人们对现场仪表的要求越来越高,为了满足控制室对现场的实时监控,确保现场数据的实时获取,需要用一种方式将现场情况实时反映给控制室,我们研究了一种方便简单功、能优越的通讯方式:用RS-485实现现场单片机和控制室单片机的实时通讯。
通过操作控制室单片机就能实现对现场单片机的操作,节省了大量的时间以及相应的人力。
1、RS-485通讯协议RS-485采用平衡传输方式,连接时需要在传输线上接终接电阻。
RS-485可以采用二线与四线方式,二线制可实现真正的多点双向通信,采用四线连接时,即只能有一个主(Master)设备,其余为从设备,无论是四线还是二线连接方式总线上最多可接32个设备。
RS-485最大传输距离约为1219米,最大传输速率为10Mb/s。
平衡双绞线的长度与传输速率成反比,在100kb/s速率以下,才可能使用规定最长的电缆长度。
只有在很短的距离下才能获得最高速率传输。
一般100米长双绞线最大传输速率仅为1Mb/s。
RS-485需要2个终接电阻,其阻值要求等于传输电缆的特性阻抗,终接电阻接在传输总线的两端。
在短距离传输时可不需终接电阻,即一般在300米以下不需终接电阻。
本设计中采用的485通讯元件是75LBC184,该器件带有内置高能量瞬变噪声保护装置,可提供可靠的低成本的直连(不带绝缘变压器)数据线接口,不需要任何外部元件。
2、单片机与单片机的通讯系统本设计中单片机选用C8051F020,该单片机有100个功能引脚,其中有64个通用I/O端口。
C8051F020内有2个增强型串行口:UARTO和UART1,这两个串行口都可以工作在全双工异步方式或半双工同步方式,并且支持多处理器通信。
75LBC184与单片机连接时只需将R和D端分别与单片机的RXD 和TXD 相连即可。
基于PIC18单片机的RS 485/CAN 智能转换器的设计张海忠,邓先明,袁启东(中国矿业大学信电学院 江苏徐州 221008)摘 要:CAN 总线因具有突出的可靠性、实时性、灵活性等优点而被广泛应用,而目前国内采用RS 485系统的还比较多。
因此RS 485和CAN 的转换器设计就具有现实意义。
设计了一种基于PIC18单片机的RS 485/CAN 智能转换器,并对其硬件电路设计和软件编写流程进行了详细的讨论。
设计的转换器可实现RS 485和CAN 的双向通信,可用于RS 485系统到CAN 系统的升级。
关键词:RS 485;CAN 总线;PIC18单片机;转化器;串行通信中图分类号:TP36811 文献标识码:B 文章编号:1004373X (2007)0401403R elization of RS 485to CAN Interlligent Converter B ased on PIC18Single ChipZHAN G Haizhong ,DEN G Xianming ,YUAN Qidong(College of Information &Electrical Engineering of CUM T ,Xuzhou ,221008,China )Abstract :Owing to the advantage of outstanding reliability ,real time and flexible ,CAN bus is widely applied ,But RS 485system are used much more in country.So the design of a RS 485to CAN converter become to reality.This paper present a kind of converter based on PIC18chip.The hardware circuit and the software flow are given.It can realize the duplex commu 2nication between RS 485and CAN ,and ,be applied to the upgrade f rom RS 485system to CAN system.K eywords :RS 485;CAN Bus ;PIC18chip ;Converter ;serial communication收稿日期:200607151 引 言RS 485是一个电气接口规范,他定义了一个基于单对平衡线的多点、双向(半双工)通信链路,只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,在此基础上用户可以建立自己的高层通信协议,在当时看来是一种相对经济具有相当高噪声抑制相对高的传输速率传输距离远和宽共模范围的通信平台,因此基于RS 485总线的通讯方法得到了广泛的应用。
单片机485串口读写冲突单片机485串口读写冲突是指在使用串口进行数据通信时,由于读和写操作同时进行而造成的冲突现象。
这种冲突会导致数据发送或接收不完整,甚至造成通信失败。
在单片机中,485串口通信的读写冲突问题可以通过以下方法解决:1. 采用流程控制:可以通过硬件或软件的方式实现流控制,例如使用硬件流控制的方式,通过控制CTS(Clear To Send)和RTS(Request To Send)信号来进行数据的读写控制。
2. 设置读写优先级:通过设置读写优先级,可以确保在进行数据通信时,读操作和写操作不会同时进行。
可以根据不同的应用场景和需求,设置读写操作的优先级,从而避免冲突。
3. 缓冲区设计:在单片机中,可以通过设置发送缓冲区和接收缓冲区来避免读写冲突。
发送缓冲区用于存储待发送的数据,当串口空闲时,将数据从缓冲区发送出去;接收缓冲区用于存储接收到的数据,当数据接收完成后,再从缓冲区读取。
4. 使用中断:可以使用串口中断来实现数据的读取和写入。
通过设置中断触发条件和中断服务程序,当数据接收完成或发送缓冲区空闲时,触发中断进行相应的读写操作,从而避免读写冲突。
5. 使用互斥锁:可以通过使用互斥锁来实现对串口的互斥访问。
当一个任务正在进行读或写操作时,其他任务需要等待访问权限,从而确保同一时间只有一个任务能够进行读写操作,避免冲突发生。
除了以上的解决方法,还可以通过合理的软件设计和优化算法来尽可能减少读写冲突的发生,例如使用DMA(Direct Memory Access)方式进行数据传输,减轻单片机CPU的负担,提高效率。
另外,在设计和调试过程中,可以使用示波器等工具进行数据监测和分析,找出冲突问题的具体原因,并及时采取相应的措施进行修复。
在实际应用中,针对不同的场景和需求,可能需要结合多种方法来解决读写冲突问题,需要根据具体情况进行选择和调整。
同时,还需要进行充分的测试和验证,确保系统的稳定性和可靠性。
项目七单片机通信实践知识目标:1. 了解UART(Universal Asynchronous Receive/Transmitter通用异步收发器。
2.了解MAX232通信原理及标准的通信协议。
3. 了解MODBUS通信协议标准2. 采用通信芯片MAX485,及多机通信原理。
技能目标:1, 根据数据格式的协议,数据交换的协议要求硬件连接,实现串行通讯的硬环境。
2. MCU与PC 机及多个单片机的硬件连接方法3. 应用PROTEUS仿真工具软件绘制硬件连接图4. 使用Keil C 完成程序的编写和调试5. 使用最小系统板实现硬件调试任务一基于RS232的点对点通信任务提出通过MAX232直接应用UART(Universal Asynchronous Receive/Transmitter通用异步收发器,实现单片机与单片机,或单片机与PC微机之间数据传送。
知识准备7.1.1串行与并行通信在实际工作中,计算机与外部设备之间常常要进行信息交换,计算机与计算机之间也要交换信息,所有这些信息交换可称为通信。
在我们前面所学的知识中所涉及的数据传送都是采用并行方式,如单片机与存储器,的数据传送,存储器与存储器的数据传送,单片机与并行打印机之间的数据传送,CPU处理数据以8位数据并行方式同时一次传送一字节的数据,这样的传送方式要求用8条数据线和若于条控制信号线,传送距离较近。
当计算机与计算机之间的距离较远时过多的电缆使这种方式不够经济。
串行通信是用一位数据线传送数据,只用几条电缆线作控制信号线,串行通信适合远距离数据传送,处于两地的计算机之间采用串行通信就非常的经济,当然串行通信要求通信双方具有相同的数据转换格式,规定的时间控制,相等的逻辑电路,通一的通信协议。
7.1.1.1 串行与并行通信基本概念1.串行通信与并行通信通信方式有两种:并行通信和串行通信。
通常是根据信息传送的距离决定采用哪种通信方式,如果距离小于30cm则可采用并行通信方式,当距离大于30cm时则要采用通信方式。
#include <pic.h>
#include <math.h>
#include "stdio.h"
#define uchar unsigned char
#define uint unsigned int
__CONFIG(WDTDIS & HS & PWRTDIS & BORDIS);//设置配置位
// WDTDIS : disable watchdog timer
// LVPDIS : low voltage programming disabled
// HS : high speed crystal/resonator
// PWRTDIS : disable power up timer
// BORDIS : disable brown out reset
#define PORTAIT(adr,bit) ((unsigned)(&adr)*8+(bit)) //绝对位操作指令;static bit DI @(PORTAIT(PORTB,0);
static bit CK @(PORTAIT(PORTB,1);
static bit LA @(PORTAIT(PORTB,2);
static bit OE @(PORTAIT(PORTB,3);
#define RE RC2 //接收允许控制位
#define DE RC3 //发送允许控制位
uchar redata;
//---------------------------------------------------
void USART_Init(void);
void SEND_Byte(uchar dat);
void SEND_DM114_DA(uchar DA T);
void delay50us(uchar z);
//-------------------------------------------------
void delay50us(uchar z)
{
uchar i,j;
for(j=0;j<z;j++)
for(i=0;i<6;i++)
;
}
//--------------------------------
void SEND_Byte(uchar dat)
{
if(dat ==0)
// DI = 0;
RB0 = 0;
else
DI = 1;
// RB0 = 1;
}
void SEND_DM114_DA(uchar DA T)
{
uchar i;
OE = 1;
// RB3 = 1;
LA = 0;
// RB2 = 0;
for(i=0;i<8;i++)
{
SEND_Byte(DA T&0x80);
DA T << = 1;
CK = 0;
CK = 1;
// RB1 = 0;
// RB1 = 1;
}
LA = 1;
OE = 0;
// RB2 = 1;
// RB3 = 0;
}
//---------------------------------------------------------
//----------------------------------------------------------
void USART_Init(void)
{
SPBRG = 77; //高速波特率9600 12MHz SPBRG = 0x4D // SPBRG = 129; //高速波特率9600 20MHz
TXSTA = 0x04;
// TXSTA : CSRC TX9 TXEN SYNC -- BRGH TRMT TX9D
// 0 0 0 0 1 0 0
RCSTA = 0x80;
// RCSTA: SPEN RX9 SREN CREN ADDEN FERR OERR RX9D // 1 0 0 0 0 0 0 0 RCIE = 1; //开接收中断
TXEN = 1;
CREN = 1; //接收使能
TRISC6 = 1; //设置为输入状态
TRISC7 = 1;
// TXIE = 1; //开发送中断
TRISC3 = 0; //设置为输出状态
TRISC2 = 0;
RE = 0; //SN75176开启接收
DE = 0; // SN75176关闭发送
PEIE = 1; //开外设中断
GIE = 1; //开总中断
TRISB = 0x00; //B口为输出
}
//----------------------------------------------- void interrupt com(void)
{
if(RCIE&&RCIF)
{
redata=RCREG;
RE = 1; //SN75176关闭接收
DE = 1; // SN75176开启发送
TXREG=redata;
while(!TRMT);
RE = 0; //SN75176开启接收
DE = 0; //SN75176关闭发送
SEND_DM114_DA(redata);
}
}
//------------------------------------------------ void main(void)
{
uchar i,j;
USART_Init();
while(1)
{
// for(i=0;i<100;i++)
// delay50us(60);
// j++;
// if(j>250)
// j=0;
// SEND_DM114_DA(j);
}
}。