Download as pdf or txt
Download as pdf or txt
You are on page 1of 10

心电模块

串口解包函数范例
1. 解包函数
/** * Unpack a pack by restoring the bit7 of all data bytes fron the first
* byte, the first byte will be saved in the last position of the packet
* * @param pack the pack that will been unpacked
* @param len the length of given pack(include byte1)
* * @return unpacked data been stored in source pack. so be careful: you
* data will be changed */
BOOL Unpack(UCHAR* pack, INT len)
{
UCHAR byte1, byteSaved;
INT i;
byte1 = *pack;
byteSaved = byte1;
for (i = 0; i < len; i ++)
{ *( pack + i ) = ( *( pack + i + 1 ) & 0x7f ) | (( byte1 & 0x1 ) << 7 );
byte1 >>= 1;
}
*( pack + i ) = byteSaved;
return TRUE;
}
2. 打包函数
/**
* Pack some bytes by storing the bit7 of all data bytes to the first byte,
* make the bit7 of all bytes(include byte1) are 1 *
* @param pack pack that will been packed
* @param len number of bytes *
* @return packed data been stored in source pack. so be careful: you
* data will be changed */
void PackManPack(UCHAR* pack, INT len)
{
UCHAR byte1;
INT i;
// There is no need to pack a packet of length 0
if (0 >= len)
return;
byte1 = 0;
for (i = len; i > 0; i --)
{ // shift left by one bit
byte1 <<= 1;
// set bit7 to 1
*(pack+i) = *(pack+i-1) | 0x80;
// get bit7 in bit0 of byte1
byte1 |= (*(pack+i-1)&0x80) >> 7;
} // the byte1
*pack = byte1 | 0x80;
}
3. 波形数据解包(为了以前版本兼容,波形数据按照 12 位处理)

UCHAR gEcgWaveBuffer[12][ECG_BUF_LENGTH];
UCHAR* gEcgWaveBufWritePtr[12];
UCHAR* gEcgWaveBufReadPtr[12];
UCHAR* gEcgWaveBufHead[12] ;
UCHAR* gEcgWaveBufTail[12];

// RESP ²¨ÐÎ
UCHAR gRespWaveBuffer[RESP_BUF_LENGTH];
UCHAR* gRespWaveBufWritePtr;
UCHAR* gRespWaveBufReadPtr;
UCHAR* gRespWaveBufHead;
UCHAR* gRespWaveBufTail;
int gEcgWaveData[12];
int gEcgMaxValue[12] = {0,0,0,0,0,0,0,0,0,0,0,0};
int gEcgMinValue[12] = {0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,0xffff,
0xffff,0xffff,0xffff};
#define CHANNELNUM 8;

int gRespWaveData;
int gRespMaxValue =0,gRespMinValue =0xffff;

3.1. I,II,V1 和呼吸波形数据(0x01)


static VOID OnEcgWave1 ( UCHAR* msg )
{
INT data[12],tempdat[2],dat,dat1,dat2;
int i;

data[0] = (*msg) << 4;


gEcgWaveData[0] =data[0];
tempdat[0] = data[0] - 0x800;

data[1] = (*(msg+1)) << 4;


gEcgWaveData[1] =data[1];
tempdat[1] = data[1] - 0x800;

gEcgWaveData[2] = (tempdat[1] - tempdat[0]);


gEcgWaveData[2] +=0x800;
data[2] =gEcgWaveData[2];

gEcgWaveData[3] = -(tempdat[0] + tempdat[1])/2;


gEcgWaveData[3] +=0x800;
data[3] =gEcgWaveData[3];

dat1 = (tempdat[0]);
dat2 = (tempdat[1])/2;
gEcgWaveData[4] = ( dat1-dat2) ;
gEcgWaveData[4] +=0x800;
data[4] =gEcgWaveData[4];

dat1 = (tempdat[0])/2;
dat2 = (tempdat[1]);
gEcgWaveData[5] = ( dat2-dat1) ;
gEcgWaveData[5] +=0x800;
data[5] =gEcgWaveData[5];

data[6] = (*(msg+2)) << 4;


gEcgWaveData[6] =data[6] & 0x0fff;

for(i=0;i<7;i++)
{
if ( gEcgMaxValue[i] < gEcgWaveData[i] )
{
gEcgMaxValue[i] = gEcgWaveData[i];
}
if ( gEcgMinValue[i] > gEcgWaveData[i] )
{
gEcgMinValue[i] = gEcgWaveData[i];
}

data[i] >>= 4;
data[i] += 0x80;

if ( data[i] < 0 )
data[i] = 0;
if ( data[i] > 255 )
data[i] = 255;

// wave
*(gEcgWaveBufWritePtr[i]++) = data[i] & 0xff;
if ( gEcgWaveBufTail[i] < gEcgWaveBufWritePtr[i] )
gEcgWaveBufWritePtr[i] = gEcgWaveBufHead[i];
}
/************************'B' and 'P' flag *************/
gEcgStatus.beatHeart = (*(msg+3) & 0x01) ? 1 : 0 ;
if(gEcgStatus.beatHeart ==0x01)
gEcgStatus.beatHeart =gEcgStatus.beatHeart;
gEcgStatus.paceFlag = (*(msg+3) & 0x02) ? 1 : 0 ;

gEcgStatus.saturateFlag = (*(msg+3) & 0x04) ? 1 : 0 ;

/******Resp WAVE PROCESS *********/


dat = *(msg+4);
gRespWaveData =*(msg+4);

*(gRespWaveBufWritePtr++) = (*(msg+4) & 0xff);


if ( gRespWaveBufTail < gRespWaveBufWritePtr )
gRespWaveBufWritePtr = gRespWaveBufHead;
pView->m_DrawWave.ResumeResp();
}
3.2. I,II,V1 波形数据(0x02)
static VOID OnEcgWave2 ( UCHAR* msg )
{
INT data[12],tempdat[2],dat,dat1,dat2;
int i;

/******ECG1 WAVE PROCESS ***************/


data[0] = (*msg) << 4;
gEcgWaveData[0] =data[0];
tempdat[0] = data[0] - 0x800;

data[1] = (*(msg+1)) << 4;


gEcgWaveData[1] =data[1];
tempdat[1] = data[1] - 0x800;

gEcgWaveData[2] = (tempdat[1] - tempdat[0]);


gEcgWaveData[2] +=0x800;
data[2] =gEcgWaveData[2];

gEcgWaveData[3] = -(tempdat[0] + tempdat[1])/2;


gEcgWaveData[3] +=0x800;
data[3] =gEcgWaveData[3];

dat1 = (tempdat[0]);
dat2 = (tempdat[1])/2;
gEcgWaveData[4] = ( dat1-dat2) ;
gEcgWaveData[4] +=0x800;
data[4] =gEcgWaveData[4];

dat1 = (tempdat[0])/2;
dat2 = (tempdat[1]);
gEcgWaveData[5] = ( dat2-dat1) ;
gEcgWaveData[5] +=0x800;
data[5] =gEcgWaveData[5];

data[6] = (*(msg+2)) << 4;


gEcgWaveData[6] =data[6] & 0x0fff;

for(i=0;i<7;i++)
{
if ( gEcgMaxValue[i] < gEcgWaveData[i] )
{
gEcgMaxValue[i] = gEcgWaveData[i];
}
if ( gEcgMinValue[i] > gEcgWaveData[i] )
{
gEcgMinValue[i] = gEcgWaveData[i];
}

data[i] >>= 4;
data[i] += 0x80;

if ( data[i] < 0 )
data[i] = 0;
if ( data[i] > 255 )
data[i] = 255;
// wave
*(gEcgWaveBufWritePtr[i]++) = data[i] & 0xff;
if ( gEcgWaveBufTail[i] < gEcgWaveBufWritePtr[i] )
gEcgWaveBufWritePtr[i] = gEcgWaveBufHead[i];
}
/************************'B' and 'P' flag **********************************/
gEcgStatus.beatHeart = (*(msg+3) & 0x01) ? 1 : 0 ;
if(gEcgStatus.beatHeart ==0x01)
gEcgStatus.beatHeart =gEcgStatus.beatHeart;
gEcgStatus.paceFlag = (*(msg+3) & 0x02) ? 1 : 0 ;
}
3.3. V2~V6 心电波形数据(0x14)
static VOID OnEcgWave4 ( UCHAR* msg )
{
INT data[12],dat,dat1,dat2;
int i;

if ( NULL == pView )
return ;

if(gEcgConfig.LeadSystem >= LEAD_5_SYSTEM)


gEcgConfig.LeadSystem = LEAD_10_SYSTEM;

/************************ECG1 WAVE PROCESS


**********************************/
data[7] = (*msg) << 4;
gEcgWaveData[7] =data[7] & 0x0fff;

data[8] = (*(msg+1)) << 4;


gEcgWaveData[8] =data[8] & 0x0fff;

data[9] = (*(msg+2)) << 4;


gEcgWaveData[9] =data[9] & 0x0fff;

data[10] = (*(msg+3)) << 4;


gEcgWaveData[10] =data[10] & 0x0fff;

data[11] = (*(msg+4)) << 4;


gEcgWaveData[11] =data[11] & 0x0fff;

for(i=7;i<12;i++)
{
// ¼ÆËã·å·åÖµ
if ( gEcgMaxValue[i] < gEcgWaveData[i] )
{
gEcgMaxValue[i] = gEcgWaveData[i];
}
if ( gEcgMinValue[i] > gEcgWaveData[i] )
{
gEcgMinValue[i] = gEcgWaveData[i];
}

data[i] >>= 4;
data[i] += 0x80;

if ( data[i] < 0 )
data[i] = 0;
if ( data[i] > 255 )
data[i] = 255;

// wave
*(gEcgWaveBufWritePtr[i]++) = data[i] & 0xff;
if ( gEcgWaveBufTail[i] < gEcgWaveBufWritePtr[i] )
gEcgWaveBufWritePtr[i] = gEcgWaveBufHead[i];
}
}
4. 心率数据解包
typedef struct
{
BOOL leadDetachedChl; //体温通道 1 探头信息
BOOL leadDetachedCh2; //体温通道 2 探头信息
} TEMPSTATUS;

typedef struct
{
INT16 temp; // 体温通道 1 体温值
INT16 temp2; // 体温通道 2 体温值
} TEMPPARAMS;
typedef struct
{
BOOL leadDetachedRA; // 导联RA是否脱落(脱落:TRUE)
BOOL leadDetachedLA; // 导联LA是否脱落
BOOL leadDetachedLL; // 导联LL是否脱落
BOOL leadDetachedV ; // 导联V是否脱落

BOOL leadDetachedV2; // 导联V2是否脱落(脱落:TRUE)


BOOL leadDetachedV3; // 导联V3是否脱落
BOOL leadDetachedV4; // 导联V4是否脱落
BOOL leadDetachedV5 ; // 导联V5是否脱落
BOOL leadDetachedV6 ; // 导联V6是否脱落

UCHAR signalStatus; // 心电分析状况


BeatInfoType beatInfo; // 心搏信息
UCHAR beatInfo;
INT16 beatPos; // 心搏位置
INT16 arrType; // 心律失常类型
INT16 arrPos; // 心律失常位置
UCHAR beatHeart; // 心跳
UCHAR paceFlag; // 起博脉冲
UCHAR saturateFlag; // 信号饱和标志
BOOL isApnea;
INT16 apneaPos; // 窒息报警位置信息
BOOL isCalibrating; // 是否正在校准,TRUE:是;FALSE:否。
} ECGSTATUS;

typedef struct
{
INT16 hr; // 心
INT16 pvc; // 每分钟室性早搏的个数
INT16 stValue1;
INT16 stValue2;
INT16 stValue3;
INT16 stValue4;
INT16 stValue5;
INT16 stValue6;
INT16 stValue7;
INT16 stValue8;
INT16 rr; // 呼吸率
} ECGPARAMS;

static VOID OnRate ( UCHAR* msg )


{
gEcgParams.hr = *msg;
gEcgParams.hr +=*(msg + 1)<<8;
gEcgParams.rr = *(msg + 2) ;
gEcgParams.rr +=*(msg + 3)<<8;

}
5. 体温探头信息和体温数据解包(显示时,要除 10)
static VOID OnTempData ( UCHAR* msg )
{
gTempStatus.leadDetachedChl = (*msg)& 0x01;
gTempStatus.leadDetachedCh2 = ((*msg)& 0x02)>>1;
gTempParams.temp = *(msg+1) ;
gTempParams.temp += *(msg+2)<<8;

gTempParams.temp2 = *(msg+3) ;
gTempParams.temp2 += *(msg+4)<<8;

}
6. 心电导联连接信息
static VOID OnLeadConnect ( UCHAR* msg )
{
gEcgStatus.leadDetachedRA = (*msg & 0x20) ? FALSE : TRUE;
gEcgStatus.leadDetachedLA = (*msg & 0x10) ? FALSE : TRUE;
gEcgStatus.leadDetachedLL = (*msg & 0x08) ? FALSE : TRUE;
gEcgStatus.leadDetachedV = (*msg & 0x04) ? FALSE : TRUE;
}
7. 心电导联连接信息
static VOID OnLeadVConnect ( UCHAR* msg )
{
gEcgStatus.leadDetachedV2 = (*msg & 0x01) ? FALSE : TRUE;
gEcgStatus.leadDetachedV3 = (*msg & 0x02) ? FALSE : TRUE;
gEcgStatus.leadDetachedV4 = (*msg & 0x04) ? FALSE : TRUE;
gEcgStatus.leadDetachedV5 = (*msg & 0x08) ? FALSE : TRUE;
gEcgStatus.leadDetachedV6 = (*msg & 0x10) ? FALSE : TRUE;
}
8. ST 段值解包(显示时,要除 100)
static VOID OnStValues ( UCHAR* msg )
{
gEcgParams.stValue1 = *msg;
gEcgParams.stValue1 += *(msg+1)<<8;
gEcgParams.stValue2 = *(msg+2);
gEcgParams.stValue2 += *(msg+3)<<8;
gEcgParams.stValue3 = *(msg+4);
gEcgParams.stValue3 += *(msg+5)<<8;

You might also like