jeryler 发表于 2010-9-5 17:54:47

怎样在外部调用MSComm1Comm()函数而能使之触发,请教高手!

我是在BCB平台上用MSComm控件做串口通信,因为老板要求运行程序程序之后就可以直接找到当前短信猫的波特率与所使用的串口,不能进行任何界面操作,所以我的代码只能写在TForm1::FormCreate(TObject *Sender)或TForm1::FormShow(TObject *Sender)里面。因为查询短信猫的波特率与所使用的串口是通过for循环实现,所以在使用MSComm1->Output=StringToOleStr(*ATcommand)发送指令后就必须马上调用MSComm1Comm(Sender)接收并解析指令来进行判断。
这样问题就出现了:在外部调用MSComm1Comm(Sender),调式时MSComm1->CommEvent=-4083,MSComm1->Input根本接收不到数据。怎样在外部调用MSComm1Comm()函数而能使之触发,请教高手!
还有当我把if(MSComm1->CommEvent==2)这个判断条件给注销掉后,程序运行之后能够达到我的最终效果,即能够查询到当前短信猫的波特率与所使用的串口将之显示在界面上。但当我换用另一个短信猫之后,调式时MSComm1->InBufferCount总为0,即根本接收不到发送的指令。再换回原来的短信猫,缓存里面又有内容了,程序运行结果正确。实在想不通了,请教高手指点下,小女子不胜感激。
下面是我的部分代码:
void __fastcall TForm1::FormShow(TObject *Sender)
{
if(MSComm1->PortOpen!=true)
{
for(int pt=0;pt<COMlist->Items->Count ;pt++)
{
MSComm1->CommPort= StrToInt((COMlist->Items->Strings ).SubString(4,1));
for(int bt=0;bt<ComboBox2->Items->Count ;bt++)
{

MSComm1->Settings=ComboBox2->Items->Strings +","+"N"+","+"8"+","+"1"; file://设置串口的属性波特率、奇偶校验、数据位和、//停止位。
MSComm1->InputMode=0;//设置传入数据的格式,0表示文本形式 ,InputMode=0,ASC码;InputMode=1,真实的二进制数据;
MSComm1->PortOpen=true;//打开串口
MSComm1->RThreshold=1;

MSComm1->Output=StringToOleStr(*ATcommand); //发送指令

Sleep(100); //暂停0.1秒
MSComm1Comm(Sender); //接收并解析指令
....................

}
}
}

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

AnsiString rcvBuff; //存放接收的指令
AnsiString str; file://声明一个AnsiString类型的变量
OleVariant s; //file:声明一个用于接收数据的OleVariant变量。
if(MSComm1->CommEvent==2) //comEvReceive = 2 接收事件。
// 接收缓冲区中是否收到Rthreshold个字符。
{
if(MSComm1->InBufferCount)// 是否有字符驻留在接收缓冲区等待被取出
{
s=MSComm1->Input;//接收数据
str=s.AsType(varString); //file:把接收到的OleVariant变量转换成AnsiString类型
rcvBuff =str ; //将发送的指令存在此
F_rcving =1;
Uinput=str.c_str(); //将AnsiString类型转换为UnicodeString
}
}

}

zodiac1111 发表于 2010-9-11 15:56:25

貌似没人懂?。。。。。。
页: [1]
查看完整版本: 怎样在外部调用MSComm1Comm()函数而能使之触发,请教高手!