我正在尝试将 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 将只发送一个字节(即),而不是一直发送整个两个字节。这一直持续到获得任何其他数字(即、或)。我在下面的代码中这样做。2
3
data[0]
01
data[1]
data[0]
0
2
3
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
,,,,,,,等等。225
254
65
69
67
现在如果它得到一些data[0] = 2
,它应该发送2,data[1]
,但那时它开始发送data[0] = 65
or data[0] = 165
,或其他东西,但不是0
, 1
, 2
, or 3
。你能帮我看看我在这方面做错了什么吗?也许我没有增加地址或其他东西。