我需要写一个小程序,来和连接MODEM的单片机通讯,使用了MSCOMM控件,具体的思路是PC接到MODEM的振玲应答后就发送一个字符串给单片机。我把和MODEM通讯的事件贴出来,因为有点小问题,想请教一下大家。1.MODEM发送“RING”给PC后,PC需要发送指令给MODEM自动应答,发送的指令是“AST0=1”这个字符后需要加“AST0=1\r\n”吗?2.我放了两个axMSComm控件来做测试,进行自发自收,前两个字符能收到,但是到ok那里就不执行了,不知道为什么,跟踪了一下,还是能收到OK的。代码如下:3.不知道哪位好心人能不能提供给我一个这样的例子程序我学习一下,我的油箱[email protected] 
我考虑了一下,第一次收到RING后可以发送OK,但是不知道RING被清除了没有,同一个axMSComm能多次接收串口发来的数据吗?我的想法是,收到了后清除数据,再接收下一个字符数据,自己做了一下,好象不行。
private void button1_Click(object sender, System.EventArgs e)
{
  
  axMSComm2.Output="RING";
} private void axMSComm1_OnComm(object sender, System.EventArgs e)
{
if (axMSComm1.CommEvent == 2) 
{
string strIn="" ; 
axMSComm1.InputMode=MSCommLib.InputModeConstants.comInputModeText; 
axMSComm1.InputLen=0; strIn=axMSComm1.Input.ToString();
if(strIn=="RING")
{
label2.Text="成功得到RING,发送ats0=1"; 
                                              axMSComm1.OutBufferCount = 0;
axMSComm1.Output="ats0=1";
} if(strIn=="ok")
{
label2.Text="成功得到ok,发送123";  }

}

}
private void axMSComm2_OnComm(object sender, System.EventArgs e)
{

if (axMSComm2.CommEvent == 2) 
{

string strIn="" ; 
axMSComm2.InputMode=MSCommLib.InputModeConstants.comInputModeText; 
axMSComm2.InputLen=0; strIn=axMSComm2.Input.ToString(); if(strIn=="ats0=1")
{
label4.Text="成功得到ats0=1,发送OK";
 
                                              axMSComm2.OutBufferCount = 0; axMSComm2.Output="OK";
}
}
}

解决方案 »

  1.   


    为什么不用SerialPort类呢?...
      

  2.   

    如果是2005,建议使用
    System.IO.Ports.SerialPort来操作。
      

  3.   

    后面要加个\r\n我也做过这样的 不过我用的是System.IO.Ports.SerialPort 
    2005开发的
      

  4.   

    我现在主要是觉得axMSComm控件来回传字符有些问题。因为接收的数据收到后要做验证,验证完后又要发出去,等待传回的数据,这个过程我把握不好,希望大家能给个例子我看一下。
      

  5.   

    kingdomgps,谢谢你的类。我已经能搜索到CONNECT了,但是,有个问题,在CONNECT后却不能接受数据了,只能发送数据,是怎么回事呢?帮我看看好吗?分不够的话可以另外开一贴。下面是我用来接受数据的代码,在找到了CONNECT后不能接收数据了,只能发送数据,是怎么回事呢?private void axMSComm1_OnComm(object sender, System.EventArgs e)
    {
      
    if (axMSComm1.CommEvent == 2) 
    {
    axMSComm1.InputMode=MSCommLib.InputModeConstants.comInputModeText; 
    axMSComm1.InputLen=0; callinfo=callinfo+axMSComm1.Input.ToString();
     
    Regex r = new Regex("CONNECT"); 
                     Match m = r.Match(callinfo); if (m.Success) 

                      MessageBox.Show ("CONNECT成功");  }           textBox2.Text=callinfo;  }
      

  6.   

    你贴出来的代码是接受数据的啊,发送数据的在哪里呢?
    建议先把on_Comm事件里面的MessageBox注释掉再调试下,MessageBox的调用会导致线程的阻塞
    还有,你现在的代码调试用做实验可以,但是实际中不要在on_Comm事件里直接使用textBox2.Text=callinfo; 这样的语句,需要用委托
    然后就是关于一些属性的设置,建议你放到窗体初始化的时候设置,不要在on_Comm事件中来设置,on_Comm事件可以简单的写成下面这样:
    private void axMSComm1_OnComm(object sender, System.EventArgs e)
    {
        callinfo=callinfo+axMSComm1.Input.ToString();
        textBox2.Text=callinfo; //实验调试用
    }
      

  7.   

    private void axMSComm1_OnComm(object sender, System.EventArgs e)
    {
        callinfo=callinfo+(string)axMSComm1.Input;//这样貌似比较好点
        textBox2.Text=callinfo; //实验调试用
    }
      

  8.   

    TO kingdomgps(工作没激情) :我用了串口调试工具进行发送字符,拨号我也用的串口调试工具V2。0,程序只做接收。拨号好了出现了CONNECT 9600 后,我便用串口调试工具V2。0发送字符给程序,但是收不到。
      

  9.   

    随便说一下,在拨号前,我用程序接收串口调试工具V2.0发送字符是没问题的,就是在出现拨号好了,出现CONNECT 9600后就收不到了,但是我的程序确可以使用 axMSComm1.Output发送字符串给 串口调试工具V2.0。
      

  10.   

    出现CONNECT 9600之前我的程序和串口调试工具V2.0都可以互发互收,出现CONNECT 9600之后只能程序给串口调试工具V2.0发,却不能收到串口调试工具V2.0发给我程序的字符。
      

  11.   

    没具体做过串口拨号的程序,但是现在有点不明白的地方:在一条串口通信信道里,既有下面发上来的CONNECT 9600的字符,又有你发给串口调试工具V2.0的数据,还有串口调试工具V2.0发给你的数据,怎么行呢问下,那个CONNECT 9600字符是谁发给你的啊?
      

  12.   

    CONNECT 9600 是MODEM发出来了,连路好了后MODEM就会发出这个字符。
      

  13.   

    没具体做过串口拨号的程序,但是现在有点不明白的地方:在一条串口通信信道里,既有下面发上来的CONNECT 9600的字符,又有你发给串口调试工具V2.0的数据,还有串口调试工具V2.0发给你的数据,怎么行呢
    我也在为这个苦恼,我的想法是在接受到CONNECT 9600的字符后就清空缓冲区,然后重新接受单片机发过来的数据。