[英]How to receive a string properly from UART
我發送一個這樣的字符串:$ 13,-14,283,4,-4,17,6,-240,-180#
但是沒有顯示因為緩沖區是“重載”,我怎樣才能收到整個字符串或者如何在讀取每個字節后清除它?
// get a character string
char *getsU2(char *s, int len) {
char *p = s; // copy the buffer pointer
do {
*s = getU2(); // get a new character
if (( *s=='\r') || (*s=='\n')) // end of line...
break; // end the loop s++;
// increment the buffer pointer
len--;
} while (len>1); // until buffer is full
*s = '\0'; // null terminate the string
return p; // return buffer pointer
}
// get a character string
char *getsU2(char *s, int len) {
char *p = s; // copy the buffer pointer
do {
*s = getU2(); // get a new character
if (( *s=='\r') || (*s=='\n')) // end of line...
break; // end the loop
s++;
// increment the buffer pointer
len--;
} while (len>1); // until buffer is full
*s = '\0'; // null terminate the string
return p; // return buffer pointer
}
char getU2(void) {
if(U2STAbits.OERR == 1)
{ U2STAbits.OERR = 0; }
while (!U2STAbits.URXDA); // wait for new character to arrive return U2RXREG;
// read character from the receive buffer }
getsU2(buffer,sizeof(buffer));
嘗試使用UART接收中斷。 以下代碼適用於PIC24H; 適當修改。
在你的init函數中:
IFS0bits.U1RXIF = 0; // clear rx interrupt flag
IFS0bits.U1TXIF = 0; // clear tx interrupt flag
IEC0bits.U1RXIE = 1; // enable Rx interrupts
IPC2bits.U1RXIP = 1;
IEC0bits.U1TXIE = 1; // enable tx interrupts
IPC3bits.U1TXIP = 1;
創建一個中斷處理程序,將字節放入緩沖區或隊列:
void __attribute__((__interrupt__, auto_psv)) _U1RXInterrupt(void)
{
char bReceived;
// Receive Data Ready
// there is a 4 byte hardware Rx fifo, so we must be sure to get all read bytes
while (U1STAbits.URXDA)
{
bReceived = U1RXREG;
// only usethe data if there was no error
if ((U1STAbits.PERR == 0) && (U1STAbits.FERR == 0))
{
// Put your data into a queue
FIFOPut(bReceived);
}
}
IFS0bits.U1RXIF = 0; // clear rx interrupt flag
}
您的隊列代碼如下:
#define FIFO_SIZE 64
char pbBuffer[FIFO_SIZE];
char *pbPut;
char *pbGet;
void FIFOInit(void)
{
pbPut = pbBuffer;
pbGet = pbBuffer;
}
void FIFOPut(char bInput)
{
*pbPut = bInput;
pbPut++;
if (pbPut >= (pbBuffer + FIFO_SIZE))
pbPut = pbBuffer;
}
char FIFOGet(void)
{
char bReturn;
bReturn = *pbGet;
pbGet++;
if (pbGet>= (pbBuffer + FIFO_SIZE))
pbGet= pbBuffer;
}
顯然,應該加強FIFO功能以防止溢出,在空隊列上返回錯誤等。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.