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