这是第二次遇到这种尴尬情况 记录一下
CASE:我做了一个结构体:
typedef struct
{
UART_HandleTypeDef *huart; //来自HAL的模块
uint8_t *rxBuf;//放置数据的-不是数组了这样灵活点儿
uint16_t rx_len;
uint8_t one;//当前过来的HEX
uint8_t received2idle;//1空闲中断到了
}GK_USARTBASE_TYPE ;
在自己的模块里面是很好的
还有一个思考过的函数:
void GK_usart_clear(GK_USARTBASE_TYPE *myuart)
{
memset(&myuart->rx_len,0,sizeof(GK_USARTBASE_TYPE)-offsetof(GK_USARTBASE_TYPE,rx_len));
}
现在我遇到一个事情:我希望外面的模块也可以调用这个函数 怎么办?
第一种 直接给出去
第二种 就是自己调用自己 如下:
typedef struct
{
UART_HandleTypeDef *huart; //来自HAL的模块
uint8_t *rxBuf;//放置数据的-不是数组了这样灵活点儿
void (*clear)(void *myuart);//-------------
uint16_t rx_len;
uint8_t one;//当前过来的HEX
uint8_t received2idle;//1空闲中断到了
}GK_USARTBASE_TYPE ;
void GK_usart_clear(void *uart)
{
GK_USARTBASE_TYPE *myuart = (GK_USARTBASE_TYPE *)uart;
memset(&myuart->rx_len,0,sizeof(GK_USARTBASE_TYPE)-offsetof(GK_USARTBASE_TYPE,rx_len));
}
初始化的时候给他
uint8_t GK_usart_init(GK_USARTBASE_TYPE *myuart,uint8_t usartid,uint8_t * buf)
{
switch(usartid)//绑定关系
{
case 2:myuart->huart=&huart2;break;
case 3:myuart->huart=&huart3;break;
default :return 0;
}
myuart->clear = GK_usart_clear;
myuart->rxBuf=buf;
HAL_UART_Receive_IT(myuart->huart, &myuart->one, 1);//开启中断接收 1个1个的接收// 对应 下文
__HAL_UART_ENABLE_IT(myuart->huart,UART_IT_IDLE);//开启空闲中断
__HAL_UART_CLEAR_IDLEFLAG(myuart->huart);
return 1;
}
这样饶了一圈 最后调用是:
GK_USARTBASE_TYPE *puart= GK_usart_read_obj(2);
puart->clear(puart);
现在我觉得我的思想需要升级:
凡是结构体需要自己调自己的时候 可以新开一个结构体!
开始吧!操作一下 丝般顺滑
typedef struct
{
void (*clear)(GK_USARTBASE_TYPE *myuart);
GK_USARTBASE_TYPE* (*read) (uint8_t id);
}GK_USARTBASEFUNCTION_TYPE ;
GK_USARTBASEFUNCTION_TYPE GKUF,*puf;
void GK_USART_INIT(void)
{
puf = &GKUF;
puf->clear = GK_usart_clear;
puf->read = GK_usart_read_obj;
}
现在调用:
GK_USARTBASE_TYPE *puart= puf->read(2);
puf->clear(puart);
++++++++++++上次
https://blog.csdn.net/weixin_42381351/article/details/86574210
这个也是分不清 你可以做2个结构体!!!一个节点 + 一个函数结构体