先說明一下情況:
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
回復