bbxyliyang08 发表于 2013-4-19 18:17:48

关于485发送延时问题

//485数据发送
void send_data(unsigned char addr,unsigned char type,unsigned char len ,unsigned char *buf)//发送程序单片机---PC
{
        unsigned int i;
        unsigned char checksum =0;
       
        PORTC.5=1;
        putchar(0x68); //发送头
        delay_ms(1);   
       
        checksum=checksum+0x68;
    //发送地址
        putchar(addr);
        delay_ms(1);
        checksum=checksum+addr;
       
        putchar(0x68);
        delay_ms(1);
        checksum=checksum+0x68;
        putchar(type);      //命令
        delay_ms(1);
        checksum=checksum+type;
        putchar((len+2));//长度,加2是表示2个数据标示   
        delay_ms(1);
        checksum=checksum+(len+2);
        putchar(rx_buffer);//标识
        delay_ms(1);
        checksum=checksum+rx_buffer;
        putchar(rx_buffer);   
        delay_ms(1);
        checksum=checksum+rx_buffer;
        for(i=0;i<len;i++)
        {
                putchar(*buf);
                delay_ms(1);
                checksum=checksum+*buf;
                buf++;
        }
        putchar(checksum);
        delay_ms(1);
       
        putchar(0x16);
        delay_ms(2);
        PORTC.5=0;
       
}
为什么每次发生一个字节都要延时?PC才收到数据?

god-father 发表于 2013-4-19 21:19:18

执行putchar(0x16);后数据不是立即发送完毕的,要一定的间隔,在这个间隔中,如果没等数据发送完整,就改变485的RS位,数据会发送不全。

channe 发表于 2013-4-19 21:30:01

看你什么芯片了,有的芯片串口有FIFO缓冲,所以改变RS位只能使用发送完成中断。

cdwess 发表于 2013-4-19 21:41:24

波特率越小,延时时间越长,具体时间要大于一个字节发送时间,不然会缺码

HadesHe 发表于 2013-4-20 00:15:38

你不会用中断方式发送吗?

tongdayusu 发表于 2013-4-20 08:31:36

保证串口真正发送完成之后才能动作。

bbxyliyang08 发表于 2013-4-20 11:55:30

HadesHe 发表于 2013-4-20 00:15 static/image/common/back.gif
你不会用中断方式发送吗?

这就是中断发送啊。
页: [1]
查看完整版本: 关于485发送延时问题