• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

关于PIC16F877A的USART通信(C语言)问题;

先说明一下情况:
1、 系统为PC机232-下位机485,PC使用232-485转接口一对多;
2、 下位机晶振20M;
3、 通信协议借用MODBUS;
4、 PC间隔100MS查询或操作一个下位机,用串口工具实测20MSm内查询一个下位机并返回26个数,系统不会出错;
5、 下位机一次返回26个数,或进行相关控制;
6、 主循环中加入了接收设置,也就是说只要在工作,没循环一圈就将USART设置为接收状态;
7、 下位机返回或修改数据是接收中断内完成的,接收中断在返回数据结束后修改USART为接收状态;
8、 看门狗开;
问题是:
通信正常,但PC连续多次控制下位机修改操作时,有可能通信中断,一但中断再也建立不起通信,没搞明白?
百思不得其解的是,我主循环中加入了接收设置,也就是初始化串口;看门狗复位都不能通信,并没有死机呀.
求教分析分析!
全部回复(3)
正序查看
倒序查看
xing1234
LV.6
2
2007-11-21 10:14
我的通信设置:
//工作频率20M

#include
#include

#define  PORTBIT(add,bit) ((unsigned)(&add)*8+(bit))

#define    RE_TRIS     TRISC4
#define    DE_TRIS     TRISC5
static  bit          RE   @  PORTBIT(PORTC,5);
static  bit          DE   @  PORTBIT(PORTC,4);

/*****************函数申明区********************/
void com_usart_se_out8(void);
void com_usart_out8(unsigned char );
void com_usart_se_in8(void);

/***********************异步通信*********/
void com_usart_se_out8(void)
{
  PORTC |=0xE0;
  TRISC7= 1;       //0
  TRISC6= 0;       //1
  RE_TRIS= 0;       //0   RE_DE
  DE_TRIS= 0;
  RE = 1;
  DE = 1;
//  SPBRG = 19;     //19   波特率设baud rate=20M/16(19+1)=62500
  SPBRG = 64;       //64   19200  20M
  BRGH  = 1;      //高速传送模式
  SYNC  = 0;       //选取异步模式
  SPEN  = 1;       //发送开端口      //0
  CSRC  = 1;       //选内部时钟
  TX9   = 0;
  RCSTA=0x80;
  RCIE  = 0;      //接收中断使能
  PEIE = 0;        // 禁止发送中断
  SPEN  = 1;       //发送开端口
}
void com_usart_out8(unsigned char data_8)
{
  TXREG =  data_8;
  TXEN  = 1;       //发送使能
  while(!TRMT);
  TXIF  = 0;
  TXEN  = 0;       //发送使能结束
}
/***********************异步通信*********/
void com_usart_se_in8(void)
{
  TRISC7= 1;       //0
  TRISC6= 0;       //1
  RE_TRIS = 0;
  DE_TRIS = 0;
  RE = 0;
  DE = 0;
  SPBRG = 64;       //64   19200
  BRGH  = 1;      //高速传送模式
  SYNC  = 0;       //选取异步模式
  RCIF = 0;        //中断标志位清零
  SPEN  = 1;       //发送开端口      //0
  RX9   = 0;
  CSRC  = 1;       //选内部时钟
  CREN  = 1;       //0禁止连续接收
  ADDEN = 0;      //
  TXIE=0;         // 0禁止发送中断
  RCIE  = 1;      //接收中断使能
  PEIE = 1;       //外围中断使能
  GIE  = 1;
}
0
回复
xing1234
LV.6
3
2007-11-22 11:49
@xing1234
我的通信设置://工作频率20M#include#include#define  PORTBIT(add,bit)((unsigned)(&add)*8+(bit))#define    RE_TRIS    TRISC4#define    DE_TRIS    TRISC5static  bit          RE  @  PORTBIT(PORTC,5);static  bit          DE  @  PORTBIT(PORTC,4);/*****************函数申明区********************/voidcom_usart_se_out8(void);voidcom_usart_out8(unsignedchar);voidcom_usart_se_in8(void);/***********************异步通信*********/voidcom_usart_se_out8(void){  PORTC|=0xE0;  TRISC7=1;      //0  TRISC6=0;      //1  RE_TRIS=0;      //0  RE_DE  DE_TRIS=0;  RE=1;  DE=1;//  SPBRG=19;    //19  波特率设baudrate=20M/16(19+1)=62500  SPBRG=64;      //64  19200  20M  BRGH  =1;      //高速传送模式  SYNC  =0;      //选取异步模式  SPEN  =1;      //发送开端口      //0  CSRC  =1;      //选内部时钟  TX9  =0;  RCSTA=0x80;  RCIE  =0;      //接收中断使能  PEIE=0;        //禁止发送中断  SPEN  =1;      //发送开端口}voidcom_usart_out8(unsignedchardata_8){  TXREG=  data_8;  TXEN  =1;      //发送使能  while(!TRMT);  TXIF  =0;  TXEN  =0;      //发送使能结束}/***********************异步通信*********/voidcom_usart_se_in8(void){  TRISC7=1;      //0  TRISC6=0;      //1  RE_TRIS=0;  DE_TRIS=0;  RE=0;  DE=0;  SPBRG=64;      //64  19200  BRGH  =1;      //高速传送模式  SYNC  =0;      //选取异步模式  RCIF=0;        //中断标志位清零  SPEN  =1;      //发送开端口      //0  RX9  =0;  CSRC  =1;      //选内部时钟  CREN  =1;      //0禁止连续接收  ADDEN=0;      //  TXIE=0;        //0禁止发送中断  RCIE  =1;      //接收中断使能  PEIE=1;      //外围中断使能  GIE  =1;}
自个顶一下!
0
回复
xing1234
LV.6
4
2007-11-22 15:22
我有点怀疑是晶振有问题,此前我试过多种20M的晶振,只有一种能正常工作,最近发现有时;连看门狗都死了,LCD显示花屏.现在我在晶振两端并了个1M的电阻试试再说.各位有何意见或建议尽管说.
0
回复