在c++buider中如果使用串行口进行通讯的话,保守的做法是使用底层的API函数 如:READFILE WRITEFILE 等

虽然好用,但是对于新手来说,是很陌生的,同时对于通讯的稳定性,有经验的人,也不一定能完全控制。

还好在vb中有一个控件MSCOMM 我就借用过来。因为使用MICROSOFT 现成的控件可以节省大量的时间。对于如何注册MSCOMM控件,可以在百度搜索一下就可以。我今天只是针对具体的代码奉献给大家。

在ONMSCOMM事件中 执行如下代码:

void __fastcall TForm1::MSComm1Comm(TObject *Sender)
{

AnsiString ss1,ss2,ss3,ss4,ss5,ss6,ss7;//声明一个AnsiString类型的变量
OleVariant s; //声明一个用于接收数据的OleVariant变量。
 if(MSComm1->CommEvent==comEvReceive) // 接收缓冲区中是否收到Rthreshold个字符。
{
if(MSComm1->InBufferCount)// 是否有字符驻留在接收缓冲区等待被取出
{
   char *p1;
   s=MSComm1->Input;//接收数据
   ss1=s.AsType(varString); //把接收到的OleVariant变量转换成AnsiString类型
   MSComm1->InBufferCount=0;      //这是必须的
   MSComm1->OutBufferCount=0;  //这是必须的 因为在传送大量数据时必须清楚输入输出缓冲区
   //---------------------------------

}

}

如果在ONMSCOMM接受数据的同时,有按钮事件发生。可以写如下代码。

void TForm1::right()
   {
   AnsiString  string4,string5;
   string4=(AnsiString)char(5)+"00FFBW0M002101157";
   if(Form1->MSComm1->PortOpen)
   Form1->MSComm1->Output=StringToOleStr(string4);
   Sleep(100);  //延时是必须的 
   string4=(AnsiString)char(5)+"00FFBW0M002101056";
   if(Form1->MSComm1->PortOpen)
   Form1->MSComm1->Output=StringToOleStr(string4);
   Sleep(100);//延时是必须的 如果不延时的话, PLC返回的值是错误的。
   MSComm1->InBufferCount=0;       
   MSComm1->OutBufferCount=0;

   }



//仅以自己的辛苦奉献给大家,希望大家不要在走弯路。 实践证明此代码运行是非常稳定的。 开发软件最重要是要求速度和稳定性。不要拘泥于c++builder 和VB之争 c++builder其中AD0 是有一个非常著名的BUG 当数据库是空时就报错。而VB就没有