当前位置: 代码迷 >> 单片机 >> atmega128 485接收发送有关问题,无相应 但是串口两个RXD TXD端接能个接收数据
  详细解决方案

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

热度:406   发布时间:2016-04-28 16:29:19.0
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)
{