PDA

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



ar.mahdian
دوشنبه 28 شهریور 1390, 09:40 صبح
سلام
مشکل عجیبی دارم
سر در نمیارم که چرا به مشکل برخورد کردم.

داستان از این قراره که یه مودم 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 جواب میده.
ممنون میشم اگه راهنمایی کنید.
یا یه راه حلی پیشنهاد کنید.

binyaft
دوشنبه 28 شهریور 1390, 10:28 صبح
اینجا که تالار PHP ــه :کف:

MMSHFE
دوشنبه 28 شهریور 1390, 10:43 صبح
با سلام، اين خط:
char *buf=(char*) calloc(255, sizeof (char));
رو اينطوري تغيير بدين:
char buf[255];
اميدوارم مشكل برطرف بشه.

ar.mahdian
دوشنبه 28 شهریور 1390, 10:55 صبح
اینجا که تالار PHP ــه :کف:
خوب مشکل منم با PHP ــه
برنامه داخل ترمینال اجرا میشه اما داخل PHP نه!

ar.mahdian
دوشنبه 28 شهریور 1390, 10:56 صبح
با سلام، اين خط:
char *buf=(char*) calloc(255, sizeof (char));
رو اينطوري تغيير بدين:
char buf[255];
اميدوارم مشكل برطرف بشه.
ممنون اما نشد.

بعد از دستور read این کد رو اضافه کردم:
printf("error:%s",strerror (errno));
خروجی داخل php:

Bad file descriptor

ar.mahdian
دوشنبه 28 شهریور 1390, 11:11 صبح
مشکل پیدا شد:
error:Permission denied
نمیتونه پورت رو باز کنه!

ar.mahdian
دوشنبه 28 شهریور 1390, 12:44 عصر
پرمیژن رو به پورت دادم و درست شد.

MMSHFE
دوشنبه 28 شهریور 1390, 13:09 عصر
جالب بود! :لبخند: