91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

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

洞口县| 开江县| 诸城市| 瑞昌市| 麻城市| 宜昌市| 昔阳县| 无极县| 桂林市| 通河县| 通渭县| 章丘市| 格尔木市| 万年县| 香格里拉县| 马关县| 含山县| 嘉峪关市| 赣州市| 连平县| 曲麻莱县| 肇州县| 武宁县| 云霄县| 邹平县| 新干县| 井冈山市| 蓬溪县| 达州市| 湘潭县| 潜山县| 阿荣旗| 格尔木市| 平塘县| 响水县| 行唐县| 中方县| 漳浦县| 基隆市| 商南县| 阿拉善左旗|