程序的要求是通过串口控制猫,使两台电脑能够通过猫连接,并能够互相发送消息及文件。
现在遇到了严重的问题,快崩溃了,赶来紧急求助
1:两个猫,分别为A,B(不一样),写了一个程序,按拨号按钮(即使直接发送AT命令)时,B猫正常,A猫提则示ERROR,但是用附件的超级终端发送相同的命令时却可以拨号,没有问题。
2:A边用超级终端,B端用自己写的程序,可以实现连接,但是两边都无法接收对方发的任何消息!如果两边都用超级终端时可以接收消息
3.我的串口的timeout设置为-1,是不是这个的问题?
部分代码如下
拨号 private void button1_Click(object sender, EventArgs e)
{
serialPort1.Write("atd" + num.Text + System.Convert.ToChar(13).ToString() + System.Convert.ToChar(10).ToString());
}发送AT命令(兼作发送消息的按钮) private void message_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
serialPort1.Write(sbox.Text + System.Convert.ToChar(13).ToString() + System.Convert.ToChar(10).ToString());
Thread.Sleep(300);
byte[] data = new Byte[serialPort1.BytesToRead];
serialPort1.Read(data, 0, data.Length);
string response = System.Text.Encoding.ASCII.GetString(data);
this.rbox.Invoke(new EventHandler(delegate
{ rbox.AppendText(response); rbox.ScrollToCaret(); }));
timer1.Enabled = true;
}用定时器轮询消息的 private void timer1_Tick(object sender, EventArgs e)
{
byte[] data = new Byte[serialPort1.BytesToRead];
serialPort1.Read(data, 0, data.Length);
string response = System.Text.Encoding.ASCII.GetString(data);
if (response.Contains("\r\n"))
{
if (response.Contains("begin") && response.Contains("stop"))
{
temp = response;
t = new Thread(new ThreadStart(ReceiveFile));
t.Start();
}
else
{
this.rbox.Invoke(new EventHandler(delegate
{ rbox.AppendText(response); rbox.ScrollToCaret(); }));
}
}
}
现在遇到了严重的问题,快崩溃了,赶来紧急求助
1:两个猫,分别为A,B(不一样),写了一个程序,按拨号按钮(即使直接发送AT命令)时,B猫正常,A猫提则示ERROR,但是用附件的超级终端发送相同的命令时却可以拨号,没有问题。
2:A边用超级终端,B端用自己写的程序,可以实现连接,但是两边都无法接收对方发的任何消息!如果两边都用超级终端时可以接收消息
3.我的串口的timeout设置为-1,是不是这个的问题?
部分代码如下
拨号 private void button1_Click(object sender, EventArgs e)
{
serialPort1.Write("atd" + num.Text + System.Convert.ToChar(13).ToString() + System.Convert.ToChar(10).ToString());
}发送AT命令(兼作发送消息的按钮) private void message_Click(object sender, EventArgs e)
{
timer1.Enabled = false;
serialPort1.Write(sbox.Text + System.Convert.ToChar(13).ToString() + System.Convert.ToChar(10).ToString());
Thread.Sleep(300);
byte[] data = new Byte[serialPort1.BytesToRead];
serialPort1.Read(data, 0, data.Length);
string response = System.Text.Encoding.ASCII.GetString(data);
this.rbox.Invoke(new EventHandler(delegate
{ rbox.AppendText(response); rbox.ScrollToCaret(); }));
timer1.Enabled = true;
}用定时器轮询消息的 private void timer1_Tick(object sender, EventArgs e)
{
byte[] data = new Byte[serialPort1.BytesToRead];
serialPort1.Read(data, 0, data.Length);
string response = System.Text.Encoding.ASCII.GetString(data);
if (response.Contains("\r\n"))
{
if (response.Contains("begin") && response.Contains("stop"))
{
temp = response;
t = new Thread(new ThreadStart(ReceiveFile));
t.Start();
}
else
{
this.rbox.Invoke(new EventHandler(delegate
{ rbox.AppendText(response); rbox.ScrollToCaret(); }));
}
}
}
算了,这古董,不管了。试试这样修改。
你修改timer的enabled不行的。你修改的时候如果timer正在操作,你就会错过一次数据,造成并发读操作丢失返回结果。bool listen = false;
private void message_Click(object sender, EventArgs e)
{
listen = true;
timer1.Enabled = false;
serialPort1.Write(sbox.Text + System.Convert.ToChar(13).ToString() + System.Convert.ToChar(10).ToString());
Thread.Sleep(300);
byte[] data = new Byte[serialPort1.BytesToRead];
serialPort1.Read(data, 0, data.Length);
string response = System.Text.Encoding.ASCII.GetString(data);
this.rbox.Invoke(new EventHandler(delegate
{ rbox.AppendText(response); rbox.ScrollToCaret(); }));
timer1.Enabled = true;
listen = false;
}private void timer1_Tick(object sender, EventArgs e)
{
if(listen) return;
byte[] data = new Byte[serialPort1.BytesToRead];
serialPort1.Read(data, 0, data.Length);
string response = System.Text.Encoding.ASCII.GetString(data);
if (response.Contains("\r\n"))
{
if (response.Contains("begin") && response.Contains("stop"))
{
temp = response;
t = new Thread(new ThreadStart(ReceiveFile));
t.Start();
}
else
{
this.rbox.Invoke(new EventHandler(delegate
{ rbox.AppendText(response); rbox.ScrollToCaret(); }));
}
}
}
serialPort1.DataReceived += new SerialDataReceivedEventHandler(serialPort1_DataReceived);先简单化问题
同时,发送命令等待应答的方式稍微的修改一点。
诶,偷懒好久了。看来要吧这个系列补全……
还差
ascii分析
ascii,binary混合分析
引入的抽象分析类,提供命令发送等待应答和界面互斥的方法
蓝牙,网络的整合
最终的“万金油”通讯库
硬件到软件之间的中间层
创建自己的三层架构通讯程序,稳定,利于扩展的开发。
好多……C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。
C# 串口操作系列(2) -- 入门篇,为什么我的串口程序在关闭串口时候会死锁 ?
C# 串口操作系列(3) -- 协议篇,二进制协议数据解析
回12L,那句话要用到什么库啊?提示找不到SerialDataReceivedEventHandler