110,538
社区成员
发帖
与我相关
我的任务
分享
private void MainForm_Load(object sender, EventArgs e)
{
this.ExtractSerialPortInfo += new InvokeExtractSerialPortInfo(MethodExtractSerialportInfo);
gdResultGridDisplay1.TestStateChanged += new TestStateChangedEventHandler(StartTest_Changed);
serialport.DataReceived += new SerialDataReceivedEventHandler(ReceiveSerialPortData);
}
private void ReceiveSerialPortData(object sender, SerialDataReceivedEventArgs e)
{
int n = serialport.BytesToRead;
byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据
serialport.Read(buf, 0, n);//读取缓冲数据
this.BeginInvoke(new InvokeUpdateReceive(MethodUpdateReceive), buf);
}
private void MethodUpdateReceive(byte[] buf)
{
builder.Append(gb2312.GetString(buf));
//builder.Append(Encoding.ASCII.GetString(buf));//直接按ASCII规则转换成字符串
string data = builder.ToString().Replace("\0", "");
receiveShell1.WriteTextToReceiveArea(data);//追加的形式添加到文本框末端,并滚动到最后。
builder.Clear();
tempdata += data;
if (!gdResultGridDisplay1.IsOnTest)//没有在测试过程当中
{
if (ExtractSerialPortInfo != null)
{
ExtractSerialPortInfo(new GetMACOnlineInfoArgs(tempdata));//触发解析事件
}
}
}
private void MethodExtractSerialportInfo(GetMACOnlineInfoArgs e)
{
string data = e.SerialPortInfo;
省略一些无关的.
if (gdResultGridDisplay1.OnLineCount == gdResultGridDisplay1.EveryTestCount)
{
gdResultGridDisplay1.IsOnlineOver = true;
}
if (gdResultGridDisplay1.IsOnlineOver && gdResultGridDisplay1.IsScanOver)
{
gdResultGridDisplay1.IsCanStartTest = true;//触发开始测试事件,执行StartTest_Changed方法
}
}
private void StartTest_Changed(object sender, TestStateChangedEventArgs e)
{
e.IsOnTest = true;//设置成正在测试过程当中
gdResultGridDisplay1.IsCanStartTest = false;//不能开始测试
gdResultGridDisplay1.IsOnlineOver = false;//设置成False,防止上次测试未结束又开始新的测试
gdResultGridDisplay1.IsScanOver = false;//设置成False,防止上次测试未结束又开始新的测试
bool Flag = false;
thread = new Thread(new ThreadStart(delegate()
{
代码有点多,省略一些
this.BeginInvoke(new InvokeUpdateDisplayGrid1(MethodUpdateGridDisplay), tempdata, sendcount);
然后又是其他操作
}
thread .Start();
}
this.BeginInvoke(new InvokeUpdateReceive(MethodUpdateReceive), buf);
为什么要把 MethodUpdateReceive 放到主线程去执行、去阻塞主线程呢?如果你连类似 builder.Append(gb2312.GetString(buf)); 之类的这些代码都没有信心在子线程中就能执行通过,那么可见你的代码会多么阻塞主线程。
第三,每当执行 serialport.Read(buf, 0, n); 之后,你不确定已经收到了消息结束符,不确定一条完整的消息恰好收到,因此不能立刻去执行 builder.Append(gb2312.GetString(buf)); 这类代码。你应该把收到的消息放到 List<byte> 或者 MemoryStream 结构里边,等到确定收到了消息结束符之后,把累计收到的消息(取出一条完整消息的那些字节)一齐取出来进行处理。
看前边的5、6条代码就知道有这么多非常严重的逻辑设计问题,后边的就不用多看了。