如果我将通讯参数部分加上,就取不到“仪表可用”信息(就是得到仪表号)
不加却能取得,但是结束程序的时候报一个指针错误(是不是有指针没释放?)
在控件中是设置是和程序一样的
我的代码如下:
void __fastcall TFm_Main::FormCreate(TObject *Sender)
{
YbCommDevice1->PortNo=StrToInt(ComboBox1->Text);
try
{
YbCommDevice1->Active = true;
Shape1->Brush->Color=clGreen;
}
catch(Exception &e)
{
Application->MessageBox(e.Message.c_str(),"错误信息",MB_OK|MB_ICONSTOP);
}
/* //设为与仪表相同的通讯参数
YbCommDevice1->TYbCommDevice::br9600; //波特率
YbCommDevice1->ByteSize=8; //数据位
YbCommDevice1->Parity=TYbCommDevice::ptNoParity; //无校验
YbCommDevice1->StopBits=TYbCommDevice::sbTwoStopBit; //停止位为2位
*/
// YbCommDevice1->PackageSize=10; //
YbCommDevice1->InBufSize=10; //读缓存
YbCommDevice1->OutBufSize=8; //写缓存
// YbCommDevice1->QueueSize=1; //包的个数
YbCommDevice1->PackageSize=10; //最大数据包的字节数
YbCommDevice1->PackageType = cptFrameTimeout; //用定义超时时间的方法判断数据包 (适合单片机的简单协议)
YbCommDevice1->PackageInterval=10; //超时时间间隔
YbCommDevice1->UsePackage = true; //启动 Package
}
//---------------------------------------------------------------------------
void __fastcall TFm_Main::Button2Click(TObject *Sender)
{
for(int i=0;i<10;i++)
{
//1.发送
Label4->Caption="正在询问"+IntToStr(i)+"号表...";
if(!send_Read(i)) continue; //发送不成功,下一个
Sleep(200);
//2.接收
unsigned char Buf[10]; //接收缓存
unsigned char CRC1,CRC2;
int n = YbCommDevice1->ReadPackage(Buf,10);
if(n<=0) continue; //未收到数据,下一个
// 此处还要加上CRC校验
CRC1=Buf[1]*256+Buf[0]+Buf[3]*256+Buf[2]+Buf[5]*256+Buf[4]+Buf[7]*256+Buf[6]+i;
CRC2=Buf[9]*256+Buf[8];
// 3.如果接收成功,表明仪表可用
if(CRC1==CRC2) Memo1->Lines->Add(i);
}
}
//---------------------------------------------------------------------------
//////////////////////////////////////////////////////////////////////////////
// 功能:向仪表写读参数
// 参数:unsigned char c_AI, (要读的表号+0x80)
//////////////////////////////////////////////////////////////////////////////
bool __fastcall TFm_Main::send_Read(unsigned short AI)
{
unsigned int iCRC=0x00*256+0x52+(AI); // 校验码计算
if(YbCommDevice1->Active!=true) return false;
unsigned char Buf[8];
Buf[0] = AI+0x80; // AI表号+0x80
Buf[1] = AI+0x80; // AI表号+0x80
Buf[2] = 0x52; // 读, //写为0x43
Buf[3] = 0x00; // 所读项目(00为SV值)
Buf[4] = 0x00; // 低位参数,读时为0
Buf[5] = 0x00; // 高位参数,读时为0
Buf[6] = iCRC-(iCRC/256)*256; //低位字节
Buf[7] = iCRC/256; //高位字节
if(!YbCommDevice1->Write(Buf,8)) //发送8个字节: 99 1B 0D
{
return false;
}
else
{
return true;
}
}
//---------------------------------------------------------------------------
--------------------next---------------------
阅读(1734) | 评论(0) | 转发(0) |