نمایش نتایج 1 تا 21 از 21

نام تاپیک: ارسال داده به صورت زمان واقعی روی پورت سریال

  1. #1
    کاربر تازه وارد
    تاریخ عضویت
    بهمن 1388
    محل زندگی
    تهران
    پست
    54

    ارسال داده به صورت زمان واقعی روی پورت سریال

    با سلام خدمت همه دوستان.
    در یک پروژه من بر روی سخت افزار یک آی سی D/A دارم که به یک میکرو کنترل میشه و این میکرو با پورت سریال (115200-8N1) به pc وصل است . من میخواهم بتوانم هر 1m، 2m،3m و ... داده روی پورت بفرستم. در ابتدا با یک تایمر این کار را کردم ولی دیدم زمانها غیر واقعی است . مثلا وقتی که انتظار داشتم هر 5 میلی ثانیه داده روی پورت باشه ؛ با اسیلوسکوپ که دیدم این زمان متغیر بود و از 6 میلی تا 16 میلی بود.
    لطفا راهنمایی کنید که بدجور گیر کردم. ممنون

  2. #2

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    اگه سمت کامپیوتر از برنامه خودتون استفاده می کنید از تایمر خود کامپیوتر استفاده کنید بعد از گذشت زمان مورد نظر یه کاراکتر مثل "n" به میکرو بفرستید برای میکرو هم تعیین کنید اگه این کاراکتر خاص رو گرفت اطلاعات را بفرستد
    قبل از شروع پروسه ارتباط میکرو با کامپیوتر رو با ارسال و دریافت یه کاراکتر دیگه چک کنید

  3. #3
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    44
    پست
    1,046

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    سلام
    با تشکر از پاسخ دوستمون maikola و در تکمیل صحبت‌های ایشون، تو یه تاپیک دیگه (اینجا) انواع تایمر رو که معمولآً دوستان بهشون توجه ندارن، معرفی کردم؛‌ ولی حتی با System.Timers.Timer هم شما تقریباً در Interval های کمتر یا معادل 15 میلی‌ثانیه به مشکل می‌خورید! (بنا به تجربه، نمیدونم مبنای علمی داره یا نه!) اگه از Windows.Forms.Timer استفاده کرده باشید که اوضاع وخیم تر هم میشه؛ درصورتیکه از هیچکدوم از اونها بازم نتیجه نگرفتین می‌تونید از کلاس Stopwatch استفاده کنید.
    بازم! اگه مشکل‌تون حل نشد دیگه راهکارهای سخت افزاری باید دنبال کنید، درسته کلاسهایی مثل MicroTimer برای اینکار نوشته شدن ولی اصولاً با دات نت بهتر از این (زمانهای پایین تر از میلی و درحد میکرو!) نمی‌تونید نتیجه بگیرید، برای اینکه ویندوز RTOS نیست!

  4. #4

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    طبق آزمایشی که قبلا انجام دادم Intervalمربوط به تایمر اگر زیر 100 تعریف بشه تایمر دزست کار نمی کنه قبلا مقالش رو تو یکی از داکیومنت های ماکروسافت هم دیده بودم
    خود 100میلی ثانیه هم خطا داره
    درحقیقت اینتروال تایمر رو برای کار دقیق از 1000 نباید کمتر گرفت

  5. #5
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    44
    پست
    1,046

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    نقل قول نوشته شده توسط maikola مشاهده تاپیک
    طبق آزمایشی که قبلا انجام دادم Intervalمربوط به تایمر اگر زیر 100 تعریف بشه تایمر دزست کار نمی کنه قبلا مقالش رو تو یکی از داکیومنت های ماکروسافت هم دیده بودم
    خود 100میلی ثانیه هم خطا داره
    درحقیقت اینتروال تایمر رو برای کار دقیق از 1000 نباید کمتر گرفت
    منبع؟

    کاری می‌کنید آدم به اسمش هم شک می‌کنه! برای برنامه که برای اطمینان خودم! تست کردم:

    static void Main(string[] args)
    {
    System.Timers.Timer timer = new System.Timers.Timer();
    // DON'T Forget: using System.Timers;
    timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

    // Set the Interval to 25 milliseconds
    timer.Interval = 25;
    timer.Enabled = true;

    Console.WriteLine("Press [Enter] to exit ...");
    Console.ReadLine();
    }

    // WriteLine Raised timestamp when the Elapsed event is raised.
    private static void OnTimedEvent(object source, ElapsedEventArgs e)
    {
    Console.WriteLine("Raised at {0:HH:mm:ss.fff}", e.SignalTime);
    }


    خروجی :

    Press [Enter] to exit ...
    Raised at 16:24:04.021
    Raised at 16:24:04.046
    Raised at 16:24:04.080
    Raised at 16:24:04.114
    Raised at 16:24:04.139
    Raised at 16:24:04.174
    Raised at 16:24:04.199
    Raised at 16:24:04.233
    Raised at 16:24:04.267
    Raised at 16:24:04.302
    Raised at 16:24:04.327
    Raised at 16:24:04.361
    Raised at 16:24:04.395
    Raised at 16:24:04.420
    Raised at 16:24:04.455
    Raised at 16:24:04.480
    Raised at 16:24:04.514
    Raised at 16:24:04.548
    Raised at 16:24:04.582
    Raised at 16:24:04.607
    Raised at 16:24:04.642
    Raised at 16:24:04.667
    Raised at 16:24:04.701
    Raised at 16:24:04.735
    Raised at 16:24:04.770
    Raised at 16:24:04.795
    Raised at 16:24:04.829
    Raised at 16:24:04.863
    Raised at 16:24:04.888
    ...

    اشتباهات 1 میلی ثانیه‌ای! که می‌بینید صرفاً بابت رند کردن هستند، و اکثراً در سیکل بعدی جبران شده اند...
    فایل های ضمیمه فایل های ضمیمه

  6. #6
    کاربر تازه وارد
    تاریخ عضویت
    بهمن 1388
    محل زندگی
    تهران
    پست
    54
    با تشکر از شما دوست عزیز، یک سوال : آیا این برنامه شما برای زمان 1 میلی ثانیه هم کار میکند؟ برای این سوال را پرسیدم جون به نظر برنامه شما به صورت consol است و برنامه من در windows form می باشد. و با انتقال این برنامه به form به نظرم(البته اگه درت نوشته باشم) زمانبندی ها درست نبود. برای تست من از ساعت استفاده نکردم بلکه در event تایمر ، عددی روی پورت سریال می نوشتم و خروجی را با اسکوپ نگاه کردم.
    باز هم تشکر میکنم از راهنمایی شما. اگر جایی دارم اشتباه می کنم لطفا باز هم ما را راهنمایی کنید. ممنون

  7. #7
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    44
    پست
    1,046

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    نقل قول نوشته شده توسط majid zarei مشاهده تاپیک
    ...آیا این برنامه شما برای زمان 1 میلی ثانیه هم کار میکند؟ برای این سوال را پرسیدم جون به نظر برنامه شما به صورت consol است و برنامه من در windows form می باشد...
    البته از بابت فرم و کنسول بودن که اصولاً نباید تفاوتی بکنه؛ ولی مطمئناً شما برای Interval یک میلی ثانیه نمی‌تونید از هیچکدوم از کلاس‌های Timer دات نت استفاده کنید؛ در پست قبلی من یه لینک دادم برای MicroTimer که اینجا کدش رو میذارم همراه با خروجی (ضمیمه رو ببینید)؛ ولی بازهم امکان اشتباه (هرچند خیلی کمتر و درحد میکروثانیه!) هست، که ممکنه در کار شما اختلال ایجاد کنه:
            static void Main(string[] args)
    {
    Program program = new Program();
    program.MicroTimerTest();
    }

    private void MicroTimerTest()
    {
    // Instantiate new MicroTimer and add event handler
    MicroLibrary.MicroTimer microTimer = new MicroLibrary.MicroTimer();
    microTimer.MicroTimerElapsed +=
    new MicroLibrary.MicroTimer.MicroTimerElapsedEventHand ler(OnTimedEvent);

    microTimer.Interval = 1000; // Call micro timer every 1000µs (1ms)

    // Can choose to ignore event if late by Xµs (by default will try to catch up)
    // microTimer.IgnoreEventIfLateBy = 500;

    microTimer.Enabled = true; // Start timer

    // Do something whilst events happening, for demo sleep 2000ms (2sec)
    System.Threading.Thread.Sleep(2000);

    microTimer.Enabled = false; // Stop timer

    // Wait for user input
    Console.ReadLine();
    }

    private void OnTimedEvent(object sender,
    MicroLibrary.MicroTimerEventArgs timerEventArgs)
    {
    // Do something small that takes significantly less time than Interval
    Console.WriteLine(string.Format(
    "Count = {0:#,0} Timer = {1:#,0} µs | " +
    "LateBy = {2:#,0} µs | ExecutionTime = {3:#,0} µs",
    timerEventArgs.TimerCount, timerEventArgs.ElapsedMicroseconds,
    timerEventArgs.TimerLateBy, timerEventArgs.CallbackFunctionExecutionTime));
    }


    و قسمتی از نتیجه:


    Count = 1 Timer = 1,000 µs | LateBy = 0 µs | ExecutionTime = 129 µs
    Count = 2 Timer = 2,732 µs | LateBy = 732 µs | ExecutionTime = 1,731 µs
    Count = 3 Timer = 3,000 µs | LateBy = 0 µs | ExecutionTime = 768 µs
    Count = 4 Timer = 4,000 µs | LateBy = 0 µs | ExecutionTime = 25 µs
    Count = 5 Timer = 5,000 µs | LateBy = 0 µs | ExecutionTime = 14 µs
    Count = 6 Timer = 6,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
    Count = 7 Timer = 7,000 µs | LateBy = 0 µs | ExecutionTime = 14 µs
    Count = 8 Timer = 8,000 µs | LateBy = 0 µs | ExecutionTime = 14 µs
    Count = 9 Timer = 9,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
    Count = 10 Timer = 10,000 µs | LateBy = 0 µs | ExecutionTime = 11 µs
    Count = 11 Timer = 11,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
    Count = 12 Timer = 12,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
    Count = 13 Timer = 13,000 µs | LateBy = 0 µs | ExecutionTime = 61 µs
    Count = 14 Timer = 14,000 µs | LateBy = 0 µs | ExecutionTime = 18 µs
    Count = 15 Timer = 15,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
    Count = 16 Timer = 16,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
    Count = 17 Timer = 17,000 µs | LateBy = 0 µs | ExecutionTime = 11 µs
    Count = 18 Timer = 18,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
    Count = 19 Timer = 19,000 µs | LateBy = 0 µs | ExecutionTime = 64 µs
    Count = 20 Timer = 20,000 µs | LateBy = 0 µs | ExecutionTime = 23 µs
    Count = 21 Timer = 21,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
    Count = 22 Timer = 22,000 µs | LateBy = 0 µs | ExecutionTime = 36 µs
    Count = 23 Timer = 23,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
    Count = 24 Timer = 24,000 µs | LateBy = 0 µs | ExecutionTime = 35 µs
    Count = 25 Timer = 25,000 µs | LateBy = 0 µs | ExecutionTime = 15 µs
    Count = 26 Timer = 26,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
    Count = 27 Timer = 27,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
    Count = 28 Timer = 28,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
    Count = 29 Timer = 29,000 µs | LateBy = 0 µs | ExecutionTime = 21 µs
    Count = 30 Timer = 30,000 µs | LateBy = 0 µs | ExecutionTime = 18 µs
    Count = 31 Timer = 31,000 µs | LateBy = 0 µs | ExecutionTime = 37 µs
    Count = 32 Timer = 32,000 µs | LateBy = 0 µs | ExecutionTime = 14 µs
    Count = 33 Timer = 33,000 µs | LateBy = 0 µs | ExecutionTime = 15 µs
    ...


    ضمناً من این رو نفهمیدم:
    ...برای تست من از ساعت استفاده نکردم بلکه در event تایمر ، عددی روی پورت سریال می نوشتم و خروجی را با اسکوپ نگاه کردم...
    چطور میشه از ساعت استفاده کرد! شما می‌تونید هریک از این property ها رو به اسیلوسکوپ بفرستید تا نتیجه دقیق‌تر بدست بیارین :

    • ElapsedMicroseconds
    • TimerLateBy
    • CallbackFunctionExecutionTime

    موفق باشید./
    فایل های ضمیمه فایل های ضمیمه

  8. #8

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال


  9. #9
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    44
    پست
    1,046

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    نقل قول نوشته شده توسط maikola مشاهده تاپیک
    من منطق برنامه شما رو درک نکردم! ولی به هرصورت اولاً در کارهای سیستمی و Embedded هیچوقت از Windows.Forms.Timer استفاده نمی‌کنن، چون غیرقابل اطمینان‌ترین‌شون هست! درثانی استفاده از کدهایی مثل ()label_x.Text = c_x.ToString در چنین روندهایی کار درستی نیست و جواب درستی نمی‌ده، حداقل نتیجه رو می‌ریختین تو یه ListBox...
    ________________
    درمورد Timer ها قبلاً توضیحی داده بودم که اینجا باز هم بهش استناد می‌کنم :
    چند نوع تایمر داریم : Threading.Timer ، Timers.Timer و Windows.Forms.Timer


    Windows.Forms.Timer فقط برای کارهایی که یک تایمر براتون کافیه و استفاده زیادی از کنترل های روی فرم میشه، مورد استفاده قرار میگیره (معمولاً!) ولی Timers.Timer رو می تونید تو هرکلاسی استفاده کنید و با توجه به اینکه اونهم از ComponentModel.Component منشعب شده، به شما اجازه میده که به کامپوننت ها دسترسی داشته باشید و می تونید ازش تو ویندوز فرم و ... استفاده کنید.
    به احتمال زیاد شما دارین کارهای سیستمی یا سخت افزاری/الکترونیکی و ... میکنید والّا اینهمه تایمر برای یه پروژه ویندوز فرم غیر معمول هست؛ اگه اینطور هست ادامه مطلب رو بخونید، والا همون دومی رو استفاده کنید.
    و اما! اگه شما با عناصر روی فرم کاری ندارین بهتره با Threading.Timer کار کنید، این یکی تا حدودی پیچیده تر هست، اما سطح بالاتری از کنترل رو به شما میده و بهترین گزینه (در صورت عدم استفاده از BachgroundWorker و Callback و ... که خیلی در موردشون صحبت کردیم و اگه لازم شد، بازم صحبت میکنم!) برای یک برنامه نویس سیستم (Embedded، الکترونیک، سخت افزار و ...) هست؛ و خوب بالطبع نسبت به امکاناتی که در اختیار یه برنامه نویس حرفه ای قرار میده، پیچیدگی بیشتری هم خواهد داشت! اگه احساس می کنید که به اون نیاز خواهید داشت، بهتره این مقاله رو بخونید:
    Comparing the Timer Classes in the .NET Framework Class Library

    ...

    So Many Timers, So Little Time
    Unfortunately, the FCL actually ships with several timers, and it is not clear to most programmers what makes each timer unique. Let me attempt to explain:
    System.Threading’s Timer class This is the timer discussed in the previous section, and it is the best timer to use when you want to perform periodic background tasks on a thread pool thread.
    System.Windows.Forms’s Timer class Constructing an instance of this class tells Windows to associate a timer with the calling thread (see the Win32 SetTimer function). When this timer goes off, Windows injects a timer message (WM_TIMER) into the thread’s message queue. The thread must execute a message pump that extracts these messages and dispatches them to the desired callback method. Notice that all of the work is done by just one thread—the thread that sets the timer is guaranteed to be the thread that executes the callback method. This also means that your timer method will not be executed by multiple threads concurrently.
    System.Windows.Threading’s DispatcherTimer class This class is the equivalent of the System.Windows.Forms’s Timer class for Silverlight and WPF applications.
    System.Timers’s Timer class This timer is basically a wrapper around System. Threading’s Timer class that causes the CLR to queue events into the thread pool when the timer comes due. The System.Timers.Timer class is derived from System. ComponentModel’s Component class, which allows these timer objects to be placed on a design surface in Visual Studio. Also, it exposes properties and events, allowing it to be used more easily from Visual Studio’s designer. This class was added to the FCL years ago while Microsoft was still sorting out the threading and timer stuff. This class probably should have been removed so that everyone would be using the System. Threading.Timer class instead. In fact, I never use the System.Timers.Timer class, and I’d discourage you from using it, too, unless you really want a timer on a design surface.



    راه دیگه هم استفاده از برنامه‌نویسی Multithread و System.Threading هست، امیدوارم حوصله مطالعه اش رو داشته باشید:
    Multithreaded Programming for Components with System.Threading (+)
    در مورد MicroTimer هم که در پست قبلی توضیح دادم.
    ممنون./

  10. #10
    کاربر تازه وارد
    تاریخ عضویت
    بهمن 1388
    محل زندگی
    تهران
    پست
    54

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    با تشکر از شما دوست عزیز؛ متاسفانه طبق صحبت شما این تایمرها در حد 1 میلی ثانیه جواب نمی دهند. در صورت امکان در مورد میکرو تایمر یک مثال windows form بزنید چون نتونستم راش بندازم. ممنون
    در ضمن یک سوال دیگه : چطور می تونیم برناممون رو با set priority به شکل real time تنظیم و اجرا کنیم.

  11. #11
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    44
    پست
    1,046

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    خواهش:
    نقل قول نوشته شده توسط majid zarei مشاهده تاپیک

    1. متاسفانه طبق صحبت شما این تایمرها در حد 1 میلی ثانیه جواب نمی دهند.
    2. در صورت امکان در مورد میکرو تایمر یک مثال windows form بزنید چون نتونستم راش بندازم.
    3. در ضمن یک سوال دیگه : چطور می تونیم برناممون رو با set priority به شکل real time تنظیم و اجرا کنیم.
    1. خوشبختانه ما چنین صحبتی نکردیم، میکروتایمر (به شرطی که کار زمان‌بری درون رویداد OnTimedEvent انجام ندین) با دقّت زیادی جوابگوی نیازهای میلی‌ثانیه‌ای شما هست، شما تو سیستم خودتون امتحان کنید، ببینید با چقدر خطا جواب می‌گیرید، در سیستم من 0.34 درصد (7 مورد از 2003 مورد) خطا داشت که هیچکدوم به 1 میلی ثانیه نرسیده بودند! (ضمیمه output پست قبلی‌ام)
    2. متاسفانه مثال windows form برای میکروتایمر نمیشه زد، چون هرنوع آپدیتی در فرم بیشتر از این مقدار زمان می‌بره و برنامه هنگ می‌کنه! البته کدی که به ذهنم میرسه رو من میذارم ولی به احتمال 99.99% کار نمی‌کنه:

      private void btnMicorTimer_Click(object sender, EventArgs e)
      {
      // Instantiate new MicroTimer
      MicroLibrary.MicroTimer microTimer = new MicroLibrary.MicroTimer();
      // Add event handler
      microTimer.MicroTimerElapsed +=
      new MicroLibrary.MicroTimer.MicroTimerElapsedEventHand ler(OnTimedEvent);

      // Call micro timer every 1000µs (1ms)
      microTimer.Interval = 1000;

      // Can choose to ignore event if late by Xµs (by default will try to catch up)
      // microTimer.IgnoreEventIfLateBy = 500;

      microTimer.Enabled = true; // Start timer

      // Do something whilst events happening, for demo sleep 2000ms (2sec)
      System.Threading.Thread.Sleep(500);

      microTimer.Enabled = false; // Stop timer
      }

      /// <summary>
      ///
      /// </summary>
      /// <param name="sender"></param>
      /// <param name="timerEventArgs"></param>
      private void OnTimedEvent(object sender,
      MicroLibrary.MicroTimerEventArgs timerEventArgs)
      {
      string response = string.Format(
      "Count = {0:#,0} Timer = {1:#,0} µs | " +
      "LateBy = {2:#,0} µs | ExecutionTime = {3:#,0} µs",
      timerEventArgs.TimerCount, timerEventArgs.ElapsedMicroseconds,
      timerEventArgs.TimerLateBy, timerEventArgs.CallbackFunctionExecutionTime);

      // Do something small that takes significantly less time than Interval
      if (listBox1.InvokeRequired)
      {
      Invoke(new MethodInvoker(
      delegate
      {
      listBox1.Items.Add(response);
      }));
      }
      else
      listBox1.Items.Add(response);
      }
      ضمناً چرا نتونستین راش بندازین؟ همون exe رو اجرا کنید و نتیجه رو ببینید.
    3. برای اینکار خطرناک‌ترین چیزی که ممکن بود به ذهن‌تون برسه همین هست! اولاً Real time به معنای واقعی در ویندوز نداریم و ثانیاً کافیه همچین کاری رو برای برنامه‌ای مثل میکروتایمر بکنید، بعدش پشیمونی دیگه فایده‌ای نداره! من توصیه اکید می‌کنم که از اینکار منصرف بشید ولی صلاح مملکت خویش خسروان دانند:


  12. #12
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    44
    پست
    1,046

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    نقل قول نوشته شده توسط Saeed_m_Farid مشاهده تاپیک
    متاسفانه مثال windows form برای میکروتایمر نمیشه زد، چون هرنوع آپدیتی در فرم بیشتر از این مقدار زمان می‌بره و برنامه هنگ می‌کنه! البته کدی که به ذهنم میرسه رو من میذارم ولی به احتمال 99.99% کار نمی‌کنه ...
    حرف خودم رو پس می‌گیرم! برنامه رو اینطوری تغییر دادم، کار کرد؛ شما هم امتحان کنید و نتیجه رو اینجا بذارید بیزحمت:

    private List<string> responses =
    new List<string>();

    private void btnMicorTimer_Click(object sender, EventArgs e)
    {
    MicroLibrary.MicroTimer microTimer = new MicroLibrary.MicroTimer();
    microTimer.MicroTimerElapsed +=
    new MicroLibrary.MicroTimer.MicroTimerElapsedEventHand ler(OnTimedEvent);

    microTimer.Interval = 1000;

    // microTimer.IgnoreEventIfLateBy = 500;

    microTimer.Enabled = true;

    // Do something whilst events happening, for demo sleep 2000ms (2sec)
    System.Threading.Thread.Sleep(2000);

    microTimer.Enabled = false;

    foreach (string item in responses)
    listBox1.Items.Add(item);
    }

    private void OnTimedEvent(object sender,
    MicroLibrary.MicroTimerEventArgs timerEventArgs)
    {
    responses.Add(string.Format(
    "Count = {0:#,0} Timer = {1:#,0} µs | " +
    "LateBy = {2:#,0} µs | ExecutionTime = {3:#,0} µs",
    timerEventArgs.TimerCount, timerEventArgs.ElapsedMicroseconds,
    timerEventArgs.TimerLateBy, timerEventArgs.CallbackFunctionExecutionTime));
    }

  13. #13
    کاربر تازه وارد
    تاریخ عضویت
    بهمن 1388
    محل زندگی
    تهران
    پست
    54

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    سلام مجدد. من هنوز مشکلم حل نشده. اما یک راه بدون حل به نظرم اومد : ایا می توان برنامه رو طوری نوشت که قبل از شروع ارسال real time ، بتونم داده ها رو در DMA بریزم و با تنظیم زمانی (یا...) برای کانال dma , عمل ارسال داده به پورت رو اون کانال DMA انجامش بده ؟
    از دوستانی که منو راهنمایی می کنند بسیار ممنونم.

  14. #14
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    44
    پست
    1,046

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    سلام
    منتظر دوستان شدم، گفتم الان میگین: آقا ما جواب شما رو نخوایم کی رو باید ببینیم! ولی دیگه دلم طاقت نیاورد
    نقل قول نوشته شده توسط majid zarei مشاهده تاپیک

    • من هنوز مشکلم حل نشده.
    • اما یک راه بدون حل به نظرم اومد : ایا می توان برنامه رو طوری نوشت که قبل از شروع ارسال real time ، بتونم داده ها رو در DMA بریزم و با تنظیم زمانی (یا...) برای کانال dma , عمل ارسال داده به پورت رو اون کانال DMA انجامش بده ؟
    • میشه بفرمائید چی هنوز حل نشده؟ یعنی حتی میکروتایمر جوابگوی نیاز شما نبود؟ مثال Windows Form خواستین که اونهم نوشتم براتون، دیگه مشکل چیه که ازش استفاده نمی کنید؟ تا اونجایی که یادم میاد خواسته شما این بود:
      مثلا وقتی که انتظار داشتم هر 5 میلی ثانیه داده روی پورت باشه
      و نتیجه ای که من براتون گذاشتم، به میزان بسیار زیادی دقیق تر از این خواسته شما بود :
      در سیستم من 0.34 درصد (7 مورد از 2003 مورد) خطا داشت که هیچکدوم به 1 میلی ثانیه نرسیده بودند!
      اگه بازم یه چیز دقیق تر می خواهید، اولاً برید سراغ زبانهای native، بعدش هم همانطورکه قبلاً هم خدمت تون عرض کردم، ویندوز سیستم عامل Real-time (یعنی RTOS) نیست...
    • چرا می زنین جاده خاکی؟! با DMA (+) می خواین چکار کنید؟ کرنل توسعه میدین؟ مشکلاتی که یک همچین سولوشنی رو غیرقابل قبول و بی معنی میکنه و حتی درصورت امکان چنین چیزی! ممکنه پروژه رو تحت الشعاع قرار بدن:


    1. اولاً با #C شدیداً برای کار مستقیم با چیپ ست های مادربرد مشکل خواهید داشت (اگه اصلاً بشه!) کار در یک زبان مدیریت شده (مثل #C) با Segment و Offset address و ... واقعاً بی معنی هست، فکر می کنید #C چقدر دست تون رو برای کار با pointer ها و کدهای unsafe باز میذاره؟
    2. ثانیاً گذشته از پیچیدگی بسیار زیاد (بررسی وضعیت سیستمی، درایور، Memory leak، عدم دسترسی و ...) در کار کردن با Direct Memory Access اصلاً نمیشه ارتباطی بین مشکل شما با کاربرد این چیپ ست برقرار کرد! مشکل شما در عدم توانایی (یا عدم نیاز / اولویت و ...) ویندوز در بکارگیری دقیق سیکل های پردازنده و بالطبع Real-Time نبودن این سیستم عامل هست، نه مشکل (سرعت کم) ارتباط پردازنده با حافظه که شما بخواین در این زمینه دنبال راه دیگه ای باشید...
    3. فرضاً چنین کاری رو با موفقیت انجام دادین (فرض کنیم من منظور شما رو در استفاده از DMA متوجه نشدم و شما با یک سری کدهای خرق عادت! با #C تونستین در حد کرنل کد بنویسید) در نهایت شما وقتی برنامه رو از حالت عادی خارج می کنید، درگیر مسائلی می شین که برای یک برنامه معمولیِ مدیریت شده، کاملاً حل شده هستند و برای شما یک کابوس! بعنوان مثال:
      • نصب نبودن راه انداز سخت افزاری مادربرد برای چیپ ست DMA (مثلاً Intel 8237 chip) در مقصد
      • درگیر بودن کانالهای DMA توسط پروسس / ماژول / درایور و ... دیگه
      • و مهمتر از همه: عدم داشتن دسترسی های مدیریتی لازم برای اینکار در سیستم مقصد، نسخه ویندوز، نسخه درایور و ...




    من نمیگم درایور نویس هستم ولی در زمینه کدهای مدیریت شده تازه کارم و بیشتر عمر کاری ام صرف برنامه های سیستمی شده و با کدهای native کار کردم، مشقّاتی که ممکن هست در چنین رویکردهایی باهاشون درگیر بشین (غیر از برنامه نویسی و بیشتر مسائل جانبی)، رو میدونم: نمونه اش این، که حل هم نشد و هنوز هم که هنوزه هروقت سیستم درست کار نمی کنه یا ... که ربطی به برنامه من نداره یا باید اون custom درایور رو حدف و مجدداً نصب کنند (که حضور فیزیکی پشتیبان ضروری هست، مثلاً زاهدان :"(( باید بره!) یا هزار تا بامبول باید دربیاریم که به ویندوز حالی کنیم بابا ریسورس ما رو خالی کن کارش داریم ...

  15. #15
    کاربر تازه وارد
    تاریخ عضویت
    بهمن 1388
    محل زندگی
    تهران
    پست
    54

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    ممنون از راهنمایی شما

  16. #16
    کاربر تازه وارد
    تاریخ عضویت
    بهمن 1388
    محل زندگی
    تهران
    پست
    54

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    با سلام ؛ متاسفانه روی فرم نتونستنم راش بندازم.
    سوال: برای اضافه کردن کلاس چه باید کرد؟

  17. #17
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    44
    پست
    1,046

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    نقل قول نوشته شده توسط majid zarei مشاهده تاپیک
    متاسفانه روی فرم نتونستنم راش بندازم.
    سوال: برای اضافه کردن کلاس چه باید کرد؟
    پست 12 رو با دقت بخونید، البته بی‌دقت هم بخونید چیز پیچیده‌ای نیست که نتونید راش بندازید! فقط کافیه یه Button و ListBox روی فرمتون بندازین، بعد: Copy / Paste

  18. #18
    کاربر تازه وارد
    تاریخ عضویت
    بهمن 1388
    محل زندگی
    تهران
    پست
    54

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    با سلام به همه دوستان و تشکر از آقای saeed_m_Farid
    به کمک راهنمایی شما دوستان من به جواب رسیدم. حال اگر کسی تمایل به دونستن ریز این پروژه داره؛ بگه تا رو سایت بزارم. اما خلاصش اینه که :
    ما یک برد سخت افزاری ساختیم که با یک پورت سریال به pc وصل میشه و یک کانال D2A 16bit که قادر هر خروجی ( که داده هاش از فایل خوانده میشه) تا حداکثر فرکانس 1000 هرتز رو درست کنه. دامنه خروجی از 10- تا 10+ هست. بعلاوه برد دارای 8 کانال A2D 16bit هست که با SampleRate حداقل 1 میلی ثانیه قادر به نمونه برداری می باشد . هسته برد یک میکرو PIC می باشد. و برنامه pc اون به زبان C#‎ 2008 نوشته شده است.
    ممنون از همه

  19. #19
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    44
    پست
    1,046

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    یعنی برد / پروژه شما هم Digital to Analog Converter هست هم برعکس؟ خوشم اومد از پروژه...
    چند تا سوال داشتم:

    • چه فرمت‌ / فایل هایی رو می‌تونید بخونید؟
    • با این مشخصات که شما می‌گین، فقط صداهای بم درمیاره! درسته؟
    • با چند Khz نمونه برداری می‌کنید؟
    • 16 بیت، استریو ضبط می‌کنید؟ چه خبره 8 کانال! حجم فایلها زیاد نمیشه؟
    • کنترلی روی quantization دارید یا نه؟
    • سخت افزار حدوداً چقدر واستون آب خورد؟ با این ICE-PIC5XL قابل مقایسه هست؟ اگه نه، برنامه دارین برین سمت همچین ماژولی؟
    • و کلی سوال دیگه که مثل همین‌ها جاشون اینجا نیست

  20. #20
    کاربر تازه وارد
    تاریخ عضویت
    بهمن 1388
    محل زندگی
    تهران
    پست
    54

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    سلام.
    بله همونطور که گفتید هم D2A هست و هم A2D که هر دو با دقت 16 bit هستن.
    نمونه برداری در صورتی که یک کانال داشته باشی : 1000 هرتز ؛ و برای 3 کانال نمونه برداری 500 هرتز به درستی جواب داده.
    در ضمن این کار برای یک تستر بوده و برای نمونه برداری از صدا نیست. در واقع برای شناسایی سیستم یک موتور است. کامند بهش بدیم و فیدبک بخونیم.
    8 کانال برای اینکه 2 کانال برای کار جمله قبل و یک کانال برای کالیبراسیون و بقیه رزرو.
    قیمت سخت افزار حدود : 600000 تومان
    و فعلا فرمت txt داده ذخیره می شند اما باید به فرمت mat. که فرمت Matlab هست در بیاد.

  21. #21
    کاربر دائمی آواتار Saeed_m_Farid
    تاریخ عضویت
    تیر 1386
    محل زندگی
    فضای تهی میان دیوارها
    سن
    44
    پست
    1,046

    نقل قول: ارسال داده به صورت زمان واقعی روی پورت سریال

    نقل قول نوشته شده توسط majid zarei مشاهده تاپیک
    در ضمن این کار برای یک تستر بوده و برای نمونه برداری از صدا نیست. در واقع برای شناسایی سیستم یک موتور است. کامند بهش بدیم و فیدبک بخونیم.
    آهان از اون لحاظ!

تاپیک های مشابه

  1. آنالیز داده ها در خارج از وقفه پورت سریال
    نوشته شده توسط smt1383 در بخش مباحث عمومی دلفی و پاسکال
    پاسخ: 4
    آخرین پست: یک شنبه 22 آذر 1388, 20:45 عصر
  2. ارسال Decimal روی پورت
    نوشته شده توسط programmable در بخش C#‎‎
    پاسخ: 3
    آخرین پست: جمعه 05 بهمن 1386, 01:03 صبح
  3. دریافت و ارسال اطلاعات روی پورت USB
    نوشته شده توسط مهدی رحیم زاده در بخش C#‎‎
    پاسخ: 3
    آخرین پست: چهارشنبه 19 اردیبهشت 1386, 11:29 صبح
  4. خواندن و نشتن روی پورت سریال
    نوشته شده توسط m7802z در بخش C#‎‎
    پاسخ: 2
    آخرین پست: دوشنبه 26 دی 1384, 21:55 عصر
  5. اسمبلی برای ارسال داده به پورت در xp کار نمی کنند
    نوشته شده توسط xmazdak در بخش برنامه نویسی در Delphi
    پاسخ: 4
    آخرین پست: چهارشنبه 01 تیر 1384, 01:22 صبح

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •