请教使用spcomm发送短信:
 我这两天使用spcomm发送短信,短信猫Wavecom,使用AT指令。代码如下。
 问题:
   执行后手机能够收到短信,但程序收不到猫的返回值。在OnReceive中,BufferLength=1,Buffer[0]=0x1a。另外,若读取猫中卡号,使用AT指令:AT+CNUM,还是一样。
   若用超级终端,则可正常发送与收到返回值等。
 //test code
 //send
 void __fastcall TForm1::SendBtnClick(TObject *Sender)
 {
     AnsiString strCmd , strRet;
     CommCheck->PortOpen = false ;
     CommCheck->CommName = "COM6";
     CommCheck->PortOpen = true ;    
     if(CommCheck->PortOpen)
     {
         //Edit1: mobilephone number
         //Memo2: sms content
         char buf[]={0x1a,0x00};
         strCmd.sprintf("AT+CMGS=%s\r%s\r",Edit1->Text.Trim().c_str(),Memo2->Text.c_str());
         CommCheck->WriteCommData(strCmd.c_str(),strCmd.Length());
         Sleep(10);
         CommCheck->WriteCommData(buf,1);
         Sleep(10);
         //waiting for smscat return OK or Error
         //OnReceive() 得到返回值....
 
        Memo1->Lines->Add(CommCheck->CommName+": send sms, phone num:,"+Edit1->Text.Trim());
     }
     else
     {
         Memo1->Lines->Add(CommCheck->CommName+": open fail!");
     }
 }
 //---------------------------------------------------------------------------
 //receive from smscat
 void __fastcall TForm1::CommCheckReceiveData(TObject *Sender, PChar Buffer,
       WORD BufferLength)
 {
     int n = BufferLength ;
     AnsiString re = AnsiString(Buffer);
 }
 
//spcom setting
   object CommCheck: TComm
     PortOpenError = 'Error opening serial port'
     CommName = 'COM6'
     BaudRate = 115200
     RtsControl = RtsEnable   
     XonLimit = 500
     XoffLimit = 500
     ByteSize = _8
     Parity = None
     StopBits = _1
     XonChar = #17
     XoffChar = #19
     ReplacedChar = #0
     ReadIntervalTimeout = 100
     ReadTotalTimeoutMultiplier = 0
     ReadTotalTimeoutConstant = 0
     WriteTotalTimeoutMultiplier = 0
     WriteTotalTimeoutConstant = 0
     OnReceiveData = CommCheckReceiveData
     Left = 648
     Top = 120
   end 

解决方案 »

  1.   

    lz帖子发错地方了不过返回值是从ReceiveData事件中获取,但想触发ReceiveData事件,要调用Read方法
      

  2.   

    在OnReceive中,BufferLength=1只会令触发频繁,如果该事件中的语句处理时间长,还有可能造成丢码,应该将缓冲区定大一些,然后,靠设置合理的超时来令它触发,这样就可以合适地处理接收到的信息
      

  3.   


    spcomm中没有read的方法呀?
      

  4.   

    我是在OnReceive中获取串口设备的返回值,返回时,观察BufferLength值为1,不是对BufferLength赋值1。而在属性设置时,InBufferSize缺省为2048。如何设置合理超时?
      

  5.   

      这个问题应该跟 DCB设置有关, 这种问题只有自己不断的调试才能找出问题! 
      

  6.   

      像这样的问题我使用别的控件,就是在近来我也遇到这种情况,
    使用串口助手可以收到数据,但是自己就是收到一个字节的数据,
    经过不断对DCB的设置和调式才能接收到数据。 这个就不要问我
    怎么弄了,因为通讯DCB的设置是跟你的通讯设备有关。只能自己
    调试了。
      

  7.   

    不如到盒子里下那个短信VCL控件。自己调试问题太多。