PDA

View Full Version : سوال: کد برای ارتباط با مودم gsm/gprs



ar.mahdian
دوشنبه 28 شهریور 1390, 09:49 صبح
سلام
مشکل من هم به سی ربط داره و هم به php . به همین دلیل در هر دو تالار مطرح کردم تا دوستان کمک کنند.
یه مشکل فنی هست
داستان از این قراره که یه مودم gsm/gprs از نوع یواس بی دارم که با استفاده از درایور ftdi_sio داخل سیستم من(اوبونتو) جواب میده و در برنامه grkterm موفق شدم که با دستگاه ارتباط برقرار کنم و جواب بگیریم. در حد اینکه یه at بگم و یه ok بگیرم.
تا اینجا مشکلی نبود.
بعد تصمیم گرفتم این امکان رو فراهم کنم که کاربر از راه دور به دستگاه فرمان بده و جوابش رو بگیره. یعنی از طریق وب.
زمپ رو نصب کردم و یه کلاس برای php که با پورت سریال ارتباط برقرار میکرد رو امتحان کردم که جواب نداد.
بعد تصمیم گرفتم یه برنامه کوچیک با سی بنویسیم و اونو درون php فراخوانی کنم و جواب رو نشون بدم.
برنامه رو نوشتم که این کدش هست:

#include <string.h>
#include <fcntl.h>
#include <termios.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>
#include <stdio.h>

int main(int argc, char **argv) {
FILE* fd;

struct termios options;
char p[20]; //port
char c[50]; //command

printf("argc: %i\r\n",argc);
if (argc > 2) {
strcpy(c, argv[2]);
strcat(c, "\r\n");
} else {
strcpy(c, "AT\r\n");
}
if (argc > 1) {
strcpy(p, argv[1]);
} else {
strcpy(p, "/dev/ttyUSB0");
}

puts("Befor port opening...\n");
puts(p);
puts(c);
fd = open(p, O_RDWR | O_NOCTTY);
if (fd) {
fcntl((int) fd, F_SETFL, 0);
puts("port opening successful.\n");
} else {
perror("Open port failed");
}

//serial configure
tcgetattr((int) fd, &options);

cfsetispeed(&options, B2400);
cfsetospeed(&options, B2400);
options.c_cflag &= CSIZE;
options.c_cflag &= CS8;
options.c_cflag &= PARENB;

int r, w;
char *buf=(char*) calloc(255, sizeof (char));

puts("Writing\r\n");
w = write((int) fd, c, strlen(c));
puts("unsleeping\r\n");

usleep(100000);
puts("Reading\r\n");
r = read((int) fd, buf, 255);
printf("r:%i\r\n",r);
if (r > 0) {
puts("Data: \r\n");
puts(buf);

}
close((int) fd);
return 0;
}

وقتی خود فایل رو درون ترمینال اجرا میکنم به راحتی جواب میده ولی وقتی از طریق php اجرا میکنم روی این خط گیر میکنه و تمام:

r = read((int) fd, buf, 255);

یعنی وقتی میخواد اطلاعات رو از پورت بخونه٬ موفق نمیشه!
این در حالیه که هیچ مشکلی برای اجرا در ترمینال پیش نمیاد و درست مثل hyper terminal و gtkterm جواب میده.
ممنون میشم اگه راهنمایی کنید.
یا یه راه حلی پیشنهاد کنید.

ar.mahdian
دوشنبه 28 شهریور 1390, 10:05 صبح
خروجی دستور فوق وقتی که فایل از طریق وب سرور اجرا میشه٬ منفی یک است است!

ar.mahdian
دوشنبه 28 شهریور 1390, 10:51 صبح
بعد از دستور read این کد رو اضافه کردم:
printf("error:%s",strerror (errno));
خروجی:

Bad file descriptor

mohsenre
سه شنبه 27 تیر 1391, 09:36 صبح
ببخشید اگه میشه بگید اینا چی کار میکنن؟ ممنون میشم


#include <fcntl.h>
#include <termios.h>

#include <unistd.h>
#include <time.h>
#include <stdio.h>

ar.mahdian
سه شنبه 27 تیر 1391, 20:06 عصر
با سلام به همه
این تاپیک مربوط به یک سال پیش میشه و مشکل من برطرف شدش
مشکل از این قرار بود که یوزر www-data پرمیژنهای لازم رو برای کار با فایل dev/ttyUSB0/ نداشت و ...