打印
[PIC®/AVR®/dsPIC®产品]

求助,PIC18F4520 串口通信发送数据有问题

[复制链接]
3996|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 quansjtu 于 2014-8-7 20:54 编辑

各位大虾好,
        本人从PIC16F877A 转到PIC18F4520。将之前的可用的RS485通信的程序改了后发现怎么都调不通,现请求帮助。
        问题描述:PIC18F4520串口通信,用485转usb模块与PC上位机通信。程序设置1秒发一个字节0x50,但是上位机有时候收不到字符,10秒钟可能只能收到7个字节,还有一些错误的字符。如图所示:

         思考:能发送出去,我想可能硬件没有什么问题,max485芯片的AB端分别上拉和下拉了,也加120欧姆匹配电阻了。
                   我想可能是软件方面问题,也不是波特率设置的不对,我特地算了好几遍,配置字里面也关闭了看门狗。

                   请有经验的朋友分析下可能是软硬件哪个地方出了问题,或者说可以有哪些方法测试找出故障来源,谢谢。
#include <pic18.h>
#include "config.h"  //包含自己的配置头文件
void delay1ms(uint DelayTime);
void rs485_init();
void senddata_uart(uchar cdd);
//*************** 主程序 ********************
void main(void)
{        
        TRISD1=0;
        rs485_init();
        delay1ms(5);
        while(1)
        {
            RD1=~RD1;
            delay1ms(254);  
                senddata_uart(0x50);
            delay1ms(254);  
            delay1ms(254);  
            delay1ms(254);                          
        }
}

//*****************延时 n*1ms 12MHz*****************

void delay1ms(uint DelayTime)
{        
        uint temp;
        for(uchar i=DelayTime;i>0;i--)
        {        
                for(temp=0;temp<330;temp++)
                {;}
        }
}


void rs485_init()
{
        SYNC=0;                     //选择异步通信模式
        BRGH=1;                     //选择高速波特率发生模式
        SPBRG=77;               //设置波特率为9600bps,12M
        SPEN=1;                                //串行通信端口打开,模块连接引脚TX,RX
        TRISC7=1;                        //RX引脚设置为输入
        TRISC6=1;                        //TX引脚设置为输入
        TX9=0;
        ADDEN=0;
        TXEN=1;         //允许发送数据
          DE=0;
}


void senddata_uart(uchar cdd)
{
        DE=1;
        TXREG=cdd;
        while(!TRMT);         //等待发送移位寄存器空
}
         


沙发
yewuyi| | 2014-8-8 08:21 | 只看该作者
为何搞这种delay1ms()函数呢?

你直接开一个定时器,每4mS中断一次,再设置一个定时变量,初始值为0,每次中断后将该变量加1,当发现该变量达到250后,就进行一次UART的发送处理。

使用特权

评论回复
板凳
quansjtu|  楼主 | 2014-8-8 14:19 | 只看该作者
yewuyi 发表于 2014-8-8 08:21
为何搞这种delay1ms()函数呢?

你直接开一个定时器,每4mS中断一次,再设置一个定时变量,初始值为0,每 ...

多谢提醒,定时处理的话最好还是用定时器,我当时也只是想测试下隔段时间串口发送功能,delay1ms最快啦~

使用特权

评论回复
地板
quansjtu|  楼主 | 2014-8-8 14:19 | 只看该作者
不好意思打扰了,发现问题了,max485芯片逻辑输入端没有加上拉电阻。之前用的PIC另一款单片机不用加上拉电阻就可以,所以想当然的就没有加上拉电阻,低端错误让大家见笑啦。

使用特权

评论回复
5
yewuyi| | 2014-8-8 14:35 | 只看该作者
quansjtu 发表于 2014-8-8 14:19
不好意思打扰了,发现问题了,max485芯片逻辑输入端没有加上拉电阻。之前用的PIC另一款单片机不用加上拉电阻 ...



使用特权

评论回复
6
sxyl181| | 2015-12-22 08:30 | 只看该作者
本帖最后由 sxyl181 于 2015-12-22 09:12 编辑

你说的输入端上拉电阻是MAX485的那个脚,我的问题是不是和你一样

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

1

粉丝