Professional Documents
Culture Documents
7104 M7104 M7112心电板解包范例
7104 M7104 M7112心电板解包范例
串口解包函数范例
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;
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];
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 ;
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];
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 ;
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是否脱落
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;
}
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;