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;
}
|