首页 > 解决方案 > 嵌入式 C,瑞萨电子 RL78,数据传输

问题描述

我正在尝试将 10 位数据从 Renesas MCU 发送到另一个 MCU。我使用的是 10 位 ADC,因此传感器数据采用 10 位格式,然后存储在 2 字节变量中。例如:

变量类型:-

uint8_t data[2] = { 97, 65 }; 
uint8_t g_uart0_rx_buffer = 0U; 
uint8_t g_uart0_rx_error = 0U; 
volatile uint8_t * gp_uart0_tx_address; 
volatile uint16_t g_uart0_tx_count; 
uint16_t g_result_buffer = 0U; 
uint8_t check; 
uint8_t check_new = 8; 
int old_var = 0
uint8_t data[2] = {97 , 65}

当我尝试发送整个两个字节时它工作正常;代码如下:

R_ADC_Get_Result(&g_result_buffer);
old_var=g_result_buffer;
data[1] = old_var;
data[0] = (old_var >> 8);
g_uart0_tx_end = R_UART0_Send((uint8_t *) data, 2u);

并且R_UART0_Send()定义为:

MD_STATUS R_UART0_Send(uint8_t * const tx_buf, uint16_t tx_num)
{
    MD_STATUS status = MD_OK;

    if (tx_num < 1U)
    {
        status = MD_ARGERROR;
    }
    else
    {
        gp_uart0_tx_address = tx_buf;     //i.e volatile uint8_t * gp_uart0_tx_address;
        g_uart0_tx_count = tx_num;        //i.e volatile uint16_t  g_uart0_tx_count; 
        STMK0 = 1U;    /* disable INTST0 interrupt */
        TXD0 = *gp_uart0_tx_address;
        gp_uart0_tx_address++;
        g_uart0_tx_count--;
        STMK0 = 0U;    /* enable INTST0 interrupt */
    }

    return (status);
}

这部分工作正常,我正在从 UART 获取数据并进行进一步的操作。

现在,我想从这个 MCU 发送最少的数据,所以我实施了一些加密,并尝试按照我的加密只发送一个字节。加密背后的想法是:

我将 10 位数据存储在 中data[2],因此存储了 8 位,存储了data[1]2 位data[0]data[0]可能是0,1或. 有一个条件,一旦是MCU 将只发送一个字节(即),而不是一直发送整个两个字节。这一直持续到获得任何其他数字(即、或)。我在下面的代码中这样做。23data[0]01data[1]data[0]023

R_ADC_Get_Result(&g_result_buffer);
old_var=g_result_buffer;
data[1] = old_var;
data[0] = (old_var >> 8);
check = data[0];

if (check!=check_new) // check_new is declared globally with random variable
{
    if (check == 01)
    {
        //check_val = 'i';
        //g_uart0_tx_end = R_UART0_Send1((char) check_val, 1u);
        g_uart0_tx_end = R_UART0_Send((uint8_t *) data, 2u);
        check_new = check;
        //memset(data, 0, 2);
    }

    if (check == 02)
    {
        //check_val = 'j';
        //g_uart0_tx_end = R_UART0_Send1((char) check_val, 1u);
        g_uart0_tx_end = R_UART0_Send((uint8_t *) data, 2u);
        check_new = check;
        //memset(data, 0, 2);
    }

    if (check == 03)
    {
        //check_val = 'k';
        //g_uart0_tx_end = R_UART0_Send1((char) check_val, 1u);
        g_uart0_tx_end = R_UART0_Send((uint8_t *) data, 2u);
        check_new = check;
        //memset(data, 0, 2);
    }

    if (check == 00)
    {
        //check_val = 'l';
        //g_uart0_tx_end = R_UART0_Send1((char) check_val, 1u);
        g_uart0_tx_end = R_UART0_Send((uint8_t *) data, 2u);
        check_new = check;
        //memset(data, 0, 2);
    }

    //g_uart0_tx_end = R_UART0_Send((uint8_t *) data, 2u);
}
else
{
    g_uart0_tx_end = R_UART0_Send((uint8_t *) data+1, 1u);
    //memset(data, 0, 2);
}

其中R_UART0_Send()定义为:

MD_STATUS R_UART0_Send(uint8_t * const tx_buf, uint16_t tx_num)
{
    MD_STATUS status = MD_OK;

    if (tx_num < 1U)
    {
        status = MD_ARGERROR;
    }
    else
    {
        if (tx_num == 1U){
        gp_uart0_tx_address = tx_buf;
        g_uart0_tx_count = tx_num;
        STMK0 = 1U;    /* disable INTST0 interrupt */
        TXD0 = *gp_uart0_tx_address;
        gp_uart0_tx_address++;
        g_uart0_tx_count--;
        STMK0 = 0U;    /* enable INTST0 interrupt */
        }
        else if (tx_num == 2U){
        gp_uart0_tx_address = tx_buf;
        g_uart0_tx_count = tx_num;
        STMK0 = 1U;    /* disable INTST0 interrupt */
        TXD0 = *gp_uart0_tx_address;
        gp_uart0_tx_address++;
        g_uart0_tx_count--;
        STMK0 = 0U;    /* enable INTST0 interrupt */
        }
    }

    return (status);
}

最初两字节数据是正确的,一旦在发送一字节数据的情况下它仍然是正确的。但是当条件改变并再次开始发送两字节数据时,它开始发送data[0]不正确。让我用一个例子来解释它:

data[0]应该是0, 1, 2, 或3.

所以前两个字节的数据是1,135,所以它将data[0](即1)存储在变量中check_new并检查data[0]更改。在那之前,它只会发送data[1].

现在最初它发送,1,135然后它只发送,data[1]例如145,,,,,,,等等。225254656967

现在如果它得到一些data[0] = 2,它应该发送2,data[1],但那时它开始发送data[0] = 65or data[0] = 165,或其他东西,但不是0, 1, 2, or 3。你能帮我看看我在这方面做错了什么吗?也许我没有增加地址或其他东西。

标签: cpointersembeddedrl78

解决方案


推荐阅读