您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關R5F100LE串口隊列的實現和UART使用心得是怎樣的,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
介紹一下如何使用瑞薩的串口,當然使用串口的配置很簡單只要,用代碼生成器配置一下就行了。如果你也用的R78/G13這個套件,使用串口與電腦通信的話,還需要一個USB轉TTL的插頭,板子上沒有232電平轉換電路。如果沒用過串口的話這有個教程R78/G13開發套件 快速入門教程。要有這里就不介紹如何配置串口了,重點寫一下串口隊列的實現,ardiuno的串口用起來很方便,因為他有一個串口隊列,這篇文章介紹在,R5F100LE中實現一個環形串口隊列。
環形隊列就是頭尾相連的隊列,如果放入的數據不超出定義的隊列長度,就可以一直使用,不用考慮隊列的長度。環形隊列的實現,主要就是三個函數,putMsg()將數據放入隊列中,getMsg()將數據從隊列中取出,取出的是第一個放入隊列中的數據,這也是隊列的基本特點。testQueue()檢查隊列中是否有數據,有數據的話就放回1。
#define QUEUELEN 256 uint8_t queuehead = 0, queuetail = 0;//隊列頭尾的指示 uint8_t msg[QUEUELEN];//隊列存放數組 void putMsg(uint8_t m) //將數據放入隊列 { msg[queuetail] = m; if(++queuetail >= QUEUELEN) queuetail = 0; } uint8_t getMsg(void) //從隊列中取出數據,這個數據是最先放入隊列的那個數據 { uint8_t m = msg[queuehead]; if(++queuehead >= QUEUELEN) queuehead = 0; return m; } uint8_t testQueue(void)//檢查數據中是否有數據 { return (queuetail == queuehead) ? 0:1; }
在r_cg_serial_user.c里,這里改寫了__interrupt static void r_uart0_interrupt_receive(void)這個中斷函數。從串口接收到的數據直接放入環形隊列中。
/*********************************************************************************************************************** * Function Name: r_uart0_interrupt_receive * Description : This function is INTSR0 interrupt service routine. * Arguments : None * Return Value : None ***********************************************************************************************************************/ __interrupt static void r_uart0_interrupt_receive(void) { uint8_t rx_data; rx_data = RXD0; putMsg(rx_data);//將從串口中接收的數據直接放入環形隊列中 }
實現一個函數,向串口中打印字符串。
void printStr(char const * ch) { R_UART0_Send(ch, strlen(ch));//發送字符串 while(g_uart0_tx_count);//等待數據發送完成 }
測試主程序:作用每隔500ms向串口打印“500hello world”,并把從串口中接收到的數據發回串口。
#include "r_cg_macrodriver.h" #include "r_cg_cgc.h" #include "r_cg_port.h" #include "r_cg_serial.h" #include "r_cg_timer.h" /* Start user code for include. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */ #include "r_cg_userdefine.h" /*********************************************************************************************************************** Global variables and functions ***********************************************************************************************************************/ /* Start user code for global. Do not edit comment generated here */ extern uint32_t GlobalTime; // 全局時鐘變量在定時器中斷函數中每ms加1 extern volatile uint16_t g_uart0_tx_count;//串口發送數據計數,發完數據是為0 /* End user code. Do not edit comment generated here */ void R_MAIN_UserInit(void); /*********************************************************************************************************************** * Function Name: main * Description : This function implements main function. * Arguments : None * Return Value : None ***********************************************************************************************************************/ void main(void) { /* Start user code. Do not edit comment generated here */ uint32_t nowTime=0, lastTime=0;//時間寄存 char chBuf[32]={0}, ch=0;//數據buff R_MAIN_UserInit(); R_TAU0_Channel0_Start();//定時器通道一 R_UART0_Start(); //開啟串口 while (1U) { nowTime=GlobalTime;//更新當前時間 if((nowTime-lastTime)>500)//每隔500ms { lastTime = GlobalTime; P13.0 = ~P13.0;//測試小燈 sprintf(chBuf, "%ld", 500);//將數字轉換為字符串 strcat(chBuf, "hello world");//字符串拼接 //R_UART2_Send(chBuf, strlen(chBuf)); printStr(chBuf);//從串口發出字符串 } if(testQueue())//如果隊列中有數據 { ch = getMsg();//取出一個數據 R_UART0_Send(&ch, 1);//發回串口 while(g_uart0_tx_count);//等待發送完畢 } } /* End user code. Do not edit comment generated here */ } /*********************************************************************************************************************** * Function Name: R_MAIN_UserInit * Description : This function adds user code before implementing main function. * Arguments : None * Return Value : None ***********************************************************************************************************************/ void R_MAIN_UserInit(void) { /* Start user code. Do not edit comment generated here */ EI(); /* End user code. Do not edit comment generated here */ } /* Start user code for adding. Do not edit comment generated here */ /* End user code. Do not edit comment generated here */
如果你想從串口接收一長串數據,你最好在檢測到,串口有數據之后延時一小段時間,以保證數據全部被放入隊列。
接收數據之后你要做的就是解析這些數據了。接收幾個有用的函數。
函數名:char *strtok(char s[], const char *delim);
功能介紹:分解字符串為一組字符串。s為要分解的字符串,delim為分隔符字符串。首次調用時,s指向要分解的字符串,之后再次調用要把s設成NULL。
測試代碼:
#include<string.h> #include<stdio.h> int main(void) { char input[16]="123,23,12"; char*p; p=strtok(input,","); if(p) printf("%s\n",p); p=strtok(NULL,","); if(p) printf("%s\n",p); p=strtok(NULL,","); if(p) printf("%s\n",p); return 0; }
運行結果
假如你輸入的是PID的,KP,KI, KD的話,可以直接用atof, atoi函數將對應的數字字符串變為數字。可以在線改參數。
還有sprintf,atof,atoi這幾個函數都很好用。
看完上述內容,你們對R5F100LE串口隊列的實現和UART使用心得是怎樣的有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。