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