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芯片的发送接收使能端接到一起,给高低电平控制收发,要延时一段时间再收发数据!