lvgl-v7/Origin__V0.3_LVGL7/UART/SimplUART/APP/UART_Net.c

360 lines
8.7 KiB
C
Raw Permalink Normal View History

2022-11-19 17:03:00 +00:00
// #include "stdio.h"
// #include "stdlib.h"
#include "SWM320.h"
#include "debug.h"
#include "uart_Net.h"
/**********************************************************
**********************************************************/
//传送物理参数
static NET_PHY_PROP uartPhy = {
.BandRate = 115200,
.TransportDistance = 2000000,
.CalMessageLen = UartBusMessageLenCal,
};
//报文定义
//定义报文长度使用const因为驱动需要知道到底长度是多少
#define SOURCE_ADDR_LEN 2
#define DEST_ADDR_LEN 2
#define DATE_LEN 18
#define CRC_LEN 1
typedef struct
{
u8 sourceAddress[SOURCE_ADDR_LEN]; //源地址
u8 destinationAddress[DEST_ADDR_LEN]; //目标地址
u8 date[DATE_LEN]; //数据
u8 crc[CRC_LEN]; // CRC校验
} NET_MSG;
//设置地址
static NET_MSG msg = {
.sourceAddress[0] = 0x00,
.sourceAddress[1] = 0x01,
};
// CRC设置
#define USE_CRC_8 1
/**********************************************************
HAL层
**********************************************************/
/**
* @brief
*
*/
static void SerialInit(void)
{
UART_InitStructure UART_initStruct;
PORT_Init(PORTC, PIN4, FUNMUX0_UART1_RXD, 1); // GPIOA.2配置为UART0输入引脚
PORT_Init(PORTC, PIN5, FUNMUX1_UART1_TXD, 0); // GPIOA.3配置为UART0输出引脚
UART_initStruct.Baudrate = 115200;
UART_initStruct.DataBits = UART_DATA_8BIT;
UART_initStruct.Parity = UART_PARITY_NONE;
UART_initStruct.StopBits = UART_STOP_1BIT;
UART_initStruct.RXThreshold = 0;
UART_initStruct.RXThresholdIEn = 1;
UART_initStruct.TXThreshold = 3;
UART_initStruct.TXThresholdIEn = 0;
UART_initStruct.TimeoutTime = 1; // 10个字符时间内未接收到新的数据则触发超时中断
UART_initStruct.TimeoutIEn = 0;
UART_Init(UART1, &UART_initStruct);
UART_Open(UART1);
}
// uart发送的数据缓存
static u8 uartDate = 0;
// uart接收的数据和发送的数据是否相同1相同0不同
static volatile u8 uartRight = 0;
// uart是出于发送还是接收状态1发送0接收
static volatile u8 uartSend = 0;
void UART1_Handler(void)
{
if (UART_INTRXThresholdStat(UART1) || UART_INTTimeoutStat(UART1))
{
u32 chr;
// Printf("x");
while (UART_IsRXFIFOEmpty(UART1) == 0)
{
if (UART_ReadByte(UART1, &chr) == 0)
{
if (uartSend == 1)
{
if ((u8)chr == uartDate)
{
uartRight = 1;
Printf("%c", (u8)chr);
}
}
else
{
}
}
}
}
}
/**
* @description: UART数据 interface
* @return {*} uart数据
*/
static u8 NetRead()
{
}
/**
* @description: UART数据 interface
* @return {*}
*/
static void NetWrite(u8 data)
{
uartDate = data;
uartRight = 0;
UART_WriteByte(UART1, (u32)data);
while (UART_IsTXBusy(UART1))
;
}
/**
* @description: NET实现软件定时器
* @param {void} *hdl
* @param {void} *priv
* @param {u8} time ms)
* @return {*}
*/
static void NetSorftTimer(void *hdl, void *priv, u8 time)
{
}
//
#define NetPrint(format, ...) Printf(format, ##__VA_ARGS__)
/*-----------------------------------------------------------分割线---------------------------------------------*/
/**********************************************************
**********************************************************/
/**
* @brief uart报文段长度
*
* @return u32 bit
*/
u32 UartBusMessageLenCal(void *priv)
{
NET_PHY_PROP *tis = (NET_PHY_PROP *)priv;
float distance = (float)tis->TransportDistance;
float deltaTime = distance / (200000000) * 2;
tis->MessageLenMin = (distance / (tis->BandRate) + 1);
}
#if (USE_CRC_8)
// CRC 8 的除数是9位,但是最高位为1不需要计算
const u8 CRC8 = 0x31;
/**********************************************************
1.
CRC方法
crc 8
16
1011001100111010 00110001
11010110
u8数0
2 1011001100000000
00110001
11010111
11101100
3.u8与计算结果亦或
11101100
00111010
11010110
2. CRC加密还原方法
CRC值CRC结果=0CRC校验通过
**********************************************************/
// void ptb(u8 data)
// {
// u8 str[10];
// itoa(data, str, 2);
// printf("%s\n", str);
// }
/**
* @brief
*
* @param data
* @param len
* @return u8
*/
u8 CRC_8_ENC(u8 *data, u32 len)
{
u8 crc = 0;
for (u32 i = 0; i < len; i++)
{
crc ^= *(data++);
for (u32 j = 0; j < 8; j++)
{
if (crc & 0x80)
{
crc = crc << 1;
crc ^= CRC8;
}
else
{
crc = crc << 1;
}
}
}
return crc;
}
#endif
/**
* @brief
*
* @param data
* @param len
* @param destAddr
* @return u32
*/
u32 NetSendBase(u8 *data, u32 len, u8 *destAddr)
{
/**********************************************************
**********************************************************/
for (u32 i = 0; i < DEST_ADDR_LEN; i++)
{
msg.destinationAddress[i] = destAddr[i];
}
// NetPrint("dest addr write\n");
/**********************************************************
0x00
**********************************************************/
for (u32 i = 0; i < DATE_LEN; i++)
{
if (i <= DATE_LEN)
{
msg.date[i] = data[i];
}
else
{
msg.date[i] = 0;
}
}
// NetPrint("data write\n");
/**********************************************************
CRC计算结果
**********************************************************/
#if (USE_CRC_8)
msg.crc[0] = CRC_8_ENC(msg.date, sizeof(msg.date));
#endif
// NetPrint("crc cal\n");
/**********************************************************
**********************************************************/
u8 *dataTram = (u8 *)&msg;
// NetPrint("start send\n");
uartSend = 1;
for (u32 i = 0; i < sizeof(msg); i++)
{
NetWrite(dataTram[i]);
u32 time = 1000;
while (time--)
{
if (uartRight == 1)
{
break;
}
}
if (uartRight == 0)
{
return MSG_SEND_MAY_ERR;
}
}
uartSend = 0;
return 0;
}
/**
* @brief 线,
*
*/
void NetSendErrPage(){
for (u32 i = 0; i < DATE_LEN/2; i++){
}
}
/**
* @brief Net发送函数
*
* @param data
* @param len
* @param destAddr
* @return u32
*/
u32 NetSend(u8 *data, u32 len, u8 *destAddr)
{
while (len)
{
if (len > DATE_LEN)
{
NetSendBase(data, DATE_LEN, destAddr);
len -= DATE_LEN;
data += DATE_LEN;
}
else
{
NetSendBase(data, len, destAddr);
len = 0;
}
}
}
/**
* @brief
*
* @param data
* @param len
*/
void NetReceive(u8 *data, u32 len)
{
}
/**
* @brief
*
*/
u32 NetInit()
{
/**********************************************************
**********************************************************/
uartPhy.CalMessageLen(&uartPhy);
NetPrint("MessageLenMin= %d\n", uartPhy.MessageLenMin);
if ((sizeof(NET_MSG) < uartPhy.MessageLenMin))
{
NetPrint("ERROR:MSG_LEN_TOO_SHORT");
return MSG_LEN_TOO_SHORT;
}
/**********************************************************
**********************************************************/
#if (USE_CRC_8)
if (sizeof(NET_MSG) > 64)
{
NetPrint("ERROR:MSG_LEN_TOO_LONG");
return MSG_LEN_TOO_LONG;
}
#endif
/**********************************************************
**********************************************************/
SerialInit();
return 0;
}