weixin_42222907 2019-02-28 10:31 采纳率: 50%
浏览 587
已采纳

c# winform ,大片机接收缓存有限,串口向单片机发送大量数据时,只会执行前面的内容,后面的数据全部丢失

目前逻辑是,单片机执行完一行指令回返回一个ok。
上位机收到一个ok值则计数-1
上位机每发送一行数据都计数+1,发送前为判断计数是否超过某个值,超过则暂停发送,直到收到ok,计数满足要求。

请问代码哪里有问题。
补充:现在的问题好像跟跨线程有关,手动逐行发送计数都没问题。通过按钮事件循环发送,发送事件没结束前,接收数据事件没法执行。

      //点击发送按钮事件,逐行发送listBoxgcode中全部内容
      private void simpleButton12_Click(object sender, EventArgs e)
       {
           send_rows = 0;//已发送行数
            for (int i = 0; i < listBoxgcode.Items.Count; i++)
            {
    serialPort1.Write(listBoxgcode.Items[i].ToString() + "\r");//回车符为单片机识别的结束位,需加上
    send_rows += 1;//每发送一行,计数+1

                while (send_rows > 30)//发送行数大于30行则停留在此循环
                 {
                    System.Threading.Thread.Sleep(100);//延时0.1s
                  }
             }
        }




    /// 串口接收数据事件,收到一个ok,则send_rows-1
    private void serialPort1_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
    string mystring = serialPort1.ReadExisting();
    if (mystring.Contains("ok"))
        send_rows -= 1;

    getmystring = new getstring(DoUpdate_tbRecieve);    //调用tbrecieve委托事件
    Invoke(getmystring, mystring);
}
catch (Exception EX)
{
    MessageBox.Show(EX.Message, "出错", MessageBoxButtons.OK, MessageBoxIcon.Error);
    return;
}

}

  • 写回答

4条回答 默认 最新

  • hxycsdn9159 2019-02-28 17:02
    关注

    首先确认两个函数是否在同一个线程执行,可以打印线程的id查看,如果是在同一个线程执行的那不用想,肯定是得全部发送完才能接收。再说说下来的问题:
    1.假如是同一个线程执行的,那你的发送次数如果超过30不用想程序就像傻了一样在while里死循环,而且界面处于“未响应”的假死状态
    2.假如是不同线程执行的,那么最起码你应该给计数的变量加上锁,保证原子操作

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

悬赏问题

  • ¥15 不同系统编译兼容问题
  • ¥100 三相直流充电模块对数字电源芯片在物理上它必须具备哪些功能和性能?
  • ¥30 数字电源对DSP芯片的具体要求
  • ¥20 antv g6 折线边如何变为钝角
  • ¥30 如何在Matlab或Python中 设置饼图的高度
  • ¥15 nginx中的CORS策略应该如何配置
  • ¥30 信号与系统实验:采样定理分析
  • ¥100 我想找人帮我写Python 的股票分析代码,有意请加mathtao
  • ¥20 Vite 打包的 Vue3 组件库,图标无法显示
  • ¥15 php 同步电商平台多个店铺增量订单和订单状态