C# 问串口问题() 我用C#写串口通信时 出现一个很奇怪的问题 就是用C#写的串口和控制板可以发送 接受相应的数据, 然后把c#软件关了 用串口助手调试的话就出现串口助手不能接受数据,只能发送数据。如果要用串口助手调试的话,就得电脑重启。请问下各位高手 这个问题改怎么解决 谢谢!! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 代码逻辑?? /// <summary> /// 串口接受数据 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> void SerialPort1_DataReceived(object sender,System.IO.Ports.SerialDataReceivedEventArgs e) { if (Closing) return; try { Listening = true; string text = string.Empty; int n = SerialPort1.BytesToRead; byte[] result = new byte[n]; SerialPort1.Read(result, 0, n); Operator(result);//数据处理 } catch (Exception err) { MessageBox.Show(err.Message + "111"); } finally { Listening = false; SerialPort1.DiscardOutBuffer(); SerialPort1.DiscardInBuffer(); } }///发送数据部分 Form1 from1 = new Form1(); public static void SendByPorts(byte[] buffer) { if (Form1.SerialPort1.IsOpen) { try { string lString = null; Form1.SerialPort1.Write(buffer, 0, buffer.Length); for (int i = 0; i < buffer.Length; i++) { string b1 = null; string b = Convert.ToString(buffer[i], 16); if (b.Length < 2) { b1 = "0" + b.ToString(); } else { b1 = b.ToString(); } lString += b1 + " "; } Form1.stinglist.Clear(); Form1.stinglist.Insert(0, lString); } catch (Exception err) { } } }帖代码看看那个地方逻辑有问题 几个不好的习惯先给你说一下首先,不要在线程中使用MessageBox.Show方法。其次,不要大量使用try做毫无预计的异常处理,应当有针对性的处理,否则就不要处理,调试阶段,出现异常进入debug更容易找到问题。代码风格貌似很熟悉,和我某些风格蛮像,不过有些疏漏。排查错误要靠经验和耐心,知识未必能一定管用,你可以试着屏蔽掉一些代码来确定问题所在的代码块。比如你没贴出来的:Operator方法调用,你可以试着不调用看看。还有Form1.SerialPort1.Write(buffer, 0, buffer.Length);这是个怎么写法呢?用的是静态成员变量么?为什么要这么用?buffer会不会出错? 关于那个messagebox 只是让他在运行时截获异常位置 关于那个SeriPort 是定义的位static 关于Operator byte[] data=new byte[9]; public void CloseWork(object o) { StateObject spo = (StateObject)o; mutex.WaitOne(); for (int i = 0; i < data.Length; i++) { data[i] = 0x00; } data[0] = 0xaa; data[1] = 0x01; data[2] = 0x00; data[3] = 0x80; data[4] = 0x04; data[5] = 0x10; data[6] = 0x01; data[7] = 0x15; data[8] = 0x55; Port.SendByPorts(data);//Port类下面是一个发送数据的类 mutex.ReleaseMutex(); }class Port { Form1 from1 = new Form1(); public static void SendByPorts(byte[] buffer) { if (Form1.SerialPort1.IsOpen) { try { Form1.SerialPort1.Write(buffer, 0, buffer.Length);//SerialPort 为form1的静态变量 } catch (Exception err) { } finally { Form1.SerialPort1.DiscardInBuffer(); Form1.SerialPort1.DiscardOutBuffer(); } } } 各位高手,我用的是usb转串口,也就是虚拟串口,C#写串口程序的时候,能正常通信,但是在发送数据之后等待回复的时候释放资源关闭程序,再重新打开程序打开串口的时候就卡在那里了,在Open方法之前串口状态是关闭状态,请教高手:再次打开怎么会卡在Open()方法上 C# C# 编写一个程序 判断用户输入的邮箱格式是否正确并提示 知道输入正确 正则表达式,小小的一个问题,100分送上 求一个兼容VS2008 js无刷新 域名空间申请 关于委托的问题 请求超时问题 字符串+的相关问题 请问Socket关闭时出现一堆异常应该怎么解决? 关于textbox的滚动条 实现快速操作XML的库:EasyXml***开源下载! 关于样试表问题? 怎样判断Encoding.GetEncoding中的字符串是合法的编码格式? .Net Chart 控件的基本用法,谢谢
/// <summary>
/// 串口接受数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
void SerialPort1_DataReceived(object sender,System.IO.Ports.SerialDataReceivedEventArgs e)
{
if (Closing) return;
try
{
Listening = true;
string text = string.Empty;
int n = SerialPort1.BytesToRead;
byte[] result = new byte[n];
SerialPort1.Read(result, 0, n);
Operator(result);//数据处理
}
catch (Exception err)
{
MessageBox.Show(err.Message + "111");
}
finally
{
Listening = false;
SerialPort1.DiscardOutBuffer();
SerialPort1.DiscardInBuffer();
}
}
///发送数据部分
Form1 from1 = new Form1();
public static void SendByPorts(byte[] buffer)
{
if (Form1.SerialPort1.IsOpen)
{
try
{
string lString = null;
Form1.SerialPort1.Write(buffer, 0, buffer.Length);
for (int i = 0; i < buffer.Length; i++)
{
string b1 = null;
string b = Convert.ToString(buffer[i], 16);
if (b.Length < 2)
{
b1 = "0" + b.ToString();
}
else
{
b1 = b.ToString();
}
lString += b1 + " ";
}
Form1.stinglist.Clear();
Form1.stinglist.Insert(0, lString);
}
catch (Exception err)
{ }
}
}
帖代码看看那个地方逻辑有问题
首先,不要在线程中使用MessageBox.Show方法。
其次,不要大量使用try做毫无预计的异常处理,应当有针对性的处理,否则就不要处理,调试阶段,出现异常进入debug更容易找到问题。
代码风格貌似很熟悉,和我某些风格蛮像,不过有些疏漏。排查错误要靠经验和耐心,知识未必能一定管用,你可以试着屏蔽掉一些代码来确定问题所在的代码块。比如你没贴出来的:Operator方法调用,你可以试着不调用看看。
还有
Form1.SerialPort1.Write(buffer, 0, buffer.Length);这是个怎么写法呢?用的是静态成员变量么?为什么要这么用?buffer会不会出错?
byte[] data=new byte[9];
public void CloseWork(object o)
{
StateObject spo = (StateObject)o;
mutex.WaitOne();
for (int i = 0; i < data.Length; i++)
{
data[i] = 0x00;
}
data[0] = 0xaa;
data[1] = 0x01;
data[2] = 0x00;
data[3] = 0x80;
data[4] = 0x04;
data[5] = 0x10;
data[6] = 0x01;
data[7] = 0x15;
data[8] = 0x55;
Port.SendByPorts(data);//Port类下面是一个发送数据的类
mutex.ReleaseMutex();
}class Port
{
Form1 from1 = new Form1();
public static void SendByPorts(byte[] buffer)
{
if (Form1.SerialPort1.IsOpen)
{
try
{
Form1.SerialPort1.Write(buffer, 0, buffer.Length);//SerialPort 为form1的静态变量
}
catch (Exception err)
{ }
finally
{
Form1.SerialPort1.DiscardInBuffer();
Form1.SerialPort1.DiscardOutBuffer();
}
}
}