#include <p33fxxxx.h>
unsigned char recbuf[8];
unsigned char recpt;
char *testbuf="www.PIC591.com";
unsigned int i ;
void write_485_string(char *data,unsigned char len);
int main(void)
{
_PLLPRE = 0 ; //N1 = 2
_PLLDIV = 38 ; //M = 38+2 = 40
_PLLPOST = 0 ; //N2 = 2
//FOSC = (8/2) * 40 / 2 = 80M
while(OSCCONbits.LOCK == 0) ; //等待PLL稳定
_DISI = 1 ; //使能DISI指令,部分内建函数需要,建议开启
_TRISB9 = 1 ; //RB9/AN9为输入口
_PCFG9 = 0 ; //RB9/AN9设置为模拟口
_LATF3 = 1; //串口TX默认为高电平
_TRISF2 = 1; //U1RX输入
_TRISF3 = 0; //U1TX输出
_LATD6 = 0; //处于接收态
_TRISD6 = 0; //485控制引脚输出
U1MODE = 0X8800; //传统的N,8,1模式,不使用CTS,RTS,BRGH = 0,只能使用该模式
U1STA = 0X2400; //收发使能,TSR空中断,
U1BRG = 259; //FCY=40M,40000/16/9.6 - 1 = 259
_U1TXIP = 1; //设置U2TX优先级
_U1RXIP = 2; //设置U2RX优先级
_U1TXIF = 0;
_U1RXIF = 0;
_U1TXIE = 0; //不启用发送中断
_U1RXIE = 1; //启动接收中断
for(i = 0 ; i < 0xff ; i++);
write_485_string(testbuf,14); //
while(1);
}
/*
函数功能:485发送函数
入口参数:字符串数组首地址,要发送的长度
出口参数:无
调用说明:发送完毕,485方向控制位回到接收状态
*/
void write_485_string(char *data,unsigned char len)
{
_LATD6 = 1;
while(len--)
{
U1TXREG = *data++;
while(_U1TXIF == 0);
_U1TXIF = 0;
}
LATDbits.LATD6 = 0;
}
/*
向量编号,见具体的链接文件,如xxxx.gld
*/
void __attribute__((__interrupt__,no_auto_psv)) _U1RXInterrupt(void)
{
unsigned int temp;
do
{
temp = U1RXREG; //先读走数据
_U1RXIF = 0;
if(U1STAbits.OERR) //判定是否出错
{
U1STAbits.OERR=0;
}
else
{
recbuf[recpt] = U1RXREG;
recpt++;
if(recpt == 8)
{
recpt = 0;
}
}
}while(U1STAbits.URXDA); //一定要加此句,防止漏收
}
程序如上,之前还可以运行,昨天改了程序,突然不行了,一直停留在 while(_U1TXIF == 0);
不只是怎么回事 |