打印
[AVR单片机]

485串口通信不正常,我只使用485和232一样一对一通信可以吗?

[复制链接]
3365|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xu0801hua|  楼主 | 2014-10-21 10:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
485串口通信不正常,我只使用485和232一样一对一通信可以吗?
我485通信总是出不对参数,接收6个字节正常,接收8个接不正常
帮我看看通信错在那?
#define F_CPU 11059200UL
#include <avr/io.h>
#include <avr/delay.h>
#include <util/twi.h>
#include <avr/interrupt.h>   //中断函数头文件

#define        INT8U        volatile unsigned char
#define        INT16U        volatile unsigned int
#define fosc 11059200

//内存//时钟
#define IIC_FM3116  0xa0
#define IIC_clock   0xd0
/****************时间数组******************/
volatile unsigned char gettime[8]={0};

volatile unsigned char Uart_R_Taqb[8],Uart_Tx_Taqb[8];
volatile unsigned char ztai,i='h';
volatile unsigned char flag=0,rdata;
volatile unsigned int z1=0,z2=0,z3=0,z4=0,z5=0,z6=0,z7=0,z8=0,z9=0,z10=0;

#define R_USART1_OUT  PORTE |= (1<<PE2);                                                        //PD1口输出信号为高,单片机处于发送状态
#define R_USART1_IN          PORTE &= ~(1<<PE2);                                                //PD1口输出信号为低,单片机处于接收状态

//sbit i,a;PORTE&=~(1<<PE2);
void delayms(INT16U xms)
{
INT16U i,j;
for(i=xms;i>0;i--)
   for(j=8800;j>0;j--);
}
void put()       //IO口配置初始化
{
DDRA  = 0XFF;   //配置输出
PORTA = 0XFF;

DDRB |= _BV(PB5)|_BV(PB6)|_BV(PB7);  //配置PB5.6.7脚位输出
DDRB &= ~(_BV(PB0)|_BV(PB1)|_BV(PB2)|_BV(PB3)|_BV(PB4));//配置PB0 1 2 3 4脚位输入
PORTB |= 0XE0;

DDRC  = 0XFF;   //配置输出  
PORTC = 0XFF;

DDRD  |=_BV(PD2)|_BV(PD3)|_BV(PD4)|_BV(PD5)|_BV(PD6)|_BV(PD7) ;//配置PD2 3 4 5 6 7脚位输出
PORTD |= 0XFC;

DDRE &= ~(_BV(PE3)|_BV(PE4)|_BV(PE5)|_BV(PE6)|_BV(PE7));//配置PE3 4 5 6 7脚位输入
DDRE |= _BV(PE2);
PORTE|= 0x00;

DDRF  |= _BV(PF0)|_BV(PF1)|_BV(PF2)|_BV(PF3);    //配置PF0 1 2 3脚位输入
PORTF |= 0x0F;                               //高电平

DDRG   |=_BV(PG0)|_BV(PG1)|_BV(PG2)|_BV(PG3)|_BV(PG4);
PORTG  |=0X1F;
}

void uart_init(INT16U baud)   //串口波特率带参数初始化
{
INT16U a;
UCSR0C=0x06;          //异步模式,禁止奇偶校验,停止位为1位,数据位为8位
a=fosc/16/baud-1;     //波特率计算
UBRR0L=a%256;         //
UBRR0H=a/256;         //
UCSR0B=0x98;          //配置串口方式
}

void uart_send(INT16U data)
{
  R_USART1_OUT;                     //设置串口为输出状态  1
  _delay_us(2);                     //延时5ms
  while( !(UCSR0A & (1<<UDRE)));        // 等待数据寄存器空
  UDR0=data;                        //将所要发送的数据存入UDR寄存器
  _delay_us(2);                     //延时5ms
  R_USART1_IN;                      //默认为输入状态   0
}

void SendTab(volatile unsigned char *pTabl)
{
volatile unsigned char i;
  for(i=0;i<8;i++)
  {
  uart_send(*pTabl++);//发送1字节数据
  }
}

uint8_t getc(void)
{   
    R_USART1_IN;                       //0
    _delay_us(2);                     //延时5ms
        while( !(UCSR0A & (1<<RXC)));                        // 等待接收到标记
        return UDR0;
//        _delay_ms(5);
}
/*************************************/
//主函数
//功能:
//函数:
int main()
{
uart_init(9600); //串口初始化
sei();           //中断
put();           //口配置
eeprom_init();   //TWI初始化
R_USART1_IN
while(1)
{
if(flag==1)
  {
  flag=0;
Uart_R_Taqb[0]=0x01;Uart_R_Taqb[1]=0x02;Uart_R_Taqb[2]=0x03;Uart_R_Taqb[3]=0x04;
  SendTab(Uart_R_Taqb);_delay_ms(2000);
  }
}
}
ISR(USART0_RX_vect)
{
volatile unsigned char i;
PORTF^=(1<<PF1);
for(i=0;i<8;i++)
{
Uart_R_Taqb[i]=rdata=getc();//
}

flag=1;
}

相关帖子

沙发
xu0801hua|  楼主 | 2014-10-21 10:14 | 只看该作者
我使用的是avr studio编译器

使用特权

评论回复
板凳
kingne| | 2014-10-21 10:22 | 只看该作者
完全看不懂

使用特权

评论回复
地板
yubsh| | 2014-10-21 11:16 | 只看该作者
你去找一个MODBUS的开源例程看看吧,教科书的东西不适合实际应用。

使用特权

评论回复
5
luofeng2g| | 2014-10-21 11:26 | 只看该作者
接收中断这样处理能出得来?

使用特权

评论回复
6
xu0801hua|  楼主 | 2014-10-21 11:32 | 只看该作者
luofeng2g 发表于 2014-10-21 11:26
接收中断这样处理能出得来?

我接收完8个字节就可以出来了

使用特权

评论回复
7
xu0801hua|  楼主 | 2014-10-21 11:34 | 只看该作者
luofeng2g 发表于 2014-10-21 11:26
接收中断这样处理能出得来?

我板子上是max487csa芯片485,外接一个485转换器

使用特权

评论回复
8
luofeng2g| | 2014-10-21 12:54 | 只看该作者
xu0801hua 发表于 2014-10-21 11:32
我接收完8个字节就可以出来了

什么条件进中断? 是不是接收到一个字节就进中断了? 那怎么能读到8个字节?

使用特权

评论回复
9
joyme| | 2014-10-24 10:25 | 只看该作者
用了中断接收,又用查询,还循环,说明你完全没有理解串口通信

使用特权

评论回复
10
yklstudent| | 2014-10-29 12:43 | 只看该作者
freemodbus下自带的AVR例子,楼主移植下就可以用了

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

34

主题

81

帖子

1

粉丝