C# 串口收发异常,偶尔有某个收不到,断点计数都断不到,原因分析(1)

经了解:C#消息机制是消息流水线响应机,不能同时进行。

C#  数据更新是在Timer,分析:可能是在进行time任务时,不能进行invoke接收任务。之后我打算开个多线程试试或把接收中处理精简看看能不能收到。(该分析错误的)

private void Form1_Load(object sender, EventArgs e)
 {

........

 //定时器
            System.Timers.Timer aTimer = new System.Timers.Timer();
            aTimer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            aTimer.Interval = 3;
            aTimer.AutoReset = true;//设置是执行一次(false)还是一直执行(true);
            aTimer.Enabled = true; //是否执行System.Timers.Timer.Elapsed事件;

..........

}

void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
      ComStatusdeal();
}

//接收在

sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);

public void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)

{

            System.Threading.Thread.Sleep(50);//延时50ms完全接收数据
            //this.Invoke跨线程访问,辅助线程访问主线程控件
            this.Invoke((EventHandler)(delegate
            {
                tc.DataReceived_485();
            }));

}

事后几个月发现写了个错误的文章今日2020/09/15更正:之所以接受不多是因为Time定时器timer_Elapsed同时进入了多次,每一次我接受到数据就进入timer_Elapsed处理,这里的处理有些UI更新比较耗时,导致当前未处理完,就再次进入timer_Elapsed,出现重入问题。

解决:使用线程同步技术 互斥

    public Form1()
    {
            InitializeComponent();
            CheckForIllegalCrossThreadCalls = false;
            Interlocked.Exchange(ref inTimer, 0);//每次初始化为0
            this.SetStyle(ControlStyles.UserPaint, true);//自动绘制
            this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);//减少闪烁
            this.SetStyle(ControlStyles.OptimizedDoubleBuffer, true);//减少闪烁
            this.SetStyle(ControlStyles.DoubleBuffer, true);//减少闪烁
            this.SetStyle(ControlStyles.ResizeRedraw, true);//重绘控件
            this.SetStyle(ControlStyles.SupportsTransparentBackColor, true);//减少闪烁
   }

 private static int inTimer = 0;

 private void Timer_Elapsed(object sender, EventArgs e)
 {
            //使用线程同步技术 互斥
            if (Interlocked.Exchange(ref inTimer, 1) == 0)
            {

                ....

                ....
                Interlocked.Exchange(ref inTimer, 0);
            }
            //DateTime afterDT = System.DateTime.Now;
            //TimeSpan ts = afterDT.Subtract(beforeDT);
            //System.Diagnostics.Debug.WriteLine(ts.TotalMilliseconds);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值