Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 用于USSD代码的AT命令_C_At Command - Fatal编程技术网

C 用于USSD代码的AT命令

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

这是我当前用于尝试向调制解调器发送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* 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(缓冲区)
。。。或者您应该只使用strcmp
strcmp
,其中不需要长度

虽然这不是一个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];