http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

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

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

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

查看: 3273|回复: 0

[咨询站长] c#通过串行通信,发送数据帧与帧的时间间隔,以0.1ms为单位,测试不准确,急急急,...

[复制链接]
发表于 2014-6-9 21:07:41 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 sd7081433 于 2014-6-10 18:28 编辑

我以前没做过编程,刚学过c#不久,这是我编的第一个程序,这是第二回发帖,第一回什么都不懂,随便发的(其实这回也是)。这是第一认认真真的发的。
之前写的太复杂了,我简单的说下,就是如题,c#通过串行通信,发送数据帧与帧的时间间隔,以0.1ms为单位,但是测试的时候不准确。测试时我是用示波器测试的。
希望舒飞大哥帮帮我,也希望有做过的朋友帮一下,谢谢!
这是我测试用的发送函数
#region Function  - Write
        public bool send_function(byte[] message,int messageLength, ref byte[] Response,int ResponseLength)
        {
            UsingTimer ut=new UsingTimer();
            
            
            
            
            
            T35Counter = ((1 + DataBits + 1 + StopBitscounter) * 3.5) / BaudRate;
            T15Counter = ((1 + DataBits + 1 + StopBitscounter) * 1.5) / BaudRate;
            T35Counter = Convert.ToInt32(T35Counter * 10000);
           
            //Ensure port is open:
            
            while (sp.BytesToWrite != 0)
            {
            }
            // Start timer
            //Send Modbus message to Serial Port:
            
           
                try
                {
                    sp.DiscardInBuffer();
                    sp.DiscardOutBuffer();
                    ////写入数据

                    sp.Write(message, 0, 1);
                    
                    while (true)
                    {
                       
                        
                        if (sp.BytesToWrite == 0)
                        {
                            ut.Counter1();
                           
                            break;
                        }
                    }
                    while (true)
                    {
                        ut.Counter2();

                       a = (uint)ut.Duration;
                        if ((a) >= (T35Counter + 10))
                        {
                            sp.Write(message, 0, 1);
                          
                            return true;

                        }
                    }
                    

                                       
                     
                }
                catch (Exception err)
                {
                    modbusStatus = "Error in write event: " + err.Message;
                    //MessageBox.Show(modbusStatus);
                    return false;
                }

              
               

         
        }
        
        #endregion
这是我调用的api函数
   public UsingTimer()
        {
            counter1 = 0;
           counter2 = 0;

            if (QueryPerformanceFrequency(ref freq) == false)
            {
                // high-performance counter not supported
                throw new Win32Exception();
            }
        }

      
        public void Counter1()
        {
            
            Thread.Sleep(0);

            QueryPerformanceCounter(ref counter1);
        }

      
        public void Counter2()
        {
            QueryPerformanceCounter(ref counter2);
        }

      
        public double Duration
        {
            get
            {
                return (double)10000*(counter2 - counter1) / freq;
            }
        }
    }



1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

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

GMT+8, 2024-5-13 20:44

© 2014-2021

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