指针可以当用数组来用。

编程入门 行业动态 更新时间:2024-10-25 09:35:06

指针可以当用<a href=https://www.elefans.com/category/jswz/34/1771288.html style=数组来用。"/>

指针可以当用数组来用。

 

 

 

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_HIGstatic 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);}
}

更多推荐

指针可以当用数组来用。

本文发布于:2024-02-11 18:03:55,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1682463.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数组   指针   来用

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!