我需要写一个小程序,来和连接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";
}
}
}
我考虑了一下,第一次收到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";
}
}
}
解决方案 »
- WebBrower控件如何实现缩略显示网页
- TextBox 数据绑定:导致两个集合中的绑定绑定到同一个属性,参数名:bingding
- 求问???
- 请教一下关于C/S的初级问题!!
- 请问在perl 或php中的crypt($password, $salt); 在.net要用什么代替啊?
- ComboBox控件的问题
- 关于打印问题!在线等,急急急,分不够再加!顶者有分
- 请问一个鼠标编程的问题。如何在.NET中设置鼠标。
- ORACLE更新数据问题,分不够再加
- 提交录入时怎么实现将所有符号都提交(如回车......)(C#)
- 什么时候用decimal,double,float?
- 小弟想了解WINDOWS内部的一些东西,有那些经典的书没有?
为什么不用SerialPort类呢?...
System.IO.Ports.SerialPort来操作。
2005开发的
{
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; }
建议先把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; //实验调试用
}
{
callinfo=callinfo+(string)axMSComm1.Input;//这样貌似比较好点
textBox2.Text=callinfo; //实验调试用
}
我也在为这个苦恼,我的想法是在接受到CONNECT 9600的字符后就清空缓冲区,然后重新接受单片机发过来的数据。