UART 缓冲区未在 PIC24F 上引发标志
UART buffer not raising a flag on PIC24F
我正在使用 RN42-XV 蓝牙模块从计算机向 PIC24F 发送字符。
该模块 connected/paired 正确并且发送的字符也正确(使用示波器)。
这是它的初始化方式:
void initUART(){
//Peripheral Pin Mapping
RPINR19bits.U2RXR = 5; //pin 14 UART Receive
RPOR5bits.RP11R = 3; //pin 17 UART Transmit
//Configuring the UART
U2BRG = BRGVAL;
U2MODEbits.UARTEN = 1;
U2MODEbits.UEN = 0;
U2MODEbits.PDSEL = 0;// 8 bit no parity
U2MODEbits.STSEL = 0; // 1 stop bit
U2STAbits.UTXEN = 0;
U2STAbits.URXISEL = 0;
//Putting the UART interrupt flag down.
IFS1bits.U2RXIF = 0;
}
我也在用这个函数来获取缓冲区的内容:
int waitForChar(){
int receivedChar;
// Use the UART RX interrupt flag to wait until we recieve a character.
while(IFS1bits.U2RXIF == 1){
// Clear the UART RX interrupt flag to we can detect the reception
// of another character.
IFS1bits.U2RXIF = 0;
// U2RXREG stores the last character received by the UART. Read this
// value into a local variable before processing.
receivedChar = U2RXREG;
}
return receivedChar;
}
问题是程序永远不会进入函数 waitForChar() 内的 while 循环,因为硬件永远不会引发 UART 中断标志。
我尝试了不同的 PIC24F,但都 运行 遇到了同一个问题。
我注意到几件事:
在完全配置之前启用模块 (UARTEN)。
不应该U2STA.URXDA作为标志来测试接收吗?
您没有在两个寄存器中配置多个位。如果您完全确定启动状态是您喜欢的,那也没关系。
函数类型被声明为 void
所以它没有 return 任何东西。如果您尝试分配其 return 值,您应该会收到编译器警告。此外,它不等待一个字符。 "non blocking" 就是 return,但是您需要一个 return 值来告诉您它是否有字符。如果你想让它等待 return 一个字符,它可能是这样的
int waitForChar(){ // declare a return type
int receivedChar;
while(IFS1bits.U2RXIF == 0); // wait
receivedChar = U2RXREG;
IFS1bits.U2RXIF = 0; // clear status
return receivedChar;
}
UART 初始化代码缺少这一行:
AD1PCFG = 0xFFFF
ADC 标志优先于 UART。此行禁用它们。
我正在使用 RN42-XV 蓝牙模块从计算机向 PIC24F 发送字符。 该模块 connected/paired 正确并且发送的字符也正确(使用示波器)。
这是它的初始化方式:
void initUART(){
//Peripheral Pin Mapping
RPINR19bits.U2RXR = 5; //pin 14 UART Receive
RPOR5bits.RP11R = 3; //pin 17 UART Transmit
//Configuring the UART
U2BRG = BRGVAL;
U2MODEbits.UARTEN = 1;
U2MODEbits.UEN = 0;
U2MODEbits.PDSEL = 0;// 8 bit no parity
U2MODEbits.STSEL = 0; // 1 stop bit
U2STAbits.UTXEN = 0;
U2STAbits.URXISEL = 0;
//Putting the UART interrupt flag down.
IFS1bits.U2RXIF = 0;
}
我也在用这个函数来获取缓冲区的内容:
int waitForChar(){
int receivedChar;
// Use the UART RX interrupt flag to wait until we recieve a character.
while(IFS1bits.U2RXIF == 1){
// Clear the UART RX interrupt flag to we can detect the reception
// of another character.
IFS1bits.U2RXIF = 0;
// U2RXREG stores the last character received by the UART. Read this
// value into a local variable before processing.
receivedChar = U2RXREG;
}
return receivedChar;
}
问题是程序永远不会进入函数 waitForChar() 内的 while 循环,因为硬件永远不会引发 UART 中断标志。 我尝试了不同的 PIC24F,但都 运行 遇到了同一个问题。
我注意到几件事:
在完全配置之前启用模块 (UARTEN)。
不应该U2STA.URXDA作为标志来测试接收吗?
您没有在两个寄存器中配置多个位。如果您完全确定启动状态是您喜欢的,那也没关系。
函数类型被声明为 void
所以它没有 return 任何东西。如果您尝试分配其 return 值,您应该会收到编译器警告。此外,它不等待一个字符。 "non blocking" 就是 return,但是您需要一个 return 值来告诉您它是否有字符。如果你想让它等待 return 一个字符,它可能是这样的
int waitForChar(){ // declare a return type
int receivedChar;
while(IFS1bits.U2RXIF == 0); // wait
receivedChar = U2RXREG;
IFS1bits.U2RXIF = 0; // clear status
return receivedChar;
}
UART 初始化代码缺少这一行:
AD1PCFG = 0xFFFF
ADC 标志优先于 UART。此行禁用它们。