linux 怎么往串口发at指令 c语言,C语言通过串口发送AT指令

{

outdata[i] = tmp[i+1];

outdata[i+1] = tmp[i];

}

return 0;

}

static int get_sms_center(char *sm)

{

char SendData[32];

char rdata[64];

char *num_start;

char *num_end;

int num_len;

char tmp[16];

sprintf(SendData, "%s\r", "AT+CSCA?");

if(AT_SendCmd(SendData, strlen(SendData)) <0)

{

printf("set pdumode Failed\n");

AT_ComClose();

return -1;

}

memset(rdata, 0, sizeof(rdata));

AT_RecvData(rdata);

printf("rdata:%s\n", rdata);

num_start = strchr(rdata, '"');

if(num_start == NULL)

return -1;

else

*num_start = '\0';

printf("rdata num:%s\n", num_start+1);

num_end = strchr(num_start+1, '"');

if(num_end == NULL)

return -1;

else

*num_end = '\0';

printf("rdata start:%s\n", num_start+2);

memset(tmp, 0, sizeof(tmp));

phonenum_parity_exchange(num_start+2, tmp);

num_len = (strlen(tmp) + 2)/2;

sprintf(sm, "%02x%s%s", num_len, "91", tmp);

return 0;

}

static int get_sms_dest(char *phonenum, char *dest)

{

char tmp[16];

int num_len = strlen(phonenum);

memset(tmp, 0, sizeof(tmp));

if(strchr(phonenum, '+'))

{

num_len = num_len -1;

phonenum_parity_exchange(phonenum+1, tmp);

sprintf(dest, "%s%02x%s", "1100", num_len, "91");

}

else

{

phonenum_parity_exchange(phonenum, tmp);

sprintf(dest, "%s%02x%s", "1100", num_len, "81");

}

strcat(dest, tmp);

strcat(dest, "000800");

return 0;

}

int AT_ComConfig(char *name, int rate)

{

strcpy(com_name, name);

BaudRate = rate;

if(AT_ComOpen())

return -1;

AT_ComClose();

return 0;

}

int AT_ApnConfig(char *apn)

{

char SendData[512] = {0};

int cid=1;

char *pdp_type="ip";

if(AT_ComOpen())

return -1;

/* apn config cmd:at+CGDCONT=[[,[,[,[,[,]]]]]*/

sprintf(SendData, "at+cgdcont=%d,\"%s\", \"%s\"", cid, pdp_type, apn);

if(AT_SendCmd(SendData, strlen(SendData)) <0)

{

AT_ComClose();

return -1;

}

AT_ComClose();

return 0;

}

int SMS_TextMode(char *phonenum, char *msg)

{

char SendData[512] = {0};

char RecvData[256] = {0};

/* 设置短信发送格式为文本格式 */

sprintf(SendData, "%s\r", "AT+CMGF=1");

if(AT_SendCmd(SendData, strlen(SendData)) <0)

{

printf("set textmode Failed\n");

AT_ComClose();

return -1;

}

#if 0

// for debug

Sleep(2);

SerialRecv(hCom, RecvData, M_ASYNC);

printf("Recv data:%s\n", RecvData);

#endif

/* 设置短信发送号码 */

sprintf(SendData,"AT+CMGS=\"%s\"\r", phonenum);

if(SerialSend(hCom, SendData, strlen(SendData), M_ASYNC) <0)

{

printf("send phone number Failed\n");

AT_ComClose();

return -1;

}

/* 发送短信内容 */

printf("send msg:%s\n", msg);

sprintf(SendData, "%s", msg);

strcat(SendData, "\x1a");

if(SerialSend(hCom, SendData, strlen(SendData), M_ASYNC) <0)

{

printf("send msg Failed\n");

AT_ComClose();

return -1;

}

return 0;

}

int SMS_PduMode(char *phonenum, char *msg)

{

char SendData[2048] = {0};

char RecvData[256] = {0};

char sms_dest[32];

char sms_center[32];

//char *center = "0891683110102105f0";

char pdumsg[1024];

int len;

/* 设置短信发送格式为pdu格式 */

sprintf(SendData, "%s\r", "AT+CMGF=0");

if(AT_SendCmd(SendData, strlen(SendData)) <0)

{

printf("set pdumode Failed\n");

AT_ComClose();

return -1;

}

memset(RecvData, 0, sizeof(RecvData));

AT_RecvData(RecvData);

if(!strstr(RecvData, "OK"))

{

AT_ComClose();

return -1;

}

/* get the service message center address */

memset(sms_center, 0, sizeof(sms_center));

if(get_sms_center(sms_center) !=0)

strcpy(sms_dest, "0891683110102105f0");

printf("sms_center:%s\n", sms_center);

/*get message send address */

memset(sms_dest, 0, sizeof(sms_dest));

get_sms_dest(phonenum, sms_dest);

/* convert gb2312 to unicode */

ConverToUnicode(msg, pdumsg);

printf("pdumsg:%s\n", pdumsg);

len = (strlen(pdumsg) + strlen(sms_dest))/2;

printf("the msg len:%d\n", len);

/* 设置短信发送号码 */

sprintf(SendData,"AT+CMGS=%d\r", len);

if(AT_SendCmd(SendData, strlen(SendData)) <0)

{

printf("send phone number Failed\n");

AT_ComClose();

return -1;

}

/* 发送短信内容 */

sprintf(SendData, "%s%s%s", sms_center, sms_dest, pdumsg);

printf("send msg:%s, len=%d\n", SendData, strlen(SendData));

strcat(SendData, "\x1a");

if(AT_SendCmd(SendData, strlen(SendData)) <0)

{

printf("send msg Failed\n");

AT_ComClose();

return -1;

}

// for debug

Sleep(2);

SerialRecv(hCom, RecvData, M_ASYNC);

printf("Recv data:%s\n", RecvData);

return 0;

}

int AT_SendSMS(char *phonenum, char *msg, int msg_len)

{

if(AT_ComOpen())

return -1;

SMS_PduMode(phonenum, msg);

AT_ComClose();

return 0;

}

int AT_GetFlux(char *rdata, int buf_len)

{

char SendData[32];

char RecvData[512];

char *ptr;

*rdata = '\0';

if(AT_ComOpen())

return -1;

/* 获取流量信息 */

sprintf(SendData, "%s\r", "AT^DSFLOWQRY");

if(AT_SendCmd(SendData, strlen(SendData)) <0)

{

printf("send get flux cmd Failed\n");

AT_ComClose();

return -1;

}

memset(RecvData, 0, sizeof(RecvData));

AT_RecvData(RecvData);

printf("get flux read:%s\n", RecvData);

ptr = strchr(RecvData, ':');

if(ptr == NULL)

{

AT_ComClose();

return -1;

}

else

strncpy(rdata, ptr+1, buf_len);

AT_ComClose();

return 0;

}

int AT_GetCi(char *rdata, int buf_len)

{

char SendData[32];

char RecvData[64];

char *ptr;

*rdata = '\0';

if(AT_ComOpen())

return -1;

Sleep(1);

/* 设置允许获取位置信息 */

sprintf(SendData, "%s\r", "AT+CREG=2");

if(AT_SendCmd(SendData, strlen(SendData)) <0)

{

printf("set get cell id Failed\n");

AT_ComClose();

return -2;

}

memset(RecvData, 0, sizeof(RecvData));

AT_RecvData(RecvData);

if(!strstr(RecvData, "OK"))

{

AT_ComClose();

return -3;

}

/* 获取位置信息 */

sprintf(SendData, "%s\r", "AT+CREG?");

if(AT_SendCmd(SendData, strlen(SendData)) <0)

{

printf("Get cell id Failed\n");

AT_ComClose();

return -4;

}

AT_RecvData(RecvData);

printf("getci read:%s\n", RecvData);

ptr = strrchr(RecvData, ',');

if(ptr == NULL)

{

AT_ComClose();

return -5;

}

else

strncpy(rdata, ptr+1, buf_len);

AT_ComClose();

return 0;

}

int at_test(char *wdata, char *rdata, int len)

{

char *tmp;

strcpy(rdata, "at_test======");

strcat(rdata, wdata);

return len;

}

atcmd.h:

#ifndef _ATCMD_H_

#define _ATCMD_H_

#ifdef __cplusplus

extern "C"

{

#endif

#include

#defineM_SYNC  (0)

#defineM_ASYNC (1)

#pragma   comment(lib, "libcomm.lib")

/* 串口动态链接库接口*/

_declspec(dllimport) HANDLE SerialOpen(char *name, int type);

_declspec(dllimport) int SerialSet(HANDLE fd, int rate);

_declspec(dllimport) int SerialSend(HANDLE fd, char *data, int len, int method);

_declspec(dllimport) int SerialSendWithTimeout(HANDLE fd, char *data, int timeout);

_declspec(dllimport) int SerialRecv(HANDLE fd, char *data, int method);

_declspec(dllimport) int SerialRecvWithTimeout(HANDLE fd, char *data, int timeout);

_declspec(dllimport) int SerialClose(HANDLE fd);

/* AT 指令对外接口*/

_declspec(dllexport) AT_ComConfig(char *name, int rate);

_declspec(dllexport) AT_ApnConfig(char *apn);

_declspec(dllexport) AT_SendSMS(char *phonenum, char *msg, int len);

_declspec(dllexport) AT_GetFlux(char *rdata, int buf_len);

_declspec(dllexport) AT_GetCi(char *rdata, int buf_len);

_declspec(dllexport) at_test(char *wdata, char *rdata, int len);

#ifdef __cplusplus

}

#endif

#endif

以上代码在实际项目中编译通过。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值