关于AT指令和gprs发送短信 急啊
- C/C++ code
#include <termios.h>#include <sys/types.h>#include <sys/shm.h>#include <stdlib.h>#include <fcntl.h>#include <sys/stat.h>#include <string.h>#include <stdio.h>struct message_info{ char phno[12]; char message[128];};/******************************************************************* *函数tty_write是用来向串口写入数据, *send_buff是要发送的字符串; *******************************************************************/void tty_write(int gprs_fd, char *send_buff, int len){ char buff[128]; memset(buff, 0, sizeof(buff)); strcpy(buff, send_buff); write(gprs_fd, send_buff, len); printf("%s\n", buff);}/******************************************************************** *函数tty_read是用来读取串口数据的,并且将读取的数据打印; * *****************************************************************/void tty_read(int gprs_fd){ char reply_buff[128]; memset(reply_buff, 0, sizeof(reply_buff)); read(gprs_fd, reply_buff, sizeof(reply_buff)); printf("%s\n",reply_buff);}void gprs_init_serial(int gprs_fd){ struct termios options; tcgetattr(gprs_fd, &options); //获取当前串口参数初始值,并赋值给options; options.c_cflag |= ( CLOCAL | CREAD );//c_cflag 为控制模式设置; options.c_cflag &= ~CSIZE; //清空原有字符长度; options.c_cflag &= ~CRTSCTS; //启用RTS/CTS(硬件); options.c_cflag |= CS8; //设置字符长度掩码; options.c_cflag &= ~CSTOPB; //停止位设置为一个; options.c_iflag |= IGNPAR; //c_iflag 为输入模式设置; options.c_oflag = 0; //c_oflag 为输出模式设置; options.c_lflag = 0; //c_lflag 为局部模式设置; cfsetispeed(&options, B115200); //设置当前串口的输入波特率为115200; cfsetospeed(&options, B115200); //设置当前串口的输出波特率为115200; tcsetattr(gprs_fd,TCSANOW,&options); //设置当前串口的参数,立即修改;}int call(int gprs_fd, struct message_info info){ char send_buff[128]; char reply_buff[128]; if(strlen(info.phno) != 11) //判断接收手机号码是否是11位; { printf("Wrong phone number!"); return -1; } memset(send_buff,0,sizeof(send_buff)); strcpy(send_buff, "at\r\n"); write(gprs_fd, send_buff,strlen(send_buff)); //测试模块是否正常; printf("%s\n",send_buff); memset(reply_buff, 0, sizeof(reply_buff)); sleep(1); //由于处理AT指令要花费一定时间,所以需要睡眠1秒; read(gprs_fd, reply_buff, sizeof(reply_buff)); printf("%s\n",reply_buff); memset(send_buff, 0, sizeof(send_buff)); sprintf(send_buff, "ATD%s;\r\n", info.phno); write(gprs_fd, send_buff, strlen(send_buff)); //拨打电话; printf("calling %s..................\n", send_buff); memset(reply_buff, 0, sizeof(reply_buff)); sleep(100); read(gprs_fd, reply_buff, sizeof(reply_buff)); printf("%s\n",reply_buff); return 0;}/************************************************************* *函数swap用来奇偶交换; *number为原有字符,swap为交换后的字符;**************************************************************/void swap(char *number, char *swap){ char ch[] = "86"; char tmp[16]; int i; memset(swap, 0, 32); memset(tmp, 0, 16); strcpy(swap, number); strcat(swap, "f"); strcat(ch, swap); strcpy(swap, ch); for(i = 0;i<=strlen(swap) - 1;i += 2) { tmp[i + 1] = swap[i]; tmp[i] = swap[i + 1]; } strcpy(swap, tmp);}int hang_phone(int gprs_fd){// char send_buff[128];// char reply_buff[128]; printf("Hang Up!\n"); //提示电话将被挂断;/* memset(send_buff, 0, sizeof(send_buff)); strcpy(send_buff, "AT\r\n"); write(gprs_fd, send_buff, strlen(send_buff)); printf("%s\n",send_buff);*/ tty_write(gprs_fd, "AT\r\n", strlen("AT\r\n")); sleep(1); tty_read(gprs_fd); tty_write(gprs_fd, "ATH\r\n",strlen("ATH\r\n"));//挂断电话; sleep(30); //模块响应; tty_read(gprs_fd); return 0;}void answer_phone(int gprs_fd){ printf("Answer!\n"); tty_write(gprs_fd, "AT\r\n", strlen("AT\r\n")); sleep(1); tty_read(gprs_fd); tty_write(gprs_fd, "ATA\r\n",strlen("ATA\r\n"));//接听电话; sleep(30); //模块响应; tty_read(gprs_fd);}void send_message(int gprs_fd, struct message_info info, int flag){ char send_buff[128]; printf("Send english message!\n"); tty_write(gprs_fd, "AT\r\n", strlen("AT\r\n")); sleep(1); tty_read(gprs_fd); if(flag == 0) { tty_write(gprs_fd, "AT+CSMP=17,167,0,0\r\n",strlen("AT+CSMP=17,167,0,0\r\n")); sleep(1); tty_read(gprs_fd); } if(flag == 1) { tty_write(gprs_fd, "AT+CSMP=17,167,0,8\r\n",strlen("AT+CSMP=17,167,0,8\r\n")); sleep(1); tty_read(gprs_fd); } tty_write(gprs_fd, "AT+CMGF=1\r\n", strlen("AT+CMGF=1\r\n")); sleep(1); tty_read(gprs_fd); memset(send_buff, 0, sizeof(send_buff)); strcpy(send_buff, "AT+CMGS="); strcat(send_buff, info.phno); strcat(send_buff, "\r\n"); write(gprs_fd,send_buff,strlen(send_buff)); printf("%s\n",send_buff); sleep(1); tty_read(gprs_fd); memset(send_buff, 0, sizeof(send_buff)); sprintf(send_buff,"%s\x1a", info.message); write(gprs_fd, send_buff, strlen(send_buff)); printf("%s\n", send_buff); tty_read(gprs_fd);}int main(){ int gprs_fd; struct message_info info;// info.phno = "18667315690"; strcpy(info.phno, "18667315690"); strcpy(info.message, "6C495B57"); if((gprs_fd = open("/dev/s3c2410_serial1", O_RDWR|O_NOCTTY|O_NDELAY)) < 0) { printf("open error!\n"); exit(-1); } gprs_init_serial(gprs_fd); send_message(gprs_fd, info, 1); return 0;}
在串口模式下 按程序的命令 输入到串口中 可以正常的发出中文短信,但是一在linux下编译完 移植到开发板上 在运行发出去的就是乱码了 求高人帮忙啊
[解决办法]
怀疑是编码问题,检查一下
[解决办法]