انجمن‌های فارسی اوبونتو

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید

نویسنده موضوع: حل شد read serial PORT  (دفعات بازدید: 2035 بار)

0 کاربر و 2 مهمان درحال مشاهده موضوع.

آفلاین hamed_ubuntu

  • Sr. Member
  • *
  • ارسال: 251
  • جنسیت : پسر
  • linuxforlife.ir
    • لینوکس برای زندگی
حل شد read serial PORT
« : 02 اردیبهشت 1392، 09:40 ب‌ظ »
با سلام
من یه بورد الکترونیکی دارم که ۵ بسته اطلاعات به صورت سریال ارسال میکنه و هر ۶۰ ثانیه این اطلاعات ۳۰۰ بار ارسال میشن.
شکل بسته های ارسالی هم بدین گونه می باشد.
0x16/0x82/0xA8/0xA5/0xE5
چون این اطلاعات متغییر هستن و مدام عوض میشن باید یه برنامه ای بنویسم که اطلاعات دریافتی رو آنلاین چک کنه.از برنامه زیر و تعداد بسیار زیادی برنامه ی آماده استفاده کردم اما اون چیزی که میخوام نشد.
این برنامه :

        printf("Start\n");

        int fd, res;
        struct termios oldtio,newtio;
        char buf[255];

        fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );
        if (fd <0) {
            printf("Failed to open %s", MODEMDEVICE);
        } // if

        else {
            printf("Port Opened\n");
            tcgetattr(fd,&oldtio); /* save current port settings */
            bzero(&newtio, sizeof(newtio));
            newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
            newtio.c_iflag = IGNPAR;
            newtio.c_oflag = 0;

            // set input mode (non-canonical, no echo,...) */
            newtio.c_lflag = 0;
            newtio.c_cc[VTIME]    = 0;   /* inter-character timer unused */
            newtio.c_cc[VMIN]     = 5;   /* blocking read until 5 chars received */
            tcflush(fd, TCIFLUSH);
            tcsetattr(fd,TCSANOW,&newtio);

            res = read(fd,buf,255);   /* returns after 5 chars have been input */
            buf[res]=0;               /* so we can printf... */
            printf("Input: %X\n", buf);
            tcsetattr(fd,TCSANOW,&oldtio);
        } // else */
        printf("Done\n");
الان کدی هم که این برنامه یا سایر برنامه هایی که تست کردم به شکل bf3d78ead7 و... هستند که هر بار کامپایل مجدد میکنم کدها تغییر میکنن.

که کلا اشتباهه چون من کدها رو از طریق برنامه cutecom و serial port terminal کاملا منظم و بدون تغییر دریافت میکنم.

از دوستان کسی میتونه این کد رو تغییراتی بده.
زبان برنامه نویسیم سی هستش
کامپایلر  gcc
محیط کد نویسی هم کد بلاکس
سرعت ارسال سریال هم ۱۱۵۲۰۰
از /dev/ttyUSB0 اطلاعات رو میگیرم

« آخرین ویرایش: 04 اردیبهشت 1392، 11:23 ق‌ظ توسط hamed_ubuntu »
تا میتونم باید تلاش کنم.همین

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19722
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
پاسخ : ؟read serial PORT
« پاسخ #1 : 02 اردیبهشت 1392، 11:19 ب‌ظ »
این برد سایتی چیزی نداره که توش کتاب‌خونه‌ی مخصوصش رو گذاشته باشه یا توضیحی در موردش داده باشه؟
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن

آفلاین hamed_ubuntu

  • Sr. Member
  • *
  • ارسال: 251
  • جنسیت : پسر
  • linuxforlife.ir
    • لینوکس برای زندگی
پاسخ : ؟read serial PORT
« پاسخ #2 : 02 اردیبهشت 1392، 11:57 ب‌ظ »
یه برنامه هم تحت ویژوال پیدا کردم برا گامباس
که برای دریافت اطلاعات پورت سریال هست
اینم کد ولی ندونستم کجای گامباس باید بنویسمش و ببینمش
PRIVATE SComm AS SerialPort CONST None AS Integer = 0

PRIVATE Rx AS String  PUBLIC SUB Form_Open()
SComm = NEW SerialPort AS "SComm"
SComm.PortName = "/dev/ttyUSB0"
SComm.Speed = "19200"
SComm.Parity = 0
SComm.DataBits = "8"
SComm.StopBits = "1"
SComm.FlowControl = 0
TRY
SComm.Open()

IF ERROR THEN

TRY
SComm.PortName = "/dev/ttyS0"
SComm.Speed = "19200"
SComm.Parity = 0
SComm.DataBits = "8"
SComm.StopBits = "1"
SComm .FlowControl = 0

SComm.Open()

  IF ERROR THEN   
Message("No Serial Come Exiting...")
QUIT
ENDIF 

ENDIF

END  'Private RX

'******** Incoming serial data ********
PUBLIC SUB SComm _Read()
SLEEP 0.025
TRY READ #SComm , Rx, Lof(SComm )
IF ERROR THEN
Message.info(No received data!)
ENDIF

IF Len(Rx) > 8 THEN
TextBox1.Text= Cstr(Rx)
END IF

END

PUBLIC SUB Form_Close()
SComm.Close()
QUIT
END
[code]
« آخرین ویرایش: 03 اردیبهشت 1392، 12:20 ق‌ظ توسط hamed_ubuntu »
تا میتونم باید تلاش کنم.همین

آفلاین hamed_ubuntu

  • Sr. Member
  • *
  • ارسال: 251
  • جنسیت : پسر
  • linuxforlife.ir
    • لینوکس برای زندگی
پاسخ : ؟read serial PORT
« پاسخ #3 : 03 اردیبهشت 1392، 12:12 ق‌ظ »
اسم برد S3c2240 هست
بعدشم توی کاتالوگی که ازش دارم این کد ها رو نوشته :


[left]
[left]void decode_data(void)
{
while (!((val = getccb()) & 0x80));
if (val & 0x40)
printf(“!Puls!”);
/* wait for sync bit */
/* puls trigger active */
y = getccb(); /* get plethysmogram sample */
val = getccb(); /* get pulse bar sample */
puls_hbit = (val & 0x80)?1:0; /* store bit 7 of pulse */
bar_graph = val & 0x0F; /* store bar_graph value */
printf(“Puls %03u”,0x80*puls_hbit + getccb()); */
    /* print pulse
printf(“SpO2 %03u”,getccb()); */
/* print spo2
}
/* getccb() returns the next serial value from a queue that gets filled during the PC ́s
serial interrupt */
[b]Turbo C example for decoding of data protocol[/b] 1[/left]
« آخرین ویرایش: 03 اردیبهشت 1392، 12:25 ق‌ظ توسط hamed_ubuntu »
تا میتونم باید تلاش کنم.همین

آفلاین hamed_ubuntu

  • Sr. Member
  • *
  • ارسال: 251
  • جنسیت : پسر
  • linuxforlife.ir
    • لینوکس برای زندگی
پاسخ : ؟read serial PORT
« پاسخ #4 : 03 اردیبهشت 1392، 12:27 ق‌ظ »

اینم یه کد دیگه که توی کاتالوگش هست:

/* getccb() returns the next serial value from a queue that gets filled during the PC ́s serial interrupt */
while (1)
{
if ((val=getccb()) == 0xF8)
{
while((val=getccb()) < 0xF0)
{
/* here "val" always contains a new plethysmogram sample
/* process it acccording to your needs .........
}
}
switch(val)
/* now val contains a marker that means that the next byte is a special value
{
case 0xF9:
printf(”%02u”,getccb());
/* print SpO2
break;
case 0xFA:
printf(”%03u”,(unsigned char)getccb());
/* print pulse
break;
case 0xFB:
switch(getccb())
{
case 0: gotoxy(20,23);
printf(“
OK !
“);
/* print messages
break;
case 1: gotoxy(20,23);
printf(“ No sensor connected ! “);
break;
case 2: gotoxy(20,23);
printf(“ No finger in probe !
“);
break;
case 3: gotoxy(20,23);
printf(“ Low perfusion
!
“);
break;
}
break;
case 0xFC:
val = getccb();
printf(”%02u”,getccb());
/* print signal strength */
break;
}
}
data byte data *rcvptr;
data byte Oxval;
data byte Oxgraph;
data byte Oxpuls;
data byte Oxinfo;
data byte Oxqual;
data bit Tbit;
data byte Serval;
void serial_int() interrupt 4 using 2
{
if (TI) /* transmitter int ? */
{
TI = 0;
Tbit = TRUE;
return;
}
/* nothing to do */
RI = 0; /* else must be receiver int */
Serval = SBUF;
if (Serval > 0xF5)
{
switch (Serval)
{
case 0xF8:
rcvptr = &Oxgraph;
return;
case 0xF9: rcvptr = &Oxval;
return;
case 0xFA: rcvptr = &Oxpuls;
return;
case 0xFB: rcvptr = &Oxinfo;
return;
case 0xFC: rcvptr = &Oxqual;
return;
default : return;
}
}
else
*rcvptr = Serval;
}
return;
}
/* get value from serial buffer register */
/* is it a code ?
*/
/* yes */
/* next time get ox curve */
/* next byte is get ox value */
/* next byte is puls value */
/* next byte is ox info */
/* next byte is quality information */
/* byte is no code, so store it where pointer points */


[/left]
[code]
تا میتونم باید تلاش کنم.همین

آفلاین hamed_ubuntu

  • Sr. Member
  • *
  • ارسال: 251
  • جنسیت : پسر
  • linuxforlife.ir
    • لینوکس برای زندگی
پاسخ : ؟read serial PORT
« پاسخ #5 : 03 اردیبهشت 1392، 12:24 ب‌ظ »
با سلام
آقا مگه ما چقدر باید ذهنمون بسته یاشه!!واقعا من توی این تاپیک خیلی آدم ها رو دیدم که مشکلاتی داشتن که حالا یا حل شده یا باقی مونده.
مگه این قانون نرم افزارهای آزاد نیست؟
لطفا مطالعه فرمایید!(منبع ویکی پدیا)

///////////////////////////////////////////////////////////////////////////////////
نرم‌افزار آزاد نرم‌افزاری است که می‌توان آن را آزادانه و بدون محدودیت، به هر منظور استفاده کرد، مطالعه و بررسی نمود، و تغییر داد. همچنین کپی کردن یا توزیع مجدد (خواه بدون تغییر و خواه باتغییراتی در نرم‌افزار) آزاد و بدون محدودیت یا با محدودیت بسیار کمی (تنها برای اطمینان از اینکه دریافت کنندگان بعدی نرم‌افزار نیز از این آزادی‌ها بهره‌مند می‌شوند یا تولیدکنندگان سخت‌افزارهایی که سروکار سخت‌افزار با مصرف‌کننده‌است به کاربران اجازهٔ ایجاد تغییر در سخت‌افزارشان را بدهند) است. نرم‌افزارهای آزاد عموما رایگان هستند اما می‌توانند دارای قیمت هم باشند مثلا برای هزینه تولید CD و دیگر اَشکال توزیع آن.
///////////////////////////////////////////////////////////////////////////////////
خوب من مشکلم حل شد اما به طریقی دیگر!
من نرم افزاری که پورت سریال رو باهاش میخوندم و توی لینوکسم نصب بود به کل رفتم سورس کدشو گرفتم و دارم تغییراتی روی نرم افزار میدم که نتیجش مثبت و رو به پیشرفته.ممنون از دوستان گلم.
پیشنهاد من هم اینه که دوستان تا یه نرم افزاری شبیه اون چیزی که میخواهیم هست،چرا دوباره از صفر شروع کنیم!بیایم و تغییرش بدیم تا به نتیجه دلخواه برسیم.
با تشکر از تمامی دوستانی که راهنمایی ام کردن.



تا میتونم باید تلاش کنم.همین

آفلاین hamed_ubuntu

  • Sr. Member
  • *
  • ارسال: 251
  • جنسیت : پسر
  • linuxforlife.ir
    • لینوکس برای زندگی
پاسخ : ؟read serial PORT
« پاسخ #6 : 03 اردیبهشت 1392، 12:27 ب‌ظ »
برادران گرامی این حل شد رو از کجا میزنن.
که نشون بده حل شد!
تا میتونم باید تلاش کنم.همین

آفلاین دانیال بهزادی

  • ناظر انجمن
  • *
  • ارسال: 19722
  • جنسیت : پسر
  • Urahara Kiesuke
    • وبلاگ
پاسخ : ؟read serial PORT
« پاسخ #7 : 04 اردیبهشت 1392، 02:04 ق‌ظ »
خیلی خوشحالم که حل شد.
باید پست نخست موضوع رو ویرایش کنی و در انتهای عنوانش بنویسی {حل شد}
اگه این ارسال بهت کمک کرد، دنبال دکمهٔ تشکر نگرد. به جاش تو هم به جامعهٔ آزادت کمک کن