肺炎疫情 在家写代码 问题:我已经有了比较先进的技术手段 比如我的这个双节棍类似的串口模块
直接写在代码里面不行 他上面的业务还是走的老模块
我也暂时退回去吧 新的应该在银城的那个项目测试过!日后在看看
#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