Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2340741
  • 博文数量: 816
  • 博客积分: 10000
  • 博客等级: 上将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-17 17:57
文章分类

全部博文(816)

文章存档

2011年(1)

2008年(815)

分类:

2008-12-17 18:09:14

如果我将通讯参数部分加上,就取不到“仪表可用”信息(就是得到仪表号)
不加却能取得,但是结束程序的时候报一个指针错误(是不是有指针没释放?)
在控件中是设置是和程序一样的


我的代码如下:
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) |
给主人留下些什么吧!~~