头文件
#ifndef RS485_BUFFER_H
#define RS485_BUFFER_H
#include "stdint.h"
#define BUFFER_NUM 40
#define PACKAGE_LENTH 40
#define PACKAGE_TIMEOUT 5
#define PACKAGE_MIN_LENTH 3
typedef struct
{
volatile uint16_t timeOut;
volatile uint16_t recLenth;
uint8_t data[256+10];
}rs485Package;
typedef struct
{
volatile uint16_t writeLenth;
volatile uint16_t readLenth;
volatile uint16_t dataLenth[BUFFER_NUM];
uint8_t serialBuff[BUFFER_NUM][PACKAGE_LENTH];
}rs485Buff;
rs485Buff *rs485SendAddr(void);
rs485Buff *rs485RecAddr(void);
rs485Package *rs485PackageAddr(void);
void serialRecData(rs485Package *rs485Buffer,uint8_t data);
void subpackageTick(rs485Package *rs485Buffer);
void serialPushBuffer(rs485Buff *rs485Buff,uint8_t *data,uint16_t lenth);
uint8_t serialPopBuffer(rs485Buff *rs485Buff,uint8_t *data,uint16_t *lenth);
#endif
c源码
#include "rs485_buffer.h"
rs485Buff *rs485SendAddr(void)
{
static rs485Buff rs485Send;
return &rs485Send;
}
rs485Buff *rs485RecAddr(void)
{
static rs485Buff rs485Rec;
return &rs485Rec;
}
rs485Package *rs485PackageAddr(void)
{
static rs485Package rs485PackageTable;
return &rs485PackageTable;
}
void serialRecData(rs485Package *rs485Package,uint8_t data)
{
rs485Package->timeOut = PACKAGE_TIMEOUT;
if(rs485Package->recLenth >= sizeof(rs485Package->data))
{
return;
}
rs485Package->data[rs485Package->recLenth] = data;
rs485Package->recLenth++;
}
void subpackageTick(rs485Package *rs485Package)
{
if(rs485Package->recLenth >= sizeof(rs485Package->data))
{
rs485Package->recLenth = 0;
}
if(rs485Package->timeOut > 0)
{
rs485Package->timeOut--;
if(rs485Package->timeOut == 0 && (rs485Package->recLenth >= PACKAGE_MIN_LENTH && rs485Package->recLenth < sizeof(rs485RecAddr()->serialBuff)))
{
serialPushBuffer(rs485RecAddr(),rs485Package->data,rs485Package->recLenth);
rs485Package->recLenth = 0;
}
else if(rs485Package->timeOut == 0)
{
rs485Package->recLenth = 0;
}
}
}
void serialPushBuffer(rs485Buff *rs485Buff,uint8_t *data,uint16_t lenth)
{
uint16_t i = 0;
uint16_t dataLenth = 0;
dataLenth = sizeof(rs485Buff->serialBuff) / BUFFER_NUM;
if(lenth >= dataLenth)
{
return;
}
if(rs485Buff->writeLenth >= BUFFER_NUM)
{
rs485Buff->writeLenth = 0;
}
rs485Buff->dataLenth[rs485Buff->writeLenth] = lenth;
for(i = 0;i < lenth;i++)
{
rs485Buff->serialBuff[rs485Buff->writeLenth][i] = data[i];
}
rs485Buff->writeLenth++;
}
uint8_t serialPopBuffer(rs485Buff *rs485Buff,uint8_t *data,uint16_t *lenth)
{
uint16_t i = 0;
if(rs485Buff->readLenth >= BUFFER_NUM)
{
rs485Buff->readLenth = 0;
}
if(rs485Buff->writeLenth == rs485Buff->readLenth)
{
rs485Buff->writeLenth = 0;
rs485Buff->readLenth = 0;
return 0;
}
*lenth = rs485Buff->dataLenth[rs485Buff->readLenth];
for(i = 0;i < rs485Buff->dataLenth[rs485Buff->readLenth];i++)
{
data[i] = rs485Buff->serialBuff[rs485Buff->readLenth][i];
}
rs485Buff->readLenth++;
return 1;
}