先說明一下情況:
1、 系統(tǒng)為PC機(jī)232-下位機(jī)485,PC使用232-485轉(zhuǎn)接口一對多;
2、 下位機(jī)晶振20M;
3、 通信協(xié)議借用MODBUS;
4、 PC間隔100MS查詢或操作一個下位機(jī),用串口工具實測20MSm內(nèi)查詢一個下位機(jī)并返回26個數(shù),系統(tǒng)不會出錯;
5、 下位機(jī)一次返回26個數(shù),或進(jìn)行相關(guān)控制;
6、 主循環(huán)中加入了接收設(shè)置,也就是說只要在工作,沒循環(huán)一圈就將USART設(shè)置為接收狀態(tài);
7、 下位機(jī)返回或修改數(shù)據(jù)是接收中斷內(nèi)完成的,接收中斷在返回數(shù)據(jù)結(jié)束后修改USART為接收狀態(tài);
8、 看門狗開;
問題是:
通信正常,但PC連續(xù)多次控制下位機(jī)修改操作時,有可能通信中斷,一但中斷再也建立不起通信,沒搞明白?
百思不得其解的是,我主循環(huán)中加入了接收設(shè)置,也就是初始化串口;看門狗復(fù)位都不能通信,并沒有死機(jī)呀.
求教分析分析!
關(guān)于PIC16F877A的USART通信(C語言)問題;
全部回復(fù)(3)
正序查看
倒序查看
我的通信設(shè)置:
//工作頻率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);
/*****************函數(shù)申明區(qū)********************/
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 波特率設(shè)baud rate=20M/16(19+1)=62500
SPBRG = 64; //64 19200 20M
BRGH = 1; //高速傳送模式
SYNC = 0; //選取異步模式
SPEN = 1; //發(fā)送開端口 //0
CSRC = 1; //選內(nèi)部時鐘
TX9 = 0;
RCSTA=0x80;
RCIE = 0; //接收中斷使能
PEIE = 0; // 禁止發(fā)送中斷
SPEN = 1; //發(fā)送開端口
}
void com_usart_out8(unsigned char data_8)
{
TXREG = data_8;
TXEN = 1; //發(fā)送使能
while(!TRMT);
TXIF = 0;
TXEN = 0; //發(fā)送使能結(jié)束
}
/***********************異步通信*********/
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; //中斷標(biāo)志位清零
SPEN = 1; //發(fā)送開端口 //0
RX9 = 0;
CSRC = 1; //選內(nèi)部時鐘
CREN = 1; //0禁止連續(xù)接收
ADDEN = 0; //
TXIE=0; // 0禁止發(fā)送中斷
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);
/*****************函數(shù)申明區(qū)********************/
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 波特率設(shè)baud rate=20M/16(19+1)=62500
SPBRG = 64; //64 19200 20M
BRGH = 1; //高速傳送模式
SYNC = 0; //選取異步模式
SPEN = 1; //發(fā)送開端口 //0
CSRC = 1; //選內(nèi)部時鐘
TX9 = 0;
RCSTA=0x80;
RCIE = 0; //接收中斷使能
PEIE = 0; // 禁止發(fā)送中斷
SPEN = 1; //發(fā)送開端口
}
void com_usart_out8(unsigned char data_8)
{
TXREG = data_8;
TXEN = 1; //發(fā)送使能
while(!TRMT);
TXIF = 0;
TXEN = 0; //發(fā)送使能結(jié)束
}
/***********************異步通信*********/
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; //中斷標(biāo)志位清零
SPEN = 1; //發(fā)送開端口 //0
RX9 = 0;
CSRC = 1; //選內(nèi)部時鐘
CREN = 1; //0禁止連續(xù)接收
ADDEN = 0; //
TXIE=0; // 0禁止發(fā)送中斷
RCIE = 1; //接收中斷使能
PEIE = 1; //外圍中斷使能
GIE = 1;
}
0
回復(fù)
@xing1234
我的通信設(shè)置://工作頻率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);/*****************函數(shù)申明區(qū)********************/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 波特率設(shè)baudrate=20M/16(19+1)=62500 SPBRG=64; //64 19200 20M BRGH =1; //高速傳送模式 SYNC =0; //選取異步模式 SPEN =1; //發(fā)送開端口 //0 CSRC =1; //選內(nèi)部時鐘 TX9 =0; RCSTA=0x80; RCIE =0; //接收中斷使能 PEIE=0; //禁止發(fā)送中斷 SPEN =1; //發(fā)送開端口}voidcom_usart_out8(unsignedchardata_8){ TXREG= data_8; TXEN =1; //發(fā)送使能 while(!TRMT); TXIF =0; TXEN =0; //發(fā)送使能結(jié)束}/***********************異步通信*********/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; //中斷標(biāo)志位清零 SPEN =1; //發(fā)送開端口 //0 RX9 =0; CSRC =1; //選內(nèi)部時鐘 CREN =1; //0禁止連續(xù)接收 ADDEN=0; // TXIE=0; //0禁止發(fā)送中斷 RCIE =1; //接收中斷使能 PEIE=1; //外圍中斷使能 GIE =1;}
自個頂一下!
0
回復(fù)