中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

R5F100LE串口隊列的實現和UART使用心得是怎樣的

發布時間:2022-01-05 19:41:33 來源:億速云 閱讀:110 作者:柒染 欄目:互聯網科技

今天就跟大家聊聊有關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;
}

運行結果

R5F100LE串口隊列的實現和UART使用心得是怎樣的

假如你輸入的是PID的,KP,KI, KD的話,可以直接用atof, atoi函數將對應的數字字符串變為數字。可以在線改參數。

還有sprintf,atof,atoi這幾個函數都很好用。

看完上述內容,你們對R5F100LE串口隊列的實現和UART使用心得是怎樣的有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

石城县| 阿尔山市| 垫江县| 广南县| 抚远县| 准格尔旗| 沁源县| 大厂| 信阳市| 奉贤区| 轮台县| 郎溪县| 石屏县| 神木县| 通化县| 横峰县| 故城县| 福建省| 昆明市| 高雄市| 满城县| 五大连池市| 东平县| 英山县| 华蓥市| 重庆市| 商南县| 来宾市| 永泰县| 杭锦后旗| 武安市| 北京市| 丹东市| 尚义县| 怀安县| 雅安市| 伊金霍洛旗| 鸡西市| 仁怀市| 周口市| 丹巴县|