/// <summary>
/// 串口数据,接收事件
/// </summary>
private void comm_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
if (Closing) return;//如果正在关闭,忽略操作,直接返回,尽快的完成串口监听线程的一次循环
try
{
Listening = true;//设置标记
int n = comm.BytesToRead;
byte[] buf = new byte[n];//当前的串口数据
comm.Read(buf, 0, n);//读取缓冲数据
BufferList.AddRange(buf); //1.缓存数据
if (BufferList == null || BufferList.Count() == 0)
{
return;
}
var resultASCII = new ASCIIEncoding().GetString(buf);//转为ASCII码
returnStr += resultASCII;
//返回命令处理
ReturnCmdDispose();
AssessmentCom();
}
catch (Exception w)
{
LogHelper.WriteLogAndInfo("串口接收事件发生异常:" + w.Message);
returnStr = string.Empty;
}
finally
{
Listening = false;//我用完了,ui可以关闭串口了。
}
}
private void AssessmentCom()
{
//一条有效的肌电指令有11位,包含(开头1位/类型1位/排序号1位/A1、E 4位/A2 4位)
while (BufferList.Count >= 11)//至少要包含头(2字节)+长度(1字节)+校验(1字节)
{
//FF(255)代表开头 FE(254)代表肌电 FD(253)代表压力
if (BufferList[0] == 255 && (BufferList[1] == 254 || BufferList[1] == 253))
{
BufferList.CopyTo(3, binary_data_1, 0, 4);//复制一条完整数据到具体的数据缓存
BufferList.CopyTo(7, binary_data_2, 0, 4);
BufferList.RemoveRange(0, 11);//正确分析一条数据,从缓存中移除数据。
lock (thisLock)
{
secondDisplay = secondDisplay + 7;
float _second = (float)Math.Round(secondDisplay / 100, 2);
float valueA1 = 0f;//4个byte8位,就是32位,转为32位的float类型,也就是打点的值
float valueA2 = 0f;
if (binary_data_1 != null) valueA1 = SetSerialPortDataList(binary_data_1, 1, _second);
if (binary_data_2 != null) valueA2 = SetSerialPortDataList(binary_data_2, 0, _second);
//界面处理
if (MyoelectricityCollect != null)
{
MyoelectricityCollect(Math.Round(valueA1, 2), Math.Round(valueA2, 2));
}
}
}
else
{
//这里是很重要的,如果数据开始不是头,则删除数据
BufferList.RemoveAt(0);
}
}
}
double runTime = 0d;
private void Spcom_MyoelectricityCollect(double A1E, double A2)
{
try
{
this.Dispatcher.Invoke(new Action(() =>//委托操作GUI控件的部分
{
if (currentUserControl is BiofeedbackUserControl)
{
BiofeedbackUserControl biofeedback = currentUserControl as BiofeedbackUserControl;
double curentValue = 0d;//实时打点值
if (runTime > maxTime || isReset)//设置当前模板曲线一屏为10秒,大于10秒,从第一个点开始\或重新调整
{
isReset = false;
runTime = 0d;
Reset();
}
if (biofeedback != null)
{
var currentModel = biofeedback.Tag as TestDataModel;
curentValue = currentModel.AisleInfo == "A2" ? A2 : A1E;
double[] val = new double[] { Math.Round(runTime, 2), Math.Round(curentValue, 2), Math.Round(0d, 2) };
biofeedback.CurrentValTime = val;
}
}
}));
runTime = runTime + PublicVar.timeDot;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message.ToString(), "提示");
}
}
/// 关闭串口
/// 关闭串口将停止所有指令
///
public void CommClose()
{
try
{
//eleWatch.Restart();
//while (eleWatch.Elapsed.TotalMilliseconds <= 8) { }
//eleWatch.Stop();
if (comm.IsOpen)
{
Closing = true;
while (Listening)
{
System.Windows.Forms.Application.DoEvents();
};
//打开时点击,则关闭串口
comm.Close(); //zcx_err comm 未将对象引用到实例
Closing = false;
secondDisplay = 0.0d;
returnStr = string.Empty;
BufferList.Clear();
}
}
catch (Exception w)
{
LogHelper.WriteLogAndInfo("串口关闭发生异常:" + w.Message);
}
finally
{
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话: