Я пытаюсь отправить 10-битные данные из MCU Renesas в другой MCU. Я использую 10-битный АЦП, поэтому данные датчика представлены в 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]
, поэтому восемь бит хранятся в data[1]
, а два бита хранятся в data[0]
. data[0]
может быть 0
, 1
, 2
или 3
. На data[0]
существует условие, что, если оно равно 01
, MCU будет передавать только один байт (т. Е. 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
или data[0] = 165
, иличто-то еще, но не 0
, 1
, 2
или 3
. Можете ли вы помочь мне, что я делаю неправильно в этом. Возможно я не увеличиваю адрес или что-то еще.