MSCOMM控件 如何获取6帧数据(100)

  • 主题发起人 主题发起人 rogerxu
  • 开始时间 开始时间
R

rogerxu

Unregistered / Unconfirmed
GUEST, unregistred user!
本人急于编写电子秤串口读取程序难点在于,如何分字节的得到每一个字节的内容电子秤的说明书上写明,一次发送6个帧,每个帧10位,第一位是起始位,最后一位是结束位,中间8位为数据我只需要第3,4,5帧的内容,这三帧的内容是BCD1,BCD2,BCD3这样的BCD1 显示电子秤的数值的最低字节BCD2 显示电子秤的数值的中间字节BCD3 显示电子秤的数值的最高字节我怎么才能做到获取每一帧的内容,然后把它展出到窗体上面第一帧是起始位说明书上写的是0FFH第二帧 D0-D2 小数点位置(0-5) D3-D4 当前的工作模式 00-计算重量 01-计算数量 10-百分比模式 D5 1表示负数,0表示正数 D6 1表示重量稳定,0表示不稳定 D7 1表示溢出,0表示未溢出第三帧 D0-D7 显示BCD1电子秤的数值的最低字节第四帧 D0-D7 显示BCD2电子秤的数值的中间字节第五帧 D0-D7 显示BCD3电子秤的数值的最高字节第六帧 D0-D7 计重模式下的单位 1表示磅 0 表示公斤因为在不断获取帧,所以要判断帧的起始位,第一帧就是起始位 0FFH如果不断获取帧,那么就循环判断,0FFH,如果等于它就开始取数据是吧应该用指针类型来做吗 case MSComm.CommEvent of 2: begin BufferCount := MSComm.InBufferCount; if BufferCount>0 then begin ReceiveData := MSComm.Input; for I := 0 to VarArrayHighBound(BByte,1) - 1 do begin BByte := @ReceiveData; BufferByte := Integer(BByte); StrBuffer := StrBuffer + IntToHex(Integer(BByte),2); BytePos := BytePos + 1; if (BytePos mod 6) = 0 then Memo1.Lines.Add(StrBuffer); end;本人不熟,指针类型,各位,我有C的源代码,不过看不懂能翻译成delphi吗void __fastcall TFrmMain::MSComWeiComm_Device1(TObject *Sender){ static AnsiString StrBuf; static unsigned char lv_ucaData[4096]; int lv_iCount=MSComWei->InBufferCount; OleVariant lv_olevarInput=MSComWei->Input; static unsigned char * lv_pucaDataPos=lv_ucaData; unsigned char * lv_pucaDataStart; int lv_iIndex; float lv_fWei; static float lv_fPerWei; static int lv_iEquCount=0; for(lv_iIndex=0;lv_iIndex<lv_iCount;lv_iIndex++) { * lv_pucaDataPos=lv_olevarInput.GetElement(lv_iIndex); lv_pucaDataPos++; } lv_pucaDataStart= lv_ucaData; while(lv_pucaDataStart< lv_pucaDataPos) { if(*lv_pucaDataStart==0xFF) break; lv_pucaDataStart++; } if( lv_pucaDataPos-lv_pucaDataStart<6) return; lv_pucaDataPos=lv_ucaData; lv_fWei=lv_pucaDataStart[4]/0x10*10+lv_pucaDataStart[4]%0x10; lv_fWei*=100; lv_fWei+=lv_pucaDataStart[3]/0x10*10+lv_pucaDataStart[3]%0x10; lv_fWei*=100; lv_fWei+=lv_pucaDataStart[2]/0x10*10+lv_pucaDataStart[2]%0x10; lv_fWei/=pow(10,((lv_pucaDataStart[1]&7)-1)); if((lv_pucaDataStart[1]&0x20)!=0) lv_fWei=-lv_fWei; if(lv_fWei!=-9999) { StrBuf.sprintf("%0.1f",lv_fWei); if(lv_fPerWei!=lv_fWei) { lv_iEquCount=0; lv_fPerWei=lv_fWei; PnlPackageWei->Hint="-9999"; } else { lv_iEquCount++; if(lv_iEquCount>1) { PnlPackageWei->Hint=StrBuf; }else { PnlPackageWei->Hint="-9999"; } } PnlPackageWei->Caption=StrBuf+"g"; }/* static AnsiString StrBuf; int IntBuf; static int PerIndex=0; float FltBuf; static float PerFltBuf; static int EquCount=0; bool b=true; BYTE * C2,*C1; BYTE B[2048]; int iBuf; iBuf=MSComWei->InBufferCount; C2=(BYTE *)MSComWei->Input.VPointer; for(IntBuf=0;IntBuf<iBuf;IntBuf+=2,PerIndex++) { B[PerIndex]=C2[IntBuf]; } for(IntBuf=0;IntBuf<PerIndex;IntBuf++) { iBuf=B[IntBuf]; if(B[IntBuf]==245 && IntBuf+5<PerIndex) break; } if(IntBuf==PerIndex) return; PerIndex=0; FltBuf=(B[IntBuf+4]&0xf0)/0x10*10; FltBuf=FltBuf*10+(B[IntBuf+4]&0x0f); FltBuf=FltBuf*100+(B[IntBuf+3]&0xf0)/0x10*10+(B[IntBuf+3]&0x0f); FltBuf=FltBuf*100+(B[IntBuf+2]&0xf0)/0x10*10+(B[IntBuf+2]&0x0f); FltBuf=FltBuf*0.1; if(FltBuf!=-9999) { if(b) { StrBuf.sprintf("%0.1f",FltBuf); } else { StrBuf.sprintf("-%0.1f",FltBuf); } if(PerFltBuf!=FltBuf) { EquCount=0; PerFltBuf=FltBuf; PnlPackageWei->Hint="-9999"; } else { EquCount++; if(EquCount>1) { PnlPackageWei->Hint=StrBuf; }else { PnlPackageWei->Hint="-9999"; } } PnlPackageWei->Caption=StrBuf+"g"; } */} end; end;
 
接收数据放到内存,然后判断头和尾,再解数据即可
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
771
import
I
I
回复
0
查看
734
import
I
后退
顶部