最强串口-双节棍

肺炎疫情 在家写代码 问题:我已经有了比较先进的技术手段 比如我的这个双节棍类似的串口模块

直接写在代码里面不行 他上面的业务还是走的老模块

我也暂时退回去吧 新的应该在银城的那个项目测试过!日后在看看

#include "gkbaseusart.h"
#include "string.h"
#include "stdio.h"
#include "gunit.h"
GK_USARTBASE_TYPE GKU1;
GK_USARTBASE_TYPE GKU2;
GK_USARTBASE_TYPE GKU3;
GK_USARTBASEFUNCTION_TYPE GKUF,*puf;



uint8_t GK_usart_init(GK_USARTBASE_TYPE *myuart,uint8_t usartid,uint8_t * buf,rxIsrCb rxf)
{
	switch(usartid)//绑定关系
	{
		case 1:myuart->huart=&huart1;break;
		case 2:myuart->huart=&huart2;break;
		case 3:myuart->huart=&huart3;break;
		default :return 0;	
	}
	myuart->rxBuf=buf;
	myuart->rxf=rxf;
	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;
}


void GK_usart_clear(GK_USARTBASE_TYPE *myuart)
{
	memset(&myuart->rx_len,0,sizeof(GK_USARTBASE_TYPE)-offsetof(GK_USARTBASE_TYPE,rx_len));
}


//需要自己放在IT
void GK_UART_RxIdleCallback(GK_USARTBASE_TYPE *myuart)
{
	if(__HAL_UART_GET_FLAG(myuart->huart,UART_FLAG_IDLE))
	{
		__HAL_UART_CLEAR_IDLEFLAG(myuart->huart);

		myuart->received2idle=1;

//     printf("#######received2idle####\r\n");

	}
}

//不需要管理 它会自动调用 本来有WEAK
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) //这里扩展一下!!!!
{ 
	if(huart->Instance == USART3) 
	{ 
		GKU3.rxBuf[GKU3.rx_len++]=GKU3.one;   //类似标准外设库函数// 对应 上文
		HAL_UART_Receive_IT(huart, &GKU3.one, 1) ; 
	} 
	else if(huart->Instance == USART2) 
	{ 
		if(GKU2.rxBuf) GKU2.rxBuf[GKU2.rx_len++%200]=GKU2.one;//V1.0处理 可以 不要 
		if(GKU2.rxf)   GKU2.rxf(GKU2.one); ;//V2.0处理
		HAL_UART_Receive_IT(huart, &GKU2.one, 1) ; 
	}
	else if(huart->Instance == USART1) 
	{ 
		if(GKU1.rxBuf) GKU1.rxBuf[GKU1.rx_len++%100]=GKU1.one;
		if(GKU1.rxf)   GKU1.rxf(GKU1.one); 
		HAL_UART_Receive_IT(huart, &GKU1.one, 1) ; 
	}

}


uint8_t GK_usart_TXRX(GK_USARTBASE_TYPE  *myuart, void *Tx ,uint16_t TXlen ,uint8_t *RX,uint16_t *RXlen)
{
	uint8_t Cnt = 10,ack=0;
	uint8_t *TX =(uint8_t*)Tx;
//准备工作:
	GK_usart_clear(myuart);

//发送:
	HAL_UART_Transmit(myuart->huart, TX, TXlen, 0xFFFF);
//等待返回:
	while(Cnt--)
	{	
		if(myuart->received2idle)
		{
			ack=1;
			break;
		}
		HAL_Delay(10);//尝试次数 10次   这里面其实需要喂狗 每次这样的情形都有喂狗		
	}
//处理返回:
    if(ack==0)
	return 0; 
   		
	*RXlen=myuart->rx_len;
	memcpy(RX,myuart->rxBuf,myuart->rx_len);
	
//收尾工作:有必要的 比如以后不再TXRX了 只是单纯的RX
	GK_usart_clear(myuart);
	return 1;    
}



//通过ID获得全部结构体 以小博大
GK_USARTBASE_TYPE * GK_usart_read_obj( uint8_t usartid)
{
	switch(usartid)
	{
		case 2:return &GKU2;//WIFI SIM
		case 3:return &GKU3;//BLE
		case 1:return &GKU1;//智慧串口
		default :return NULL;	
	}
}


void TX(GK_USARTBASE_TYPE *myuart,uint8_t *TX , uint16_t TXlen)
{
    HAL_UART_Transmit(myuart->huart, TX, TXlen, 0xFFFF);
}

uint16_t RX(GK_USARTBASE_TYPE *myuart,uint8_t *RX , uint16_t *RXlen,uint16_t timeout)
{
    while(1)
    {
        if(myuart->received2idle)
        {
            *RXlen = myuart->rx_len;
            memcpy(RX,myuart->rxBuf,*RXlen);
            printf("--*RXlen %d--\r\n",*RXlen );
            break;
        }
        timeout--;
        if(timeout == 0||timeout == 0XFF)break;
        HAL_Delay(10);
    }
    
    if(timeout == 0)
        return 0;
    else
    {
        GK_usart_clear(myuart);
        return *RXlen;
    }
}
void GKF_PUSART_INIT(void)
{
    puf = &GKUF;

    puf->clear = GK_usart_clear;
    puf->read = GK_usart_read_obj;
    puf->tx   = TX;
    puf->txrx = GK_usart_TXRX;
    puf->rx =   RX;
    puf->init=  GK_usart_init;
}
#ifndef __GKBASEUSART_H_
#define __GKBASEUSART_H_

#include "usart.h" 

typedef void (*rxIsrCb)	(uint8_t);

typedef struct
{
	UART_HandleTypeDef *huart; //来自HAL的模块
	rxIsrCb  rxf;

	uint8_t  *rxBuf;//放置数据的-不是数组了这样灵活点儿
	uint16_t rx_len;

	uint8_t  one;//当前过来的HEX
	uint8_t  received2idle;//1空闲中断到了
}GK_USARTBASE_TYPE ;	 

typedef struct
{
   void                  (*clear)(GK_USARTBASE_TYPE *myuart);
   GK_USARTBASE_TYPE*    (*read) (uint8_t id);
   void                  (*tx)   (GK_USARTBASE_TYPE *myuart,uint8_t *TX , uint16_t TXlen);
   uint8_t               (*txrx) (GK_USARTBASE_TYPE *myuart, void *Tx ,uint16_t TXlen ,uint8_t *RX,uint16_t *RXlen);
   uint16_t              (*rx)   (GK_USARTBASE_TYPE *myuart,uint8_t *RX , uint16_t *RXlen,uint16_t timeout);
   uint8_t               (*init) (GK_USARTBASE_TYPE *myuart,uint8_t usartid,uint8_t * buf,rxIsrCb rxf);
}GK_USARTBASEFUNCTION_TYPE ;	 


extern GK_USARTBASE_TYPE GKU3;
extern GK_USARTBASE_TYPE GKU2;
extern GK_USARTBASE_TYPE GKU1;
extern GK_USARTBASEFUNCTION_TYPE *puf;

extern uint8_t GK_usart_init(GK_USARTBASE_TYPE *myuart,uint8_t usartid,uint8_t* buf,rxIsrCb rxf);
extern uint8_t GK_usart_TXRX(GK_USARTBASE_TYPE  *myuart, void *Tx ,uint16_t TXlen ,uint8_t *RX,uint16_t *RXlen);
extern void GK_usart_clear(GK_USARTBASE_TYPE *myuart);//收发前后
extern void GK_UART_RxIdleCallback(GK_USARTBASE_TYPE *huart);//IT中!
extern GK_USARTBASE_TYPE * GK_usart_read_obj( uint8_t usartid);
extern void GKF_PUSART_INIT(void);
#endif

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值