首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

atmega128 485接收发送有关问题,无相应 但是串口两个RXD TXD端接能个接收数据

2012-02-17 
atmega128 485接收发送问题,无相应但是串口两个RXD TXD端接能个接收数据#define FRAMING_ERROR (1FE1)#d

atmega128 485接收发送问题,无相应 但是串口两个RXD TXD端接能个接收数据

#define FRAMING_ERROR (1<<FE1)
#define PARITY_ERROR (1<<UPE1)
#define DATA_OVERRUN (1<<DOR1)
#define DATA_REGISTER_EMPTY (1<<UDRE1)
#define RX_BUFFER_SIZE1 64
#define TX_BUFFER_SIZE1 64
#define RevEnble() PORTD|=(1<<4) //发送
#define SendEnble() PORTD&=(~(1<<4)) //接收
#define Mul_Address UCSR1B=UCSR1B|0x01
#define Mul_Data UCSR1B=UCSR1B&0xfe


char rx_buffer1[RX_BUFFER_SIZE1];
char tx_buffer1[TX_BUFFER_SIZE1];
unsigned char rx_wr_index1,rx_rd_index1,rx_counter1;
unsigned char tx_wr_index1,tx_rd_index1,tx_counter1;




/********************************************************************************
* 函数名称:usart1_rx_isr
* 功 能: 
* 入口参数: 
*返回值:  
* 设计者:  
* 日 期: 
* 说 明: 
********************************************************************************/
#pragma vector=USART1_RXC_vect
__interrupt void Usart1_Rx_ISR(void)
{
  char status,data;

  status=UCSR1A;
  data=UDR1;
  if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
  {
  USART0_Transmit(data); //addtional
   
  rx_buffer1[rx_wr_index1]=data;
  if (++rx_wr_index1 == RX_BUFFER_SIZE1) rx_wr_index1=0;
  if (++rx_counter1 == RX_BUFFER_SIZE1)
  {
  rx_counter1=0;
  }
  }
}

/********************************************************************************
* 函数名称: unsigned char Usart1ReceiveByte(void)
* 功 能: 从串口1 接收一字节函数
* 入口参数: 无
*返回值: 接收的一字节
* 设计者:  
* 日 期: 
* 说 明: 
********************************************************************************/

unsigned char Usart1ReceiveByte(void)
{
  char data;

  Timer1_Begin();
  while (rx_counter1==0)
  {
  if(Timer1_Flag)
  {
  Timer1_Flag=0;  
  Timer1_Stop();
  return 0xff;
  }
  }
  Timer1_Stop();
  data=rx_buffer1[rx_rd_index1];
  if (++rx_rd_index1 == RX_BUFFER_SIZE1) rx_rd_index1=0;
   
  // _CLI();
  --rx_counter1;
  // _SEI();
  return (0x00ff&data);
}

/*********************************************************************
** 函数名称:void Usart1_Tx_ISR(void)
** 函数功能:多机通讯串口1 中断发送
** 入口参数:无
** 返回值: 无
** 设计人:  
** 日 期 :
**说 明:
**********************************************************************/
#pragma vector=USART1_UDRE_vect
__interrupt void Usart1_Tx_ISR(void)
{
  if (tx_counter1>0)
  {
  BIT_LED_WORK = 0;
  --tx_counter1;
  UDR1=tx_buffer1[tx_rd_index1];
   
  if (++tx_rd_index1 == TX_BUFFER_SIZE1) 
  tx_rd_index1=0;
  }
  else
  {
  BIT_LED_WORK = 1;
// RS485_R;
  RevEnble();
  }

}
/*********************************************************************
** 函数名称:void Uart1SendByte(char data)
** 函数功能:多机通讯串口1 发送一字节
** 入口参数:无
** 返回值: 无
** 设计人:  
** 日 期 :
**说 明:
**********************************************************************/
void Uart1SendByte(char data)
{


  SendEnble();  
  if(MulModeFlag==1)
  {
  Mul_Address;
  UDR1=data;
  }
  else if(MulModeFlag==0)
  { 
  // RS485_S;
   
  Mul_Data;
  while (tx_counter1 == TX_BUFFER_SIZE1);
  //if (tx_counter1 || ((UCSR1A & DATA_REGISTER_EMPTY)==0))
  tx_buffer1[tx_wr_index1]=data;
  if (++tx_wr_index1 == TX_BUFFER_SIZE1) tx_wr_index1=0;
  ++tx_counter1;
  UCSR1B |= (1<<UDRIE1);
  }

  _SEI();  
}

高手帮我看看,我在接收发送使能设置。 我怀疑是接收、发送使能端问题。 单独串口是能够使用的。。。。。

[解决办法]
将485芯片的发送接收使能端接到一起,给高低电平控制收发,要延时一段时间再收发数据!

热点排行