ar.mahdian
دوشنبه 28 شهریور 1390, 10: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 جواب میده.
ممنون میشم اگه راهنمایی کنید.
یا یه راه حلی پیشنهاد کنید.
مشکل عجیبی دارم
سر در نمیارم که چرا به مشکل برخورد کردم.
داستان از این قراره که یه مودم 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 جواب میده.
ممنون میشم اگه راهنمایی کنید.
یا یه راه حلی پیشنهاد کنید.