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