苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 10535|回复: 11

[其他] serialport接收延时关闭问题

[复制链接]
发表于 2013-4-27 09:52:30 | 显示全部楼层 |阅读模式
            comm.Write(tComman.Text+"\r");
            int n = comm.BytesToRead;//先记录下来,避免某种原因,人为的原因,操作几次之间时间长,缓存不一致   
            byte[] buf = new byte[n];//声明一个临时数组存储当前来的串口数据,声明数组长度为N   
            comm.Read(buf, 0, n);//读取缓冲数据,从0到N。   
            builder.Length = 0;//清除字符串构造器的内容   
            //直接按ASCII规则转换成字符串   
            builder.Append (Encoding.ASCII.GetString (buf ));
            //追加的形式添加到文本框末端,并滚动到最后。
            tGet.Text =builder.ToString () ;
            //for (; ; )
            //{
              //  if (tGet.Text !="")
                //    break;
            //}
            comm.Close();
这段代码收不到返回是不是缺少延时呢?如果是的话在web窗体里面,这里适用的延时语句怎么写呢?


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-4-27 10:09:49 | 显示全部楼层
你这个可以把读的部分放到一个线程里面,读完之后再进行其它操作。意思就是可以启动一个线程在里面设置一个循环停个几秒执行一次读的方法,只到接收到数据才结束循环
[code=csharp]Thread pingTask = new Thread(new ThreadStart(delegate
            {
                //代码,这样也是开启一个子线程      while (true)
                                {
                             if(---){读到数据后结束 break;}
                           }
            }));
            pingTask.Start();[/code]
 楼主| 发表于 2013-4-27 10:19:20 | 显示全部楼层
站长苏飞 发表于 2013-4-27 10:09
你这个可以把读的部分放到一个线程里面,读完之后再进行其它操作。意思就是可以启动一个线程在里面设置一个 ...

这么讲好像和我理解的线程不大一样了,哈哈,我理解的是,如果这是两个线程这个运行了,那边关闭程序还是照常关闭呢。我去试试,谢飞哥
发表于 2013-4-27 10:22:40 | 显示全部楼层
两个线程之间没有影响的,你关了一个另个一个还是正常执行,除非你关闭进程
 楼主| 发表于 2013-4-27 10:31:17 | 显示全部楼层
站长苏飞 发表于 2013-4-27 10:22
两个线程之间没有影响的,你关了一个另个一个还是正常执行,除非你关闭进程

飞哥好像说的是多数情况,在这里涉及串口的竞争使用啊。。。这样的话好像不通啊,在串口上会出错把0.0
发表于 2013-4-27 10:39:09 | 显示全部楼层
发送你还使用单线程啊,只是使用一个线程去接收而已,一个发送一个接收,不存在竞争吧
 楼主| 发表于 2013-4-27 10:41:14 | 显示全部楼层
站长苏飞 发表于 2013-4-27 10:39
发送你还使用单线程啊,只是使用一个线程去接收而已,一个发送一个接收,不存在竞争吧

哈哈,飞哥。。。因为发送完了就关闭串口啊0.0开关串口有竞争,我去看看怎么改善,也发上来飞哥瞧瞧
发表于 2013-4-27 10:43:10 | 显示全部楼层
枯叶化蝶 发表于 2013-4-27 10:41
哈哈,飞哥。。。因为发送完了就关闭串口啊0.0开关串口有竞争,我去看看怎么改善,也发上来飞哥瞧瞧

好的,其实是不影响的,因为接收部分是循环,如果关闭了就等打开了再接收。或者是你设置一个开关的机制,思路就是这样。接下来就看你出招了,呵呵
 楼主| 发表于 2013-4-27 10:57:04 | 显示全部楼层
站长苏飞 发表于 2013-4-27 10:43
好的,其实是不影响的,因为接收部分是循环,如果关闭了就等打开了再接收。或者是你设置一个开关的机制, ...

            Thread pingTask = new Thread(new ThreadStart(delegate
                {
                    tGet.Text = "";
                    comm.PortName = dSerPor.Text;
                    comm.BaudRate = int.Parse(dBouRat.Text);
                    comm.Open();
                    while (true)
                    {
                        if (tGet.Text != "")
                        {
                            comm.Close();
                            break;
                        }
                        else
                            //直接按ASCII规则转换成字符串   
                            builder.Append(Encoding.ASCII.GetString(buf));
                            //追加的形式添加到文本框末端,并滚动到最后。
                            tGet.Text = builder.ToString();
                    }
                }));
            //for (; ; )
            //{
              //  if (tGet.Text !="")
                //    break;
            //}
            //comm.Close();

这个没有冲突是不是说明线程不起作用呢,起作用的话应该是open了两次啊
发表于 2013-4-27 10:58:40 | 显示全部楼层
枯叶化蝶 发表于 2013-4-27 10:57
Thread pingTask = new Thread(new ThreadStart(delegate
                {
             ...

应该不会,你可以加个判断啊,如果是打开状态就不要再执行Open了
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-26 02:57

© 2014-2021

快速回复 返回顶部 返回列表