首页 新闻 会员 周边

winform从listview读取数据后到serialport发送数据,有时漏发的问题?

0
悬赏园豆:30 [待解决问题]

如题,用断点跟踪=>继续每次都可以监视到并收到到串口发送,但是禁掉断点就不能收到串口发送信息(就是程序不会执行setr())

解决办法是在串口发送前面加个thread.sleep(10);就正常了.

什么原因想不明白,为了避免不必要的问题,特意用的form.timer,不敢想是.net4.6.1的什么bug,可能还是我写的有问题.

望各位大神指教,鉴于正常运行了,就不愿意推倒了用qt去做.....

 public void setR(string XYRMaddr, int value) //value 0=off,1=on
        {
            //发送:%01#WCSY00011**[CR]
            try
            {
                string outStr = "";
                string sReg = XYRMaddr.Substring(0, 1);
                string sAddr = XYRMaddr.Substring(1, XYRMaddr.Length - 1).PadLeft(4).Replace(" ", "0");
                outStr = "%01#WCS" + sReg + sAddr.ToUpper() + value.ToString();
                outStr = outStr + bcc(outStr) + "\r";
                byte[] aSCIIEncodingCode = Encoding.ASCII.GetBytes(outStr);
                COMM.Write(aSCIIEncodingCode, 0, aSCIIEncodingCode.Length);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "串口单点写入报错", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

 private void readproduce()
        {

            if (listView1.Items.Count > 0)
            {

                int count = 0, countitem = 0;
                if (listView1.InvokeRequired)
                {
                    listView1.Invoke(new Action(() =>
                    {
                        count = Convert.ToInt32(listView1.Items[0].SubItems[3].Text);
                        countitem = Convert.ToInt32(listView1.Items[0].Text);
                        NewPutPositionInformation(listView1.Items[0].Text, listView1.Items[0].SubItems[3].Text);
                    }));
                }
                else
                {
                    count = Convert.ToInt32(listView1.Items[0].SubItems[3].Text);
                    countitem = Convert.ToInt32(listView1.Items[0].Text);
                    NewPutPositionInformation(listView1.Items[0].Text, listView1.Items[0].SubItems[3].Text);
                }
                switch (countitem)
                {
                    case 1: Thread.Sleep(10); setR("R0", 1); break;
                    case 2: Thread.Sleep(10); setR("R1", 1); break;
                    case 3: Thread.Sleep(10); setR("R2", 1); break;
                    case 4: Thread.Sleep(10); setR("R3", 1); break;
                    case 5: Thread.Sleep(10); setR("R4", 1); break;
                    case 6: Thread.Sleep(10); setR("R5", 1); break;
                    case 7: Thread.Sleep(10); setR("R6", 1); break;
                }
                count--;
                listView1.Invoke(new Action(() => { listView1.Items[0].SubItems[3].Text = Convert.ToString(count); }));
                if (count == 0)
                {
                    listView1.Invoke(new Action(() => { listView1.Items[0].Remove(); }));
                }
            }

        }

mk2003的主页 mk2003 | 初学一级 | 园豆:174
提问于:2018-10-29 10:06
< >
分享
所有回答(3)
0

只想明确告诉你不要想多了 —— 通常都是自己的问题,这个模块更是n多年的成熟模块。做工业协议、游戏机等等都没这个问题,哪怕板子漏电、断电~~

花飘水流兮 | 园豆:13560 (专家六级) | 2018-10-29 10:12

没说是serialport的问题啊,是取了数据=>case 1: Thread.Sleep(10); setR("R0", 1); break; 中的setR("R0", X)没执行,前面加个Thread.Sleep(10); 就好了.

支持(0) 反对(0) mk2003 | 园豆:174 (初学一级) | 2018-10-29 10:19

case 1: setR("R0", 1); break; //不行,有时setR("R0", 1)不执行
case 1: Thread.Sleep(10); setR("R0", 1); break;//ok了,这个是蛮奇怪的,不知道为什么

支持(0) 反对(0) mk2003 | 园豆:174 (初学一级) | 2018-10-29 10:20
0

你的意思是说你有两台电脑,一台电脑通过串口发送数据,另一台接受,结果接受的电脑不能接收到发送的电脑发送的全部字节?

会长 | 园豆:12401 (专家六级) | 2018-10-29 10:13

不是 是 case 1: Thread.Sleep(10); setR("R0", 1); break; 中的setR("R0", X)没执行,前面加个Thread.Sleep(10); 就好了.

支持(0) 反对(0) mk2003 | 园豆:174 (初学一级) | 2018-10-29 10:18

case 1: setR("R0", 1); break; //不行,有时setR("R0", 1)不执行
case 1: Thread.Sleep(10); setR("R0", 1); break;//ok了,这个是蛮奇怪的,setR("R0", 1)每次都执行不知道为什么

支持(0) 反对(0) mk2003 | 园豆:174 (初学一级) | 2018-10-29 10:28

@mk2003: 可不可以写一个可运行的demo发上来?

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-10-29 10:38

@会长: 这个网站我不知道怎么发啊 好像只能发图片 能不能给我你的邮箱啊,我的是570711700@qq.com

支持(0) 反对(0) mk2003 | 园豆:174 (初学一级) | 2018-10-29 10:47

@mk2003: zzy_0471@163.com

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-10-29 10:53

@会长:
收件人 投递状态 时间
zzy_0471@163.com
邮件内容未能通过收件方的“安检”,对方服务器拒收,正在进行第7053次重投。
2018年10月29日(星期一) 上午10:57

你拒收了

支持(0) 反对(0) mk2003 | 园豆:174 (初学一级) | 2018-10-29 10:59

@mk2003: ........
那发qq邮箱吧:359177772@qq.com

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-10-29 11:03

@会长: 已发送成功

支持(0) 反对(0) mk2003 | 园豆:174 (初学一级) | 2018-10-29 11:04

@mk2003: 没收到,你到底发了什么反动内容?手动笑

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-10-29 11:07

@会长: 两个邮箱都已发送成功了啊

支持(0) 反对(0) mk2003 | 园豆:174 (初学一级) | 2018-10-29 11:10

@mk2003: 收到了,不过运行不起来,我这里没有你那里连接串口的设备

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-10-29 11:16

@mk2003: 我建议是把逻辑代码都去掉,只留下能够展现出问题的demo。可能你在写demo的过程中就已经找到答案了

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-10-29 11:20

@会长: 是啊 公司生产部让我帮忙写个流程控制之类的东西,连的是松下plc,我看它通讯协议写的.
这个也不存在线程互斥问题,因为form计时器线程就在ui线程,并且方法执行也是同步的.你看能不能用虚拟串口模拟下执行.

支持(0) 反对(0) mk2003 | 园豆:174 (初学一级) | 2018-10-29 11:21

好吧,希望我有空

支持(0) 反对(0) 会长 | 园豆:12401 (专家六级) | 2018-10-29 11:25

@会长: 哈哈 多谢了,不过原因我猜是两个串口发送的间隔时间太短 我记得测试时间是小于1ms的,但这个解释太牵强了,毕竟串口的write也是非常快的.

支持(0) 反对(0) mk2003 | 园豆:174 (初学一级) | 2018-10-29 11:30

@会长: 问题原因网上有 就是间隔时间太短了.见链接
https://blog.csdn.net/chenlunju/article/details/7044239

支持(0) 反对(0) mk2003 | 园豆:174 (初学一级) | 2018-10-29 22:22
0

问题原因网上有 就是间隔时间太短了.见链接
https://blog.csdn.net/chenlunju/article/details/7044239

mk2003 | 园豆:174 (初学一级) | 2018-10-29 22:24

除非是建立在已经大于缓冲区。
最大流速自己可以根据波特率计算。

支持(0) 反对(0) 花飘水流兮 | 园豆:13560 (专家六级) | 2018-10-30 13:55
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册