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

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 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?
  • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
  • ¥15 texstudio的问题,
  • ¥15 spaceclaim模型变灰色
  • ¥15 求一份华为esight平台V300R009C00SPC200这个型号的api接口文档
  • ¥15 字符串比较代码的漏洞
  • ¥15 欧拉系统opt目录空间使用100%
  • ¥15 ul做导航栏格式不对怎么改?