C 用于USSD代码的AT命令
这是我当前用于尝试向调制解调器发送USSD代码的代码C 用于USSD代码的AT命令,c,at-command,C,At Command,这是我当前用于尝试向调制解调器发送USSD代码的代码 static void __display_data_balance(void) { const STR* vodacomUSSD = "*111*502#"; const STR* mtnUSSD = "*141*1#"; const STR* cellcUSSD = "*101#"; const STR* telkomUSSD = "*188#"; const STR* virg
static void __display_data_balance(void) {
const STR* vodacomUSSD = "*111*502#";
const STR* mtnUSSD = "*141*1#";
const STR* cellcUSSD = "*101#";
const STR* telkomUSSD = "*188#";
const STR* virginMobileUSSD = "*101#";
USHORT state;
USHORT error = SSD_STATE_GOOD;
BOOL done = FALSE;
USHORT size = 0;
STR* ussdCommand = NULL;
BYTE length;
BYTE buffer[64];
for (state = 1; !error && !done; state++) {
printf("[__display_data_balance] state = %d\n", state);
printf("Buffer = %s\n", buffer);
switch (state) {
default:
error = SSD_STATE_CORRUPT;
break;
case 1:
//error = CTOS_GSMOpen(115200, TRUE);
break;
case 2:
error = CTOS_GSMQueryOperatorName(buffer, &length);
break;
case 3:
printf("[__display_data_balance] buffer = %s\n", buffer);
printf("[__display_data_balance] length = %d\n", length);
CTOS_LCDGTextOut(110, 210, buffer, d_LCD_FONT_12x24, FALSE);
if (strncmp("\"VodaCom-SA\"", buffer, length) == 0) {
ussdCommand = (STR*) vodacomUSSD;
} else if (strncmp("\"MTN-SA\"", buffer, length) == 0) {
ussdCommand = (STR*) mtnUSSD;
} else if (strncmp("\"Cellc-SA\"", buffer, length) == 0) {
ussdCommand = (STR*) cellcUSSD;
} else if (strncmp("\"Telkom-SA\"", buffer, length) == 0) {
ussdCommand = (STR*) telkomUSSD;
} else if (strncmp("\"VirginMobile-SA\"", buffer, length) == 0) {
ussdCommand = (STR*) virginMobileUSSD;
} else {
error = SSD_STATE_NOT_IMPLEMENTED;
}
if (ussdCommand) {
sprintf(buffer, "AT+CUSD=1,\"%s\",15\r", ussdCommand);
error = CTOS_GSMSendATCmd(buffer, strlen(buffer), 2000);
//USHORT CTOS_GSMSendATCmd(BYTE *baCmd, ULONG ulLen, ULONG ulTimeout);
}
break;
case 4:
size = sizeof (buffer);
error = CTOS_GSMRecvData(buffer, &size);
//USHORT CTOS_GSMRecvData ( BYTE *baData, USHORT *pusLen );
break;
case 5:
printf("[__display_data_balance] buffer = %s\n", buffer);
printf("[__display_data_balance] length = %d\n", length);
CTOS_LCDGTextOut(40, 270, buffer, d_LCD_FONT_12x24, FALSE);
//error = CTOS_GSMClose();
break;
case 6:
done = TRUE;
break;
}
我想知道我做错了什么,我对编程相当陌生,希望得到一些帮助
我已经添加了整个函数。是的,通过这些声明,您将希望将
大小设置为64,而不是大小(缓冲区)
,或者更好
#define BUFSIZE (64)
:
:
BYTE buffer[BUFSIZE];
:
:
size = BUFSIZE;
CTOS_GSMRecvData(buffer, &size);//Receive data from GSM module.
:
:
希望这是一个打字错误ussCommand
应该是STR*
,而不是STR
另外,其中是长度设置。。。希望它类似于length=strlen(缓冲区)
。。。或者您应该只使用strcmpstrcmp
,其中不需要长度
虽然这不是一个bug,但在使用任何strcmp
函数族与字符串常量进行比较时,通常会将变量放在第一位,字符串常量放在第二位。。。就像大多数人会写if(x==1).
,而不是if(1==x).
CTOS_GSMRecvData的输出为+CUSD=1,“111*502#”,12,而不是所需的数据平衡
一些东西,你可以检查一下
- 通过在+CUSD处发出命令,阅读未经请求的结果代码的当前显示状态?
- 在+CUSD=1时发出以启用演示
- 下一期AT+CUSD=1,“111*502#”,12
- 请注意,来自网络的响应是异步的,我希望实现CTO\u GSMRecvData来处理这个问题
问题是?哇!有人仍在使用调制解调器?@SGeorgiades对于电子设备的全球无线通信,您会使用什么来代替GSM调制解调器?鸽子邮报?关于size
、buffer
和ussdCommand
的声明在哪里?我怀疑您的size=sizeof(buffer)
有问题,因为buffer
很可能是一个指针,这只会给出指针的大小。您可能需要为缓冲区大小定义一个#define
,然后在声明缓冲区时使用该#define
d值,在调用CTOS_GSMRecvData
之前分配大小时再次使用该值。POS终端需要显示它在+CUSD=1处返回的数据余额,“111*502”,12因为ISP是Vodacom,但不是数据平衡。以下是其他声明:USHORT状态;USHORT error=SSD\u STATE\u GOOD;BOOL done=FALSE;USHORT大小=0;STR ussdCommand=NULL;字节长度;字节缓冲区[64];