0

您好,我正在使用 AM1808 ARM9 微处理器。我有一个 GSM 加密狗的接口。我想使用 pthread 在后台建立 GSM 加密狗连接以及所有数据传输和接收。

当我尝试在后台连接加密狗时,它一直闪烁绿灯,我无法连接到服务器。

我找不到问题。

这是我用于数据卡初始化和通信例程的代码。我正在主线程中初始化线程。

    int InitializeDataCard(void)
    {
          static int connect_ret = 0;
          pthread_t processing_th;

          pthread_create(&processing_th, NULL, Datacard_Connection_Thread, &db_mc_object); 
          pthread_detach(processing_th);
          ShowMessageBox(msgbox_text[136], MB_TASKMODAL);
          if(connect_ret)
          {
        ShowMessageBox(msgbox_text[163], MB_ICONERROR);
        return -1;`enter code here`
          }
          else
          {
        return 0;  
          }
    }
    int ConnectToServer(void)
    {
         int connect_ret = 0;

         Dprintf(__func__,"Trying to connect ....");
         DPUUtilsLib_RetrieveParameter(PID_DATACARD_INFO,(UCHAR *)&datacard_info,sizeof(datacard_info)); 
         connect_ret = DataCardConnect(datacard_info);
         sleep(3);
         //g_do_process = 0;
         Dprintf(__func__,"DataCardConnect ret=%d",connect_ret);

         return connect_ret;
    }

    void * Datacard_Connection_Thread(void *tempdata)
{
     int ret=0,response = -1,enc_ret=0;
     static int g_gsm_response = 0;
     dpu_csv_file_param_t fileparam;
     dpu_db_export_search_params_t tempparams;
     dpu_db_milk_collection_t *livedata,*updatedata;
     dpu_db_user_master_t CreatedBy,UpdatedBy;
     dpu_db_society_master_t soc_info;
     char filename[50]={0};

     livedata = (dpu_db_milk_collection_t *)tempdata;

     //Connect to the Network
      create_connection :
     ret = ConnectToServer();

     //connected successfully 
     if(!ret)
     {
           //Get the SocietyCode from the Database 

        if(g_data_available)   
        {
            g_data_available=0;
            soc_info.SocietyId = g_society_list[g_selected_society].SocietyId;
                  DPUDBLib_search_society_master(&soc_info);

            strncpy(livedata->SocietyCode,soc_info.SocietyCode,5);

            Dprintf(__func__,"%04d\n %5.2f\n %5.2f\n %5.2f\n %5.2f\n %5.2f\n %5.2f\n %7.2f\n %7.2f\n %03d\n %c\n %d\n %5.2d\n %s\n %d",
                 livedata->MemberCode,livedata->Fat,livedata->LRCLR,livedata->SNF,livedata->Solid,
                 livedata->FatKG,livedata->SNFKG,livedata->Rate,livedata->Amount,
                 livedata->CanNumber,livedata->EntryMode,livedata->MC_RateChartId,livedata->Water,livedata->SocietyCode,__LINE__);

            sprintf(tempparams.FileName,"%s/%s",DATA_TEMP,MT_MILKLIVEFILE);

            memcpy(fileparam.FilePath,tempparams.FileName,sizeof(tempparams.FileName)); 

            fileparam.Type = DPU_CSV_EXPORT;
            fileparam.FileType = DPU_CSV_MILK_LIVE_DATA_FILE;
            //open a csv file
            DPUCSVLib_open_csv_file(&fileparam);

            memset(&CreatedBy,0,sizeof(dpu_db_user_master_t));      
            memset(&UpdatedBy,0,sizeof(dpu_db_user_master_t));      

            strncpy(CreatedBy.Username,TempUser,5);

            //write the live data into the file
            DPUCSVLib_write_csv_file(&fileparam,livedata,&CreatedBy,&UpdatedBy);

            //encrypt the file
            enc_ret = DPUEncryptFile(tempparams.FileName,filename);         

            if(!enc_ret)
            {
                //send file request to server for the accepting the data
                response = SendFileRequest(g_gsm_response,filename,9);

                if(!response)
                {
                    //receive the response of the server 
                    response = GetResponceFromServer(g_gsm_response,&response,9);

                    if(response || g_gsm_response) response = -1;
                    else
                    {
                        //If record is successfully sent to the server then update the FlagGSM flag of the record as well as 
                        //Update the database
                        g_update_record  = 1;
                        livedata->FlagGSM = 1;
                        updatedata->MilkCollectionId = livedata->MilkCollectionId;
                        DPUDBLib_search_milk_collection_entry_by_record(&updatedata);
                        DPUDBLib_edit_milk_collection_entry(&updatedata,&livedata);
                        g_update_record = 0;
                    }

                }
                //remove the temp file generated
                remove(filename);
            }   
        }
     }
     else
     {
            //if connection is not successfully done then try to reconnect the server
    ShowMessageBox(msgbox_text[156], MB_ICONERROR);
            goto create_connection; 
     }

}
4

1 回答 1

0

我认为这里存在基本错误。通过在 中声明静态变量connect_retInitializeDataCard并不意味着它将与在 中声明的变量相同ConnectToServer。因此,第一个函数将始终具有相同的行为......

我认为您将需要一个全局变量(即未在函数中定义)并且可能需要某种同步,因为当您创建线程时,它可能不会立即执行,所以即使您有一个全局变量,在您知道它已正确设置之前,您无法对其进行检查。

于 2013-03-07T15:17:34.977 回答