قسم الميكروكنترولر والروبوت ودوائر الاتصال بالحاسب الالي قسم المتحكمات الـ microcontroller و المعالجات microprocessor و التحكم الرقمي بالكمبيوتر CNC والانظمة الآلية والروبوت Robots

أدوات الموضوع

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 18-10-2013, 03:17 PM المشاركة 1   
افتراضي تجميع رسائل في رسالة واحدة Twitter FaceBook Google+



سلام عليكم
اذا كان لديك عدة رسائل وتريد ارسالها مرة واحدة فانت هنا تستخدم الامر strcat
ماذا يفعل هذا الامر يضيف رسالة جديدة الى رسالة سابقه
واليك مثال
كود:
// Compose Status SMS
unsigned ComposeMessage(char* Message){
  unsigned adc_value1, adc_value2;

  RC1IE_bit = 0;                // Disable Rx1 intterupts

  Message[0] = '\0';

  // SMS header
  strcat(Message, "INFO:");
  strcat(Message, "\r\n");      // Add new line (CR + LF)
  //

  // Add the status of Relays to the SMS Message
  if (Relay1)
   strcat(Message, "R1 - ON");
  else
   strcat(Message, "R1 - OFF");
  strcat(Message, "\r\n");      // Add new line (CR + LF)

  if (Relay2)
   strcat(Message, "R2 - ON");
  else
   strcat(Message, "R2 - OFF");
  strcat(Message, "\r\n");      // Add new line (CR + LF)

  if (Relay3)
   strcat(Message, "R3 - ON");
  else
   strcat(Message, "R3 - OFF");
  strcat(Message, "\r\n");      // Add new line (CR + LF)

  if (Relay4)
   strcat(Message, "R4 - ON");
  else
   strcat(Message, "R4 - OFF");
  strcat(Message, "\r\n");      // Add new line (CR + LF)
  //

  //
لو لاحظت المثال سوف ترى ان تم تعريف مصفوفة اسمها Message تم خزن فيها كلمة INFO بعدها اضيف اليها "\r\n" وهو يعني انتر وبداية سطر جديد بعدها خزنت "R1 - ON او R1 - OFF وهكذا بنهاية تصبح كل هذه معلومات في مصفوفة اسمها Message
طبعا عليك بتعريف Message في بداية مشروع وتحديد ابعادها حسب طول رسالة

بعدذلك اذا نريد ارسال كل هذه معلومات مرة واحدة
(uart1_write_text(Message

اعلانات

hunter27
:: مهندس جيد ::
تاريخ التسجيل: Jul 2012
الدولة: المغرب
المشاركات: 284
نشاط [ hunter27 ]
قوة السمعة:0
قديم 19-10-2013, 12:05 PM المشاركة 2   
افتراضي


السلام عليكم
موضوع رائع استاذي العزيز
لقد بحت عن هذا الامر لكن لم اوفق في استعماله
هل يمكنك ان تشرحه لنا اكثر
اتمنى لك التوفيق

اعلانات اضافية ( قم بتسجيل الدخول لاخفائها )
  

الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 19-10-2013, 02:43 PM المشاركة 3   
افتراضي


السلام عليكم
موضوع رائع استاذي العزيز
لقد بحت عن هذا الامر لكن لم اوفق في استعماله
هل يمكنك ان تشرحه لنا اكثر
اتمنى لك التوفيق
سلام عليكم
اخي كريم اذا كان لديك مجموعة من رسائل ولكن تريده ان ترسلها مرة واحدة ايضا لابد من خزنها في مصفوفه واحدة وبعدها ترسل الرسالة
الان كيف اجمع كل رسائل في رساله واحدة ؟
اثناء قرائتي للكود gsm خاص بشركة مايكروشيب وجدتهم استخدمو كود اعلاة
ولكن مارايك ان اعرض لك كود المستخدم في موضوع أخر ونشرحة وكود مستخدم لارسال لعلنا نصل الى نتيجة مرضية ومجربة عمليا
كود:
// Compose Status SMS
unsigned ComposeMessage(char* Message){
  unsigned adc_value1, adc_value2;
  char temp_txt[15];
  char PORTB_temp, i, PORTD_temp;

  RC1IE_bit = 0;                // Disable Rx1 intterupts

  Message[0] = '\0';

  // SMS header
  strcat(Message, "INFO:");
  strcat(Message, "\r\n");      // Add new line (CR + LF)
  //
  
  temp_txt[0] = 0;
  strcat(temp_txt, "PORTB ");
  PORTB_temp = Digital_INPUT;
  // Add the status of Digital Inputs to the SMS Message
  for (i = 0; i < 8; i ++){
    temp_txt[13 - i] = (PORTB_temp % 2) + 48;
    PORTB_temp = PORTB_temp / 2;
  }
  temp_txt[14] = 0;
  strcat(Message, temp_txt);
  strcat(Message, "\r\n");      // Add new line (CR + LF)*/
  //

  temp_txt[0] = 0;
  strcat(temp_txt, "PORTD ");
  PORTD_temp = Digital_O;
  // Add the status of Digital Inputs to the SMS Message
  for (i = 0; i < 8; i ++){
    temp_txt[13 - i] = (PORTD_temp % 2) + 48;
    PORTD_temp = PORTD_temp / 2;
  }
  temp_txt[14] = 0;
  strcat(Message, temp_txt);
  strcat(Message, "\r\n");      // Add new line (CR + LF)*/
  //

  // Adding ADC values to the SMS
  adc_value1 = ADC_Get_Sample(0);  // RA0
  WordToStr(adc_value1, ADC1_data);
  strcat(Message, "AN0 - ");  // AN1
  strcat(Message, ADC1_data); // Add ADC1 data
  strcat(Message, "\r\n");    // Add new line (CR + LF)
  //

  // SMS footer
  strcat(Message, "End.");
  strcat(Message, "\r\n");      // Add new line (CR + LF)
  //

  RC1IE_bit = 1;                // Enable Rx1 intterupts

  return strlen(Message);
}
الان نشرح الكود
عرف داله ترجع متغير اسماها ComposeMessage تاخذ متغير من نوع POINTER يعني مصفوفه
الان اريد اجمع كل معلومات في رسالة واحدة وهي message
كود:
strcat(Message, "INFO:");
هنا تم اضافه INFO: الى Message عن طريق الامر strcat
******************************************
ماهو الامر strcat صيغة العامة
كود:
char *strcat(char *to, char *from);
مثال توضيحي
كود:
char txt[] = "mikroElektronika";
char *res;
res = strcat(txt, "_test");
في مثال تم خزن رساله في txt وتم تعريف pointer اسمة res
بعدها وضعنا الامر( "res = strcat(txt, "_test
ماهي النتيجة mikroElektronika_test
*************************************************
نرجع للموضوع
بعدها تم اضافة
كود:
 strcat(Message, "\r\n");
ماذا تعني ذلك
تم الحاق هذه رسالة الى مصفوفة Message ويتم خزنها في اخر حرف وصلت اليها ولكن مهلا ماذا تعني هذه رسالة
الرمز \ يحول بعض حروف الى الاسكي كود يعني اذا كتبr \ معناها enter بدلا من ان ترسل رمز الاسكي كود 13 يعني انتر يمكن كتابه هذا الامر r\
n\ يعني خط جديد يعني بدلا من ارسل اسكي كود 10 اكتب هذا الامر

"\ هذا يعني ارسل علامة الاقتباس " بدلا من ارسال كود 0x22
ولمزيد من معلومات انظر الى هذه صوره ماخوذة من مايكروسي من help
على فكرة هذه رموز مهمة حتى نتمكن من تجميعها في رسالة واحدة بدلا من استخدام اوامر الارسال uart_write
************************************

بعدها ماذا فعل اضاف كل البيانات الى مصفوفة temp_txt
بعد ان اتنهى من ذلك اضافة بيانات هذه المصفوفة الى الى message
كود:
strcat(Message, temp_txt);
بعد ذلك اضاف الامر انتر وامر يكتب من سطر جديد
كود:
strcat(Message, "\r\n");
وهكذا

الى ان يصل الى
كود:
// Adding ADC values to the SMS
  adc_value1 = ADC_Get_Sample(0);  // RA0
  WordToStr(adc_value1, ADC1_data);
  strcat(Message, "AN0 - ");  // AN1
  strcat(Message, ADC1_data); // Add ADC1 data
  strcat(Message, "\r\n");    // Add new line (CR + LF)
  //
حيث يعرض محتويات AN0
وبعدها الحقها بمصفوفة message
وبعدها
كود:
  // SMS footer
  strcat(Message, "End.");
  strcat(Message, "\r\n");      // Add new line (CR + LF)
  //
اضاقة كلمة End الى الرسالة message

يعني خله كل البيانات التي تريده ارسالها في مصفوفة messge كانما كتبت انت رسالة في موبايل وتريد ارسالها هنا جمعنا كل البيانات حتى يستعد مايكرو لارسالها

للموضوع بقية ان شالله


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 19-10-2013, 03:00 PM المشاركة 4   
افتراضي


عفوا نسيت ارفع صورة
http://img02.arabsh.com/uploads/imag...43496df20d.png


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 19-10-2013, 03:22 PM المشاركة 5   
افتراضي


على فكرة هو عرف ابعاد مصفوفة في بداية المشروع
كود:
// SMS Message string
char SMS_Message[300];
وهذه هي دالة فرعية لارسال الرسالة
كود:
// Send status SMS to the cell phone number defined by the atc3 const string
void Send_Status(){
 ComposeMessage(SMS_Message);
 Send_Msg(SMS_Message);
}
(ComposeMessage(SMS_Message تم شرحها اعلاة وهي فيها تجميع رسائل تلاحظ ان SMS_Message هي نفسها Message والتي تم تعريفها اعلاة
بعدها ياتي الى تنفيذ الدالة
كود:
 Send_Msg(SMS_Message);
حيث تأمر مايكرو بأرسال رسالة

كود هذه دالة
كود:
// Send Status SMS
void Send_Msg(char* Msg){
  char atc[33];
  
  atc[0] = 0;                        // clear atc string
  strcat(atc, atc3);                 // atc3 command for sending messages
  strcat(atc, phone_number);         // add phone number
  strcat(atc, "\"");                 // complete AT command
  GM862_Send_Ram(atc);               // send AT command for SMS sending
  Wait_response(GSM_Ready_To_Receive_Message); // Wait for appropriate ready signal

  GM862_Send_Ram(Msg);               // Send message content
  UART_Wr_Ptr(0x1A);                 // Send CTRL + Z as end character
  UART_Wr_Ptr(0x0D);                 // Send CR
  Wait_response(GSM_OK);             // Wait OK as confirmation that the message was sent
}
مايهمنا الان هو كود بلون الاحمر
عندما يصل مايكرو الى ارسال رسالة بعد ان يتم أعطائة رقم هاتف تاتي بنهاية
الى هذه دالة

كود:
// Send command or data to the Telit GM862 Module - (RAM)
void GM862_Send_Ram(char *s1)   //
{
// Send command or data string
   while(*s1) {
    UART_Wr_Ptr(*s1++);
   }
// Terminatation by CR
   UART_Wr_Ptr(0x0D);
}
في هذا كود سيتم ارسال الرسالة ولكن لم افهم هذا الامر جديد الذي هو بلون احمر


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 19-10-2013, 05:38 PM المشاركة 6   
افتراضي


سلام عليكم
عندي ملاحظة مهمة
يجب اضافة هذا الامر عند بداية تجميع الرسالة
كود:
message[0]='\0';
لماذا لانة في بداية خزن الرسالة في مصفوفة message ولكن في مرة الثانية سيضيف الى بيانات الرسالة مخزونة في message ولكن انا اريدة يبدأ من البداية فماذا أفعل ؟
كود:
message[0]='\0';
ملاحظة 2 يمكن أستخدام الامر الارسال (uart1_write_text(message

ولتوضيح الموضوع أعلاة
اكتبت هذا كود البسيط
كود:
char send[60];
void message(char *txt);
char uart_rd , x=0 , y=0;
char bb[]="how are you?";
char vv[]=" fine";
char output[5];
void interrupt()
{
 if (UART1_Data_Ready()) {     // If data is received,
     uart_rd = UART1_Read();     // read the received data,
      output[x]=uart_rd;
      x++;
    }
 }
void main() {
  RCIE_bit = 1;                      // enable interrupt on UART1 receive
  TXIE_bit = 0;                      // disable interrupt on UART1 transmit
  PEIE_bit = 1;                      // enable peripheral interrupts
  GIE_bit = 1;                       // enable all interrupts
  ANSELC = 0;                     // Configure PORTC pins as digital
   ANSELd = 0;                     // Configure PORTd pins as digital
   trisd=0;
   portd=0;
  UART1_Init(9600);               // Initialize UART module at 9600 bps
  Delay_ms(100);                  // Wait for UART module to stabilize

  UART1_Write_Text("Start");
  UART1_Write(13);
  UART1_Write(10);

  while (1)
  {                     // Endless loop

  if(x==5)
     {
       if(output[0]=='h' && output[1]=='a' && output[2]=='s' && output[3]=='a' && output[4]=='n')   //hasan
       //if( uart_rd=='a')
           {
             portd=0xaa;
            message(send);
           UART1_Write_Text(send);
             portd=0;
             delay_ms(1000);

            }
       else {
              UART1_Write_Text("NO");

             }
       x=0;
       UART1_Write_Text("\n\r");
     }
  }
}

void message(char*txt)
{
 txt[0]='\0';
  strcat(txt,"what your name?");
  strcat(txt,"hasan hadi");
  strcat(txt, "\r\n");      // Add new line (CR + LF)
  strcat(txt,bb);
  strcat(txt,vv);
}
في هذا كود اذا ارسلت كلمة hasan يرسلي رسالة مرة واحدة كما في صورة
http://img02.arabsh.com/uploads/imag...434e65f305.png

وهذا هو مثال
http://arabsh.com/files/0c36444e65f4/uart_test-rar.html


الصورة الرمزية حسن هادي محمود
حسن هادي محمود
:: عضو ذهبي ::
تاريخ التسجيل: Sep 2012
الدولة: العراق /البصره
المشاركات: 2,688
نشاط [ حسن هادي محمود ]
قوة السمعة:136
قديم 19-10-2013, 05:50 PM المشاركة 7   
افتراضي


هو فعلا أضاف الامر
كود:
message[0]='\0';
في كود الخاص بمايكروشيب

وايضا لو يتم ملاحظة في كود يجد ان تعامل مع
كود:
temp_txt[0] = 0;
لان أستخدم فيها الامر strcat
ولكن لم أفهم هذا الامر
كود:
temp_txt[14] = 0;


hunter27
:: مهندس جيد ::
تاريخ التسجيل: Jul 2012
الدولة: المغرب
المشاركات: 284
نشاط [ hunter27 ]
قوة السمعة:0
قديم 19-10-2013, 06:36 PM المشاركة 8   
افتراضي


ماشاء الله عليك
على حسب مافهمت
Function appends a copy of the string from to the string to, overwriting the null character at the end of to.
لكي تضيف الى الرسالة كلمة اخرى يجب ان يكون اخر حرف من هذه الرسالة هو 0

إضافة رد

العلامات المرجعية

«     الموضوع السابق       الموضوع التالي    »
أدوات الموضوع

الانتقال السريع إلى


الساعة معتمدة بتوقيت جرينتش +3 الساعة الآن: 04:34 PM
موقع القرية الالكترونية غير مسؤول عن أي اتفاق تجاري أو تعاوني بين الأعضاء
فعلى كل شخص تحمل مسئولية نفسه إتجاه مايقوم به من بيع وشراء وإتفاق وأعطاء معلومات موقعه
التعليقات المنشورة لا تعبر عن رأي موقع القرية الالكترونية ولايتحمل الموقع أي مسؤولية قانونية حيال ذلك (ويتحمل كاتبها مسؤولية النشر)

Powered by vBulletin® Version 3.8.6, Copyright ©2000 - 2025