指针可以当用数组来用。

 

 

 

1.应用,可以在定义u8 **参数,然后 .C局部指针变量值传给要应用的变量。

void drv_uart1_get_buff(u32 baud, u8 **TxdBuf, u8 **RxdBuf, u16 **TxdLen, u16 **RxdLen);

  Drv_IoUartGetBuff(1, 9600, 2, &Lm.uart.TxdBuf, &Lm.uart.RxdBuf, &Lm.uart.TxdLen, &Lm.uart.RxdLen);   //

typedef struct
{
  u32 baud;
  u8 select;
  u8 Parity;
  u8 *TxdBuf;
  u8 *RxdBuf;
  u8 *TxdLen;
  u8 *RxdLen;
  u8 RxdLenCp;
  struct
  {
    s16 freq;
    u8  cnt1,cnt2;
    u16 shig, slow;
    TIMER_STRUCT Tm;
    u8 step, busy, cnt;
    u16 TxdSum, ErrSum;
    u16 *Rp, Raddr, Rlen;
    u16 *Wp, Waddr, Wlen;
  }modbus;
  TIMER_STRUCT TxdOverTime, RxdOverTime;
}M6020_UART_STRUCT;

void drv_uart1(void);
static u8 *RxdBuff, *TxdBuff;
static u16 *RxdLength, *TxdLength;
void drv_uart1_get_buff(u32 baud, u8 **TxdBuf, u8 **RxdBuf, u16 **TxdLen, u16 **RxdLen);


void Link_Linux(void)
{
  static u16 RxdLenCp;
  static u8 cnt = 0;
  static TIMER_STRUCT T1; TimeMs(&T1);
  u16 RxdLen = *RxdLength;
  if(cnt == 0)
  {
    cnt++;
    drv_uart1_get_buff(115200, &TxdBuff, &RxdBuff, &TxdLength, &RxdLength);
  }
  else if(RxdLenCp != RxdLen)
  {
    T1.Delay = 0;
    RxdLenCp = RxdLen;
  }
  else if(RxdLen > 0 && T1.Delay >= 10)
  {
    if(RxdLen >= 5 && RxdBuff[0] == 0x55 && RxdBuff[1] >= 5)
    {
      u16 crc1 = GetCRC16(RxdBuff, RxdBuff[1] - 2);
      u16 crc2 = ((u16)RxdBuff[RxdBuff[1] - 2]<<0) + ((u16)RxdBuff[RxdBuff[1] - 1]<<8);
      if(crc1 == crc2)
      {
        if(RxdBuff[2] == 0x01 || RxdBuff[2] == 0x02)
        {
          u8 *data = 0;
          u16 len = RxdBuff[5];
          if(RxdBuff[2] == 0x02){len = RxdBuff[1] - 7;}
          u16 addr = (((u16)RxdBuff[3]<<8) + ((u16)RxdBuff[4]<<0));
               if(addr < IAP_VER_ADDR  + IAP_VER_LEN)  {data = &gs.IapVer.data[addr - IAP_VER_ADDR];}
          else if(addr < APP_VER_ADDR  + APP_VER_LEN)  {data = &gs.AppVer.data[addr - APP_VER_ADDR];}
          else if(addr < IO_OUT_ADDR   + IO_OUT_LEN)   {data = &gs.io.out.data[addr - IO_OUT_ADDR];}
          else if(addr < IO_IN_ADDR    + IO_IN_LEN)    {data = &gs.io.in.data[addr - IO_IN_ADDR];}
          else if(addr < STATE_ADDR    + STATE_LEN)    {data = &gs.State.data[addr - STATE_ADDR];}
          else if(addr < MOTOR_ADDR    + MOTOR_LEN)    {data = &gs.motor.data[addr - MOTOR_ADDR];}
          else if(addr < DISTANCE_ADDR + DISTANCE_LEN) {data = &gs.Distance.data[addr - DISTANCE_ADDR];}
          else if(addr < BAT_ADDR + BAT_LEN)           {data = &gs.bat.data[addr - BAT_ADDR];}
          else if(addr < SHOW_ADDR + SHOW_LEN)         {data = &gs.show.data[addr - SHOW_ADDR];}

#include "Drv_io.h"
#include "hk32f0xx.h"
#include "Drv_TimeBase.h"


static u8 TxdFlag = 0;
#define RXD_BUFF_LEN_MAX   100
#define TXD_BUFF_LEN_MAX   300
static u16 Rxd1Length, Txd1Length;
static u8  Rxd1Buff[RXD_BUFF_LEN_MAX], Txd1Buff[TXD_BUFF_LEN_MAX];

#define   TXD_RCU       UART1_TXD_RCU
#define   TXD_PORT      UART1_TXD_PORT
#define   TXD_PIN       UART1_TXD_PIN
#define   TXD_READ      UART1_TXD_READ
#define   TXD_LOW       UART1_TXD_LOW
#define   TXD_HIG       UART1_TXD_HIG

#define   RXD_RCU       UART1_RXD_RCU
#define   RXD_PORT      UART1_RXD_PORT
#define   RXD_PIN       UART1_RXD_PIN
#define   RXD_READ      UART1_RXD_READ
#define   RXD_LOW       UART1_RXD_LOW
#define   RXD_HIG       UART1_RXD_HIG


static void drv_InitUart1(u32 baud)
{
  GPIO_InitTypeDef GpioInitStruct;
  USART_InitTypeDef USART_InitStructure;
  
  //RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
  
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource6, GPIO_AF_0);
  GPIO_PinAFConfig(GPIOB, GPIO_PinSource7, GPIO_AF_0);
  
  GpioInitStruct.GPIO_Pin = TXD_PIN | RXD_PIN;
  GpioInitStruct.GPIO_Speed = GPIO_Speed_10MHz;
  GpioInitStruct.GPIO_Mode = GPIO_Mode_AF;
  GpioInitStruct.GPIO_OType = GPIO_OType_PP;
  GpioInitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_Init(RXD_PORT, &GpioInitStruct);
  
  USART_DeInit(USART1);
  //USART_MSBFirstCmd(USART1, ENABLE);
  USART_InitStructure.USART_BaudRate = baud;
  USART_InitStructure.USART_Parity = USART_Parity_No;
  USART_InitStructure.USART_StopBits = USART_StopBits_1;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  USART_Init(USART1, &USART_InitStructure);
  
  USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);             //使能接收中断=
  USART_ITConfig(USART1,USART_IT_ORE,ENABLE);
  
  NVIC_InitTypeDef NVIC_InitStructure;
  /* USART1 IRQ Channel configuration */
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPriority = 0x00;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
  
  USART_Cmd(USART1, ENABLE);//使能串口 1
}

void Interrup_uart1_rxd(void)
{
  u8 Buff = USART1->RDR;
  if(Rxd1Length < RXD_BUFF_LEN_MAX)
  {
    Rxd1Buff[Rxd1Length++] = Buff;
  }
  else
  {
    Rxd1Length = 0;
  }
}
void Interrup_uart1_txd(void)
{
  static u16 i = 0;
  if(i < Txd1Length && Txd1Length < TXD_BUFF_LEN_MAX)
  {
    TxdFlag = 1;
    USART1->TDR = Txd1Buff[i++];
  }
  else
  {
    i = 0;
    TxdFlag = 0;
    Txd1Length = 0;
    USART_ITConfig(USART1,USART_IT_TXE ,DISABLE);
  }
}

void drv_uart1_get_buff(u32 baud, u8 **TxdBuf, u8 **RxdBuf, u16 **TxdLen, u16 **RxdLen)
{
  drv_InitUart1(baud);
  *RxdLen  = &Rxd1Length;
  *TxdLen  = &Txd1Length;
  *RxdBuf  = &Rxd1Buff[0];
  *TxdBuf  = &Txd1Buff[0];
}

void drv_uart1(void)
{
  static u8 cnt = 0;
  if(cnt == 0)
  {
    cnt++;
  }
  else if(TxdFlag == 0 && Txd1Length > 0)
  {
    USART_ITConfig(USART1, USART_IT_TXE ,ENABLE);
  }
}


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值