اطلاعیه

Collapse
No announcement yet.

مشکل ارسال غلط اطلاعات به وسیله سریال میکرو

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    مشکل ارسال غلط اطلاعات به وسیله سریال میکرو

    سلام دوستان خسته نباشین
    من به یه مشکلی برخوردم که کلی درگیرم کرده،3 روز تمام درگیر رفعشم ولی نمیدونم چرا نمیشه
    این پروژه ایه که قرار به عنوان کنترل ورود و خروج اماکنی مثل پارکینگها استفاده بشه،داخلش از ماژولهای معمول RFID استفاده شده
    برای همین برای هر کاربر اطلاعاتی درنظر گرفته شده که در حافظه EEPROM خارجی ذخیره میشه،اطلاعاتی مثل سریال تگ RFID کاربر،نام و نام خانوادگی و ....
    مشکل اینجاست که وقتی اطلاعات ذخیره شده در حافظه رو شروع میکنیم به خوندن و میریزمشون تو متغیرهای خودشون،ینی مثلن نامی که در EEPROM ذخیره شده بیاد در متغیری به نام name ذخیره بشه،به همین ترتیب تا آخر تا همه اطلاعات خونده و به داخل میکرو بیاد تا رورشون پردازش بشه.
    من وقتی میام چک کنم ک ببینم این اطلاعات به طور صحیح خونده شده یا نه،ینی اینکه متغیر name مقدار درست نام کاربرو گرفته یا نه،میبینم که اینطور نیست
    روش چک کردنم اینه که بعد ازهر بار که کامل اطلاعات از EEPROM خونده شد،تمام متغیر هایی که مقدار گرفتن رو با دستور

    printf("%s",variable);


    میفرستم رو سریال میکرو که ببینم چی تو هر متغیر ذخیره شده و با مقداری که باید باشه برابره یا نه،ولی علاوه بر چیزی که باید باشه کاراکترهای اضافیم همراش میاد. ینی بخام مثال بزنم فرض کنید داخل اون آدرسهایی از EEPROM که قراره نام کاربر ذخیره بشه، مقدار رشته "ardeshir" ریخته شده،بعد از خوندن این آدرسها و ریختنشون تو متغیر name ، وقتی که با این دستور
    printf("name : %s",name);
    محتویات name رو پرینت میگیریم خروجی اینه :
    کد HTML:
    name : ardeshirhjshf
    ینی متغیر چیزای اضافیم داخلش ذخیره شده!
    چیزی که من حدس میزنم اینه که شاید چون در طول برنامه از توابع سریال زیاد استفاده میشه،باعث میشه اطلاعات توی بافر سریال با چیزی که قراره بیاد تو خروجی ترکیب بشه و خروجی رو خراب کنه...
    یه چیز دگ هم اینه که شاید همین مشکل برای بافر ارتباط دوسیمه I2C که برای ارتباط با EEPROM استفاده شده وجود داشته باشه.
    خیلی اطلاعات هس که بخام براتون از از این پروژه بزارم که باعث میشه پست خیلی طولانی بشه،برای همین ازتون خواهش میکنم که هرجایی از کد رو که خواستین بگین تا بزارم،تمومش هست مثله نحوه خوندن نوشتن از EEPROM، نحوه آدرس دهی ، جداسازی اطلاعات مفید از غیر مفید یا هرچیزی که میخواین....
    علی الحساب اون مهمارو میزارم

    توابع خواندن و نوشتن از EEPROM از طریق رابط I2C :

    unsigned char eeprom_read(char haddress, char laddress)
    {
    unsigned char data;
    i2c_start();
    i2c_write(EEPROM_BUS_ADDRESS_W);
    i2c_write(haddress); //high byte address
    i2c_write(laddress); //low byte address
    i2c_start();
    i2c_write(EEPROM_BUS_ADDRESS_R);
    data=i2c_read(0);
    i2c_stop();
    led_red=1;
    delay_ms(10);
    led_red=0;
    return data;


    }


    void eeprom_write(unsigned char haddress, unsigned char laddress, unsigned char data)
    {
    i2c_start();
    i2c_write(EEPROM_BUS_ADDRESS_W);
    i2c_write(haddress); //high byte address
    i2c_write(laddress); //low byte address
    i2c_write(data);
    i2c_stop();
    led_red=1;
    delay_ms(10);
    led_red=0;
    }


    روش ریختن اطلاعات در متغیر مربوط به خودش :


    for(i=0;i<=63;i++)
    {
    data[i]=eeprom_read(((current_user-1)/4)+1,((current_user-1)%4)*data_len+i);
    }
    for(i=0;i<=63;i++)
    {
    if((i>=0)&&(i<=15))
    {
    card[i]=data[i];
    }
    else if((i>=16)&&(i<=25))
    {
    fname[i-16]=data[i];
    }
    else if((i>=26)&&(i<=35))
    {
    lname[i-26]=data[i];
    }
    else if((i>=36)&&(i<=41))
    {
    fdate[i-36]=data[i];
    }
    else if((i>=42)&&(i<=47))
    {
    ftime[i-42]=data[i];
    }
    else if((i>=48)&&(i<=53))
    {
    ldate[i-48]=data[i];
    }
    else if((i>=54)&&(i<=59))
    {
    ltime[i-54]=data[i];
    }
    else if(i==60)
    {
    allowed[0]=data[i];
    }
    else if(i==61)
    {
    entered[0]=data[i];
    }
    else if(i==62)
    {
    credit=data[i];
    }
    else if(i==63)
    {
    credit+=data[i];
    status=1;
    }
    }



    اینم توضیحاتی برای متغیرها و توابع: (بعضیاشون تو این کدا نیس)

    data[64] defination :
    0 to 15 > card serial characters
    16 to 21 > date of registered in yymmdd format
    22 to 27 > time of registered in hhmmss format
    28 to 33 > date of last enterance in yymmdd format
    34 to 39 > time of last enterance in hhmmss format
    40 to 49 > first name maximum in 10 charecters
    50 to 59 > last name maximum in 10 characters
    60 > did user enter? 1 for yes , 0 for no
    61 > does user allow to access? 1 for yes , 0 for no
    62 >
    63 >


    -----------------------------------------------------------
    rcvd_code :
    data received by serial port transmitted by RFID or PC Interface


    --------------------------------------------------------------------------------
    adrd_mem_ h :
    high byte address value that addressed in last time

    adrd_mem_l :
    low byte address value that addressed in last time

    ----------------------------------------------------------------------------
    eeprom_read(haddress,laddress) :
    read data from in haddress and laddress that contained low and high byte of an address

    eeprom_write(haddress,laddress,data) :
    write data in haddress and laddress that contained low and high byte of an address
    data value have't be larger than a byte of size.

    -------------------------------------------------------------------------------------
    check_mem() :
    function read basic info about last address used(addrd_mem_h,addrd_mem_l),number of saved users(saved_user_count),number of entered users(exist_user)

    -----------------------------------------------------------------------------------------
    current_user :
    contained number of current user who veriffied and accessed.


    دلیل اینکه حلقه 64 بار تکرار میشه اینه که کل اطلاعات برای هر کاربر 64 کاراکتره که پشت سر هم ذخیره شده،برای همینم پشت سرهم خونده میشه و در آرایه 64 کاراکتریه data ذخیره و بعد از اون داخل متغیرهای دگ خرد میشه.
    خب دوستان پیشتر از راهنماییهاتون تشکر میکنم و امیدوارم که بتونیم مشکل و متوجه و رفعش کنیم...واقن دگ اشکمو داره در میاره

    #2
    پاسخ : مشکل ارسال غلط اطلاعات به وسیله سریال میکرو

    رشته ها باید آخرشون حتما کاراکتر null داشته باشن. آیا این مورد رو لحاظ کردین؟
    If the wind will not serve, take to the oars

    دیدگاه


      #3
      پاسخ : مشکل ارسال غلط اطلاعات به وسیله سریال میکرو

      دوست گرامی سلام

      اگه برای ارتباط برقرار کردن با ماژول از پروتکل سریال استفاده میکنی بهتره که از سریال نرم افزاری استفاده کنی
      یعنی پورت سریال رو بصورت نرم افزاری کانفیگ کن
      منم قبلا چنین مشکلی رو البته با یه فرستنده گیرنده داشتم و اینطوری حلش کردم
      ! Life doesn't get easier , you just get stronger

      دیدگاه


        #4
        پاسخ : مشکل ارسال غلط اطلاعات به وسیله سریال میکرو

        نوشته اصلی توسط Amirlopez نمایش پست ها
        عنی پورت سریال رو بصورت نرم افزاری کانفیگ کن
        مرسی از جوابت
        من سریال نرم افزاری بلد نیستم میشه بگی چطور باید این کارو کرد؟

        دیدگاه


          #5
          پاسخ : مشکل ارسال غلط اطلاعات به وسیله سریال میکرو

          سلام

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

          این مشکل رو خود من بارها در پست های مختلف به افراد مختلف گوشزد کردم

          رشته یا استرینگ چیزی نیست جز یک آرایه از Char که اخرش حتما باید به 0 ختم شه(همون طور که دوستمون در بالا گفتن NULL هم میگن بهش که همون 0 هست)
          هیچ جادو یا مکانیزم دیگه ای هم وجود نداره که آخر رشته شما پیداش شه، نه طولی و نه چیز دیگه
          خب اصلا چرا رشته؟
          در کل شما فقط با یه چیز طرفی اونم کار با آرایه هست، که روش ها و توابع خاص خودشو داره، اما اگه حالت خاصی از آرایه رو در نظر بگیریم، اونوقت میشه یک سری ساده سازی کرد و توابع خاصی رو برای منظور های خاص نوشت، اما این باعث نمیشه رشته دیگه آرایه نباشه، حالت خاصه فقط
          این توابع ساده شده و خاص که گفتم همون توابع کار با رشته هستن
          مثل Printf، یا strcmp و ...
          شما هر جا خواستی از این توابع استفاده کنی حتما و حتما باید از یک شرط پیروی کنی
          ارایه شما فقط و فقط باید یک 0 داشته باشه اونم تو آخر رشته شما هست.
          چرا که توابع رشته فقط و فقط با اون 0 میتونن بفهمن که آخر رشته کجاست،اگه رعایت نکنی همینطور تو حافظه جلو میرن تا به یه 0 برسن، دلیل کاراکتر های اضافه شما هم همینه
          برای حل مشکل برای تعریف رشته اگه باید طول آرایه یکی بیشتر از طول رشته باشه و آخری رو 0 بذاری
          The healthy human mind doesn&#039;t wake up in the morning thinking this is his last day on earth.

          دیدگاه


            #6
            پاسخ : مشکل ارسال غلط اطلاعات به وسیله سریال میکرو

            نوشته اصلی توسط ASHIT AXAR نمایش پست ها
            رشته ها باید آخرشون حتما کاراکتر null داشته باشن. آیا این مورد رو لحاظ کردین؟
            ممنون از جوابی که دادی
            اگه منظورت برای ارسال به سریال به این صورته :


            printf("name : %s\0",name);

            نه بازم خروجی اشتباس!

            دیدگاه


              #7
              پاسخ : مشکل ارسال غلط اطلاعات به وسیله سریال میکرو

              نوشته اصلی توسط ardeshir74 نمایش پست ها
              ممنون از جوابی که دادی
              اگه منظورت برای ارسال به سریال به این صورته :


              printf("name : %s\0",name);

              نه بازم خروجی اشتباس!
              اینو باید هنگامی که می خواستید رشته رو مقدار دهی کنید انجام میدادین. (در انتهای خود متغییر name )
              برای اینکار به انتهای متغیر name و در آخرین خانه آرایه عدد 0 یا کاراکتر '0\' رو قرار بدین.
              If the wind will not serve, take to the oars

              دیدگاه


                #8
                پاسخ : مشکل ارسال غلط اطلاعات به وسیله سریال میکرو

                نوشته اصلی توسط ASHIT AXAR نمایش پست ها
                اینو باید هنگامی که می خواستید رشته رو مقدار دهی کنید انجام میدادین. (در انتهای خود متغییر name )
                برای اینکار به انتهای متغیر name و در آخرین خانه آرایه عدد 0 یا کاراکتر '0\' رو قرار بدین.
                چون تموم متغیرهام از نوع آرایه هستن،پس تعداد خونه هاشونو یدونه زیاد میکنم که خونه آخر همیشه "0\" باشه،درست متوجه شدم؟

                دیدگاه


                  #9
                  پاسخ : مشکل ارسال غلط اطلاعات به وسیله سریال میکرو

                  سلام
                  این درسترشه
                  printf("name : %s\r\n",name);


                  امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                  دیدگاه


                    #10
                    پاسخ : مشکل ارسال غلط اطلاعات به وسیله سریال میکرو

                    نوشته اصلی توسط mahdi8866 نمایش پست ها
                    printf("name : %s\r\n",name);
                    با ریترن کاراکتر فقط بعد از چاپ میره سطر بعدی،در صورتی که اطلاعات اضافی همچنان تو متخیر هستند.
                    یه چیزی که جالبتره اینه که متخیر name آرایه 10 خونه ایه،ولی بعضی وقتا چیزی که چاپ میشه خیلی میشتر از 10 کاراکتره،حتی اگه مقدار دهیم اشتبا باشه چطور میشه که بیش از ظرفیتش مقدار میگیره!

                    دیدگاه


                      #11
                      پاسخ : مشکل ارسال غلط اطلاعات به وسیله سریال میکرو

                      نوشته اصلی توسط ardeshir74 نمایش پست ها
                      چون تموم متغیرهام از نوع آرایه هستن،پس تعداد خونه هاشونو یدونه زیاد میکنم که خونه آخر همیشه "0\" باشه،درست متوجه شدم؟
                      همینطوره. هنگام مقدار دهی به رشته در آخرین خانه آرایه عدد 0 یا کاراکتر '0\' رو قرار بدین.

                      دلیل: ادغام دو پست برای جلوگیری از اسپم

                      نوشته اصلی توسط ardeshir74 نمایش پست ها
                      با ریترن کاراکتر فقط بعد از چاپ میره سطر بعدی،در صورتی که اطلاعات اضافی همچنان تو متخیر هستند.
                      یه چیزی که جالبتره اینه که متخیر name آرایه 10 خونه ایه،ولی بعضی وقتا چیزی که چاپ میشه خیلی میشتر از 10 کاراکتره،حتی اگه مقدار دهیم اشتبا باشه چطور میشه که بیش از ظرفیتش مقدار میگیره!
                      توابع نمایش تا زمانی که به کاراکتر null برسن همه کاراکترهای سر راه رو چاپ میکنن.
                      البته توی منطق برنامه تون اجباری نیست که کاراکتر تهی رو حتما داشته باشید (البته برای اینکار باید اندازه آرایه رو داشته باشید اونوقت میتونید پیش از فرایند پردازش و نمایش اون رو اضافه کنید. با این کار میتونید کمی فضای ذخیره سازی رو بیشتر کنید اگه برای کار شما ارزشش رو داشته باشه وگرنه نمی ارزه)
                      If the wind will not serve, take to the oars

                      دیدگاه


                        #12
                        پاسخ : مشکل ارسال غلط اطلاعات به وسیله سریال میکرو

                        سلام
                        ببخشید فقط n بنویس
                        مثلا اگر متغیر شما 10 اریه ای باشه رشته ای که اگه دریافت کنه 13 کارکتر باشه اون 3 کارکتری اضافی برمیگرده جای 3 کارتر اولی رو میگیره و در دریافت رشته بعدی از 3 تا ارایه ببعد پر میکنه یه آش میشه که همه چی توش هست
                        امام مهدی(عج): اگر شیعیان ما ، که خداوند طاعتشان دهد. در عهد ما وفادار و همدل بودند، هرگز دیدار ما (ظهور) به تاخیر نمی افتاد.(کدام عهد ؟)

                        دیدگاه


                          #13
                          پاسخ : مشکل ارسال غلط اطلاعات به وسیله سریال میکرو

                          خیلی خیلی ممنون از همه دوستانی که کمک کردن
                          مشکلم رفع شد به این صورت که یه خونه به آرایه هام اضافه کردم و خونه آخر رو Null یا همون "0\" قرار دادم.دگ توی خروجی کاراکترهای بی معنی ظاهر نشد
                          بازم مرسی از همتون،لطف بزرگی کردین
                          ایشالا برای جبران وقتی پروژه کامل شد و تونستم راش بندازم تمام جزییاتشو میزارم تو انجمن تا همه استفاده کنن.

                          دیدگاه

                          لطفا صبر کنید...
                          X