找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2795|回復(fù): 5
收起左側(cè)

OA日志

[復(fù)制鏈接]
ID:82781 發(fā)表于 2015-6-13 15:44 | 顯示全部樓層 |閱讀模式
今天難題了,昨天建華改了硬件電路,今天不好用了,前天是好用,今天不好用了?奇怪,我又對(duì)程序檢查,其實(shí)很簡(jiǎn)單啊,ADC嘛,無非是第一步初始化端口,第二選中ADC的通道,然后時(shí)能中斷,開始轉(zhuǎn)換,就這么簡(jiǎn)單,為什么呢?后來發(fā)現(xiàn)程序在不DBUG的時(shí)候不運(yùn)行,所以引起我的懷疑,我換了硬件電路,換了一塊板子,結(jié)果程序跑起來了但是還是解不出來了,很是郁悶,然后著重開始對(duì)癥手冊(cè)對(duì)程序繼續(xù)檢查,其中有一句話是這樣的“ It needs about 27 ADC clocks to complete an A/D conversion.”也就是說ADC時(shí)鐘我是可以控制的,間接地對(duì)目標(biāo)精心采樣,但是遺憾的是,我用的是200K的ADC時(shí)鐘,那么采樣肯定達(dá)不到200K,但是確實(shí)好用 ,信號(hào)要求,必須達(dá)到300-200K的速率才可以接出來正確的波,很難理解,PLL時(shí)鐘是50M。這個(gè)應(yīng)該和PLL沒什么關(guān)系,因?yàn)樵词现形疫x定外部的晶體,下午快下班的時(shí)候我把DIV換到4,然后莫名其妙的就好了,此時(shí)軟件測(cè)得采樣率每秒鐘11萬次,根本不對(duì),卻可以得到正確的數(shù)據(jù),凌亂。示波器波形顯示上升沿和下降沿時(shí)間均在5微妙左右,所以硬件上沒有問題,有問題也是我程序的問題,但是這個(gè)真的求不出來這個(gè)速率,因?yàn)闄?quán)威的軟件取采樣率和實(shí)際并不相符啊!必須要200K-300K的速率來采才會(huì)得到正確的結(jié)果,可是我設(shè)定的是11萬次的采樣率一樣可以得到正確的值,很詭異很詭異!有待研究學(xué)習(xí)啊,好神奇。≌媸怯猩癜。∮猩!
回復(fù)

使用道具 舉報(bào)

ID:82781 發(fā)表于 2015-6-13 15:44 | 顯示全部樓層
    今天搞DHCP的時(shí)候,也碰到一個(gè)很奇怪的問題,無反應(yīng),后來檢查程序,原來移植程序的時(shí)候中斷引腳沒有改,改掉之后發(fā)現(xiàn)仍然獲取不到DHCP服務(wù)器給的IP地址,萬般無奈下只好改成固定IP測(cè)試硬件    txrx,測(cè)得硬件完全正常,只不過剛開始碰到一個(gè)號(hào)段問題,那就是0號(hào)段的可以向1號(hào)段發(fā)。反之則不行,修改后好使,但是DHCP任然不好用,并未得導(dǎo)IP地址,不得不跟蹤代碼。
IP4_ADDR(&gw, 0,0,0,0);
IP4_ADDR(&ipaddr, 0,0,0,0);
IP4_ADDR(&netmask, 0,0,0,0);
清掉IP網(wǎng)管子網(wǎng)掩碼信息,
tcpip_init(RT_NULL, RT_NULL);

netif_set_addr(netif_default, &ipaddr, &netmask, &gw);
netif_set_up(netif_default);
初始化TCPIP服務(wù)線程,加載地址
dhcp_start(netif_default);
向DHCP服務(wù)器發(fā)送請(qǐng)求
while (netif_default->ip_addr.addr == 0)
等待分配IP,
結(jié)束,這就是DHCP的全過程,如果順利的分配到IP地址那么就會(huì)跳出堵塞,向下執(zhí)行,如果得不到,那將會(huì)啟動(dòng)一個(gè)超時(shí)等待(DHCP transaction timeout handling)。我得到的是等待,顯然發(fā)出去請(qǐng)求沒有回應(yīng),于是實(shí)在是沒有道理,考慮MAC地址,一看地址是0X27*6,馬上改掉,問題解決了,IP地址分配了,一切有正常起來!哈哈也就是說MAC雖然可以亂寫,但是不能重復(fù),當(dāng)然這個(gè)變數(shù)就多了,經(jīng)驗(yàn)經(jīng)驗(yàn)!好使才是王道。

回復(fù)

使用道具 舉報(bào)

ID:82781 發(fā)表于 2015-6-13 15:44 | 顯示全部樓層
今天上午在Mbus項(xiàng)目上加上GPRS,做了實(shí)驗(yàn), 經(jīng)測(cè)試數(shù)據(jù)可以上傳下達(dá),當(dāng)然是測(cè)試,工作在透?jìng)髂J,而且程序均很?jiǎn)潔,有待完善,數(shù)據(jù)完整性和連接可靠性,均未處理。數(shù)據(jù)完整主要是Mbus上傳數(shù)據(jù)進(jìn)行的校驗(yàn),數(shù)據(jù)連接性主要是GPRS的可靠性
我們的流程是這樣的:

TCP 服務(wù)器------》》》》------SIM900A(CLINTE)------>>>TX0---MBUS設(shè)備 -----》》mcu 解碼------》tx1---sim900a(CLINTE)-----》》--TCP服務(wù)器---THE END

數(shù)據(jù)完整性處理:

數(shù)據(jù)流設(shè)備---》---采集---》TO buff  ------>>take data ----->一定的算法計(jì)算差錯(cuò)----》完全正確上傳平臺(tái)
                                                                                                                 |》》》丟棄,報(bào)告錯(cuò)誤。


鏈接可靠性

重練機(jī)制,自身檢測(cè)診斷,(參照SIM900AAT集),心跳, 其他的還希望大家提供線索,力求可靠。

gprs部分測(cè)試:

對(duì)于串口流我采用了分時(shí)分批處理的方法,算法是環(huán)形隊(duì)列。只要BUF足夠大,就不大會(huì)發(fā)生丟數(shù)據(jù)的情況。(環(huán)形隊(duì)列慎用之)


IP :119.184.123.84
PORT:1000


  void initsim900a(void)
{
   
uint8_t m;
POWER_ON;
DrvSYS_Delay(300000);
POWER_OFF;
DrvSYS_Delay(300000); //開機(jī)
for(m=5;m;m--)
{
DrvSYS_Delay(100000);
}

if(GET_START)
{
DrvUART_Write(UART_PORT1,"AT\r\n",4);//發(fā)送AT命令
DrvUART_Write(UART_PORT0,"AT\r\n",4);//發(fā)送AT命令
}

}
void timeout(uint32_t time)
{
     uint32_t n;
  for(n=0;n<time;n++)
{

   DrvSYS_Delay(1000);//1ms
}

}

extern uint8_t *Gprs_Pong(void);
uint8_t  Wait_Gprs_Sure(char *p)
{
   p=p;
   
   
   Gprs_Pong();
   
   
   
   
   
   
    /*
        if(memcmp(SIM900A_DATA,sk,strlen(sk))==0)
     {
     
      send_data();
     
     }

      if(memcmp(SIM900A_DATA,sendok,strlen(sendok))==0)
      {
        //  pa->AT_REC_SEND_OK=1;
      
      }

       if(memcmp(SIM900A_DATA,connect_ok,strlen(connect_ok))==0)
    {

   // pa->AT_REC_CONNECT=1;
     
   
    }
      if(memcmp(SIM900A_DATA,err,strlen(err))==0)
    {

   // pa->AT_REC_ERR=1; //err
     
   
    }
    if(memcmp(SIM900A_DATA,atd,strlen(atd))==0)
    {

   // pa->AT_REC_ATD=1; //撥電話
     
   
    }


    if(memcmp(SIM900A_DATA,power_down,strlen(power_down))==0)
    {
   // pa->AT_REC_POWERDOWN=1;
     // printf_usart0 ("模塊掉電請(qǐng)重新上電\r\n");
   
    }


   
       if(memcmp(SIM900A_DATA,ati,strlen(ati))==0)
    {
   
   // pa->AT_REC_ATI=1;
    //  printf_usart0 ("收到設(shè)備號(hào)\r\n");
   
    }
   
       if(memcmp(SIM900A_DATA,ok,strlen(ok))==0)
    {
  //  pa->AT_REC_OK=1;
    //  printf_usart0 ("收到OK\r\n");
   
    }


      */
   return 0;
}



uint8_t  Connect_Sever(char *Url)
{
   

     Url = Url;
  timeout(1000);//1s
  Gprs_Send_String(at_cmd);//支持包交換和數(shù)據(jù)交換
  timeout(8000);//1s
  Wait_Gprs_Sure("ok!!");

     Gprs_Send_String(" AT+CGCLASS=\"B\"\r\n\r\n");//支持包交換和數(shù)據(jù)交換

   timeout(8000);//1s
   Wait_Gprs_Sure("AT+CGCLASS=\"B\"\r\n\r\n");
       // {pa->AT_REC_OK=0;printf_usart0 ("支持包交換和數(shù)據(jù)交換配置成功\r\n");}

  Gprs_Send_String ("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n\r\n");
      timeout(8000);//1s
   Wait_Gprs_Sure("AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n\r\n");
// CoTickDelay(60);
  //  {pa->AT_REC_OK=0;printf_usart0 ("配置GPRS和接入點(diǎn)設(shè)置成功\r\n");}

    Gprs_Send_String ("AT+CGATT=1\r\n\r\n"); //附著GPRS業(yè)務(wù)
     
     timeout(8000);//1s
   Wait_Gprs_Sure("AT+CGATT=1\r\n\r\n");
  //CoTickDelay(60);
     //{pa->AT_REC_OK=0;printf_usart0 ("附著GPRS業(yè)務(wù)成功\r\n");}
    Gprs_Send_String ("AT+CIPCSGP=1,\"CMNET\"\r\n\r\n"); //選擇GPRS連接
      
     timeout(8000);//1s
   Wait_Gprs_Sure("AT+CIPCSGP=1,\"CMNET\"\r\n\r\n");

    // {pa->AT_REC_OK=0;printf_usart0 ("選擇GPRS連接成功\r\n");}
      Gprs_Send_String("AT+CIPSTART=\"TCP\",");
   timeout(10);//1s
    Gprs_Send_String ("\"119.184.123.84\","); //ip地址
   timeout(10);//1s
      Gprs_Send_String("1000\r\n");   //端口
   timeout(10);//1s
            timeout(8000);//1s
   Wait_Gprs_Sure("AT+CIPSTART=\"TCP\",\"119.184.123.84\",""1000\r\n");


     return 0;
}


void Send_Data_Gprs(uint8_t *data,uint8_t len)
{
  
    static uint8_t g=0x1A;
    timeout(8000);//1s
   Gprs_Send_String ("AT+CIPSEND\r\n");
  timeout(1000);//1s
  Gprs_Send_Data(data,len);
     // Gprs_Send_String (">嘿!伙計(jì),我是單片機(jī)!\r\n");
   DrvUART_Write(UART_PORT1,&g,1);  
           timeout(8000);//1s

  
}


回復(fù)

使用道具 舉報(bào)

ID:82781 發(fā)表于 2015-6-13 15:45 | 顯示全部樓層
霧靄湝湝,云露淇淇,日月不得其光,賊星在位,不知朝夕,恍惚逝去!
沉吟:夫士不可以弘毅,任重而道遠(yuǎn)!
昨夜食,不得寐,晨其舍飯,余碗粟米也,食罷而去。
吾等繼至,建華早至,說如此!

上午本來大打算繼續(xù)搞GPRS的穩(wěn)定性滴,沒想到打開電腦,看到某大神在討論修飾符volatile,這個(gè)符號(hào)可不是一般的符號(hào)啊,就我個(gè)人而言這個(gè)東東很常見于只向寄存的指針上用,因?yàn)樗缶幾g器對(duì)他不進(jìn)行優(yōu)化,長(zhǎng)用的方式如下:
#defien  REG_SRC (*(volatile const unsigned char*)0x2f00345e)
我們?cè)贑語言中常常有這樣的語句:

unsigned int a;

a=1;
a=2;
a=4;
a=7;
編譯器最后得出的結(jié)果是a=7,其他的都會(huì)編譯掉,但是如果A是寄存器呢?他的每一次賦值都是一個(gè)變化,又怎么解釋呢?就有

#defien  REG_SRC (*(volatile const unsigned*)0x0000345e)

REG_SRC = 0x 0000000;

REG_SRC = 0xff00ff00;

REG_SRC = 0x00ff00ff;

這是決然不同的!后者高速編譯器這個(gè)地址可能被改變,你要保留不要優(yōu)化掉,當(dāng)然,現(xiàn)在的編譯器尤其是嵌入式專用的那些對(duì)這些絕對(duì)地址的尋址上都是有保護(hù)滴,當(dāng)然這也不可以步履啊。

還有就是在ISR服務(wù)中使用,其實(shí)差不多啦,

噯氣,懂得太少了!

上午應(yīng)王建華的需求改了路燈終端的AT93C56的CS引腳,下午才知道,本來是對(duì)的上午他媽的改錯(cuò)了!暈死,建華不該亂說。我懶得看手冊(cè),沒拆穿建華!

下午王建華說他找到了問題所在,原因在于93c6\56和7053之間公用的SPI接口的Dout被拉長(zhǎng)高電平,導(dǎo)致7053無法拉低,所以讀出來的是一個(gè)巨大的數(shù)據(jù),F(xiàn)FFFff,

下午對(duì)GPRS的回復(fù)信號(hào)做了處理,加上了比較和返回值,

uint8_t  Wait_Gprs_Sure( char *pstr,int len,char *s)
{
   char *rep;
   char *index;
      
       rep = Gprs_Get_Respond();  //save respond data and pointer to it

    index = strstr(rep,pstr);   //find string in dst add
   if(index==((char*)0))
   {
     Mbus_Send_String ("no string !\r\n");
    return ;
   }
if(0== memcmp (index ,pstr,len-1))
  {
  
   // Mbus_Send_String ("ok \r\n");
    Mbus_Send_String (s);
   //Mbus_Send_Data(char*p,uint8_t len)
  }
  else
     {
  
     Mbus_Send_String ("err!\r\n");
      }


   
   return 0;
}

值得注意的是內(nèi)存池里面的數(shù)據(jù)直接用STRSTR查找的時(shí)候他碰到‘\0’就返回,所以要加以處理,不然你是查不到的,我的辦法是:
uint8_t  *Gprs_Get_Respond(void)
{  
         uint8_t l,k;
   memset(Gprs_app,1,80);
   len=QueueLength(&Gprs_ctrl_Queue);//updata the "lne"
  for(k=0;k<len;k++)
  {
    DeQueue(&Gprs_ctrl_Queue,&l);
   if(l==0)l=0x0d;
   Gprs_app[k]=l; //save into buff of app

  
  }   k++;
     Gprs_app[k]='\0';
    return Gprs_app;
}
這樣一來就可以順利的比對(duì)了,哈哈,辦法是笨,但是。。。。。!

晚上劉總說有幾個(gè)開關(guān)不好用,我跟蹤了下,兩鍵的開關(guān)老是進(jìn)第三個(gè)IS人,所以我屏蔽掉第三個(gè)之后,安裝上了,上電實(shí)驗(yàn)還行,不必要的通道要及時(shí)的屏蔽掉,以免干擾正常的工作,其實(shí)開關(guān)沒有死,他一直在進(jìn)中斷,沒時(shí)間干別的,所以看起來就像死了一樣,也許還有其他的原因吧,有待時(shí)間去慢慢驗(yàn)證啊,有時(shí)候真是倒霉催的,莫名其妙!盡力。。。。


回復(fù)

使用道具 舉報(bào)

ID:82781 發(fā)表于 2015-6-13 15:45 | 顯示全部樓層
今天主要是對(duì)GPRS的鏈接做了點(diǎn)處理和測(cè)試,雙向心跳包,一個(gè)是客戶端主動(dòng)發(fā),一個(gè)是服務(wù)器主動(dòng)發(fā),但是呢我碰到一個(gè)問題,那就是 在客戶端檢測(cè)到?jīng)]有心跳包之后,要主動(dòng)發(fā)送一個(gè)類似socket的close命令,但是呢,發(fā)完這個(gè)命令,在想要綁定到CMNET就幫不上了,導(dǎo)致鏈接失敗,后來查閱手冊(cè)GPRS說是要提前進(jìn)入init狀態(tài),后來加了條初始化IP狀態(tài),就好了,暈暈的。。這才是萬里長(zhǎng)征第一步,早來!在等待返回?cái)?shù)據(jù)和解析上我做的不是很好,有待改進(jìn)啊。。。。
  char *rep;
   char *index;
      
       rep =(char*) Gprs_Get_Respond();  //save respond data and pointer to it

    index = strstr(rep,pstr);   //find string in dst add
   if(index==((char*)0))
   {
         //Exception Handling

           index = strstr(rep,"CLOSE");   //find string in dst add
      if(index==((char*)0))
     {

         index = strstr(rep,"ERROR");   //find string in dst add  
          if(index==((char*)0))
         {
      
        Mbus_Send_String ("no string !!\r\n");
        Exception_Handling_Evet=1;
      
         }
         else
         {
           Mbus_Send_String ("This is a Error!!\r\n");
             Exception_Handling_Evet=1;
         }

   
     }
     else
     {
              Mbus_Send_String ("SEVER IS CLOSED !!\r\n");
     Exception_Handling_Evet=1;
     }
   


    return 0;
   }

if(0== memcmp (index ,pstr,len-1))
  {
  

    Mbus_Send_String (s); //successfully

  }
  else
     {
  
     Mbus_Send_String ("err!!\r\n");
      }


回復(fù)

使用道具 舉報(bào)

ID:82781 發(fā)表于 2015-6-13 15:46 | 顯示全部樓層
下午主要是在搞基于dhcp客戶端上的無線協(xié)議的移植的透?jìng)髟O(shè)備程序,由于之前和上位機(jī)軟件調(diào)試了DHCP,所以只要移植上無線驅(qū)動(dòng)和協(xié)議就好啦,碰到一個(gè)苦逼問題,就是沒開時(shí)種啊,暈死,以前的程序忘了做聲明,導(dǎo)致了漏掉了始終那一檔子事, 讀取來的ID是錯(cuò)誤的,搞了一下午,噯氣八八!不行不行!低落ing,

GPRS仍然再測(cè),一切良好,可以用一個(gè)低成本的處理起來實(shí)現(xiàn),夠用,gprs抄表的項(xiàng)目似乎領(lǐng)導(dǎo)們不太中意,我卻看的很重,這個(gè)東西還是可以的,以后來說,用處還是大點(diǎn)的,雖然慢點(diǎn),但是小數(shù)據(jù)量,無線傳輸?shù)膱?chǎng)合可以了,總不能每個(gè)都托根電線吧。所以我投入了大量的時(shí)間來處理鏈接的可靠性,告一段落了,剩下的時(shí)間就是永無休止的測(cè)測(cè)測(cè)測(cè)。。。。。。。。

還偶有一屁股的事情要做,路燈的通道板要做,完善,好幾個(gè)小的整套測(cè)試程序都沒做,還哦有好幾個(gè)開關(guān)的程序要完善那,
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表