串行通信和从属RAM C上变量的变化值

serial communication and change value of Variable on Slave RAM C

本文关键字:变量 变化 RAM 通信      更新时间:2023-10-16

我想通过串行通信更改从属RAM上变量的值

例如

snedtoslave(byte address, data)

但是在这里我不知道如何在从属站的RAM上使用固定地址使变量

我想要这个

//in slave
char x=0; // address in ram  example 0b
serialreceiver(); 
if(x==1) {do();}
//in master
snedtoslave(0b, 1);

如何使变量具有固定地址?

最简单的解决方案是使用包含所有信息的表,而不涉及链接器:

  • 变量的逻辑地址
  • 变量的实际地址
  • 变量的类型

喜欢:

#include <stdio.h>
#include <stdint.h>
typedef enum
{
    INT8, UINT8, INT16, UINT16, INT32, UINT32
}my_TYPES;
struct table
{
    uint32_t address;
    my_TYPES type;
    void     *variable;
};
uint32_t Var_1 = 10;
uint8_t  Var_2 = 20;
struct table variables[] = {
//    address |  type  | variable
    {   0     , UINT32 , (void *)&Var_1 },
    {   1     , UINT8  , (void *)&Var_2 }
};
int main(void)
{
    for (size_t i = 0; i < sizeof(variables) / sizeof(variables[0]); i++)
    {
        switch (variables[i].type)
        {
            case UINT8:
                printf("Old value of variable at address %d: %dn", variables[i].address, *((uint8_t *) (variables[i].variable)));
                *((uint8_t *) (variables[i].variable)) += 1;
                printf("New value of variable at address %d: %dn", variables[i].address, *((uint8_t *) (variables[i].variable)));
                break;
            case UINT32:
                printf("Old value of variable at address %d: %dn", variables[i].address, *((uint32_t *) (variables[i].variable)));
                *((uint32_t *) (variables[i].variable)) += 1;
                printf("New value of variable at address %d: %dn", variables[i].address, *((uint32_t *) (variables[i].variable)));
                break;
            default:
                fprintf(stderr, "Type not managedn");
                break;
        }
    }
    return 0;
}