本帖最后由 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); //等待发送移位寄存器空
}
|