卒業プロジェクトでは、組み込み Linux (Qtopia) を実行している ARM ボード (OK-6410) に GSM モジュール (ADH8066) を接続し、それと通信することになっています。
モジュールを最初に操作すると、「準備完了」メッセージが送信され、AT コマンドを介して通信できます。ハイパーターミナルを使用して正常に通信し、簡単な SMS を送信することができました。
問題は、ARM ボードから通信しようとすると発生します。
「準備完了」メッセージを受信することはできますが、応答がありません。
これまでに開発したコードは次のとおりです。
int main(void){
int fd;
char *dev ="/dev/ttySAC3";
struct termios options;
char buffer[20];
char buffer2[20];
char *bufptr;
char *bufptr2;
bufptr = buffer;
bufptr2 = buffer2;
int nbytes,nbytes2=0;
fd = open (dev, O_RDWR | O_NOCTTY);
tcflush(fd, TCIOFLUSH);
tcgetattr(fd, &options);
cfsetispeed(&options, B115200); //Set Baud-rate to 115200
cfsetospeed(&options, B115200);
options.c_cflag |= CLOCAL | CREAD; //Enable the receiver and set local mode
options.c_cflag &= ~PARENB; //No parity (8N1)
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;
options.c_cflag &= ~CRTSCTS; //Disable hardware flow control
options.c_lflag |= (ICANON | ECHO | ECHOE); //enable input-canonical mode
options.c_iflag = IGNPAR; //Ignore parity errors
options.c_iflag &= ~(IXON | IXOFF | IXANY); //Disable software flow control
options.c_oflag |= OPOST; //enable output-processing mode
tcsetattr(fd, TCSANOW, &options);
printf("Hello GSM\n");
tcflush(fd, TCIOFLUSH);
//capture the "Ready" message
while(1){
nbytes = read(fd, bufptr, 1);
if (0!=strstr(buffer,"Ready")){
printf("\nReady Found!\n");
break;
}
bufptr += nbytes;
}
tcflush(fd, TCIOFLUSH);
// send simple "AT" AT command
int y = write(fd,"AT\r\n",4);
if (y==4)
printf("Written\n");
//trying to capture the "OK" response for the above AT command
while(1){
nbytes2 = read(fd, bufptr2, 1);
perror ("Read error: ");
printf("%c\n",*bufptr2);
}
return 1;
}
得られた応答は次のとおりです。
Hello GSM
Ready Found!
Written
その後、ブロックしてアイドル状態のままになります。
「準備完了」メッセージをキャプチャできれば、それは「読み取り」が正常に機能していることを意味しませんか? 上に「書きました」と書いてあるのは、「書き込み」がうまくいっているということではないですか?では、なぜモジュールと通信できないのでしょうか?
ありがとう。