【cc3200】向服務器發送溫度數據

基於tcp_socket和i2c_demo修改而成

1、打開i2c_demo的PinMuxConfig,將裏面關於I2C的配置複製過來

MAP_PRCMPeripheralClkEnable(PRCM_I2CA0, PRCM_RUN_MODE_CLK);
    //
    // Configure PIN_01 for I2C0 I2C_SCL
    //
    MAP_PinTypeI2C(PIN_01, PIN_MODE_1);

    //
    // Configure PIN_02 for I2C0 I2C_SDA
    //
    MAP_PinTypeI2C(PIN_02, PIN_MODE_1);

在mian(){}中加入這麼一句話

I2C_IF_Open(I2C_MASTER_MODE_FST);

然後記得把i2c_if.c複製過來

2、寫一個用來獲取溫度的函數,這一段參考郭書軍老師的《CC3200應用指南》

void getTemp(char *temp){

        int iRetVal=0;
        unsigned char ucData[2];
        ucData[0]=1;//初始化
        I2C_IF_Write(0x41,&ucData[0],1,0);//地址指向溫度寄存器

        //獲取溫度
        iRetVal=I2C_IF_Read(0x41,&ucData[0],2);//讀取溫度值存入ucData

        //讀取成功,處理並顯示溫度
        if(!iRetVal){
            unsigned short usTemp=(ucData[0]<<8)+ucData[1];
            if( !(usTemp & 0x8000) ){//處理正溫度值
                int i=0;
                i+=sprintf(temp,"%d.",usTemp>>7);
                i+=sprintf(temp+i,"%d",( (usTemp&0x7f)*25 )>>5);
            }
         }
}

3、在WuartTransfer方法的接收數據部分增加一個檢測,關注cRxBufNum

int WuartTransfer(unsigned long ulBase,int iSockID){

    UART_PRINT("進入WuartTransfer\n\r\n\r");
    int iStatus=0;
    char cTxBuf[100];
    char cRxBuf[100];
    char cTemp[10];
    char cGetChar;
    char iCounter=0;

    while(1){

        cGetChar=MAP_UARTCharGetNonBlocking(ulBase);

        if(cGetChar!=0xff){

            //MAP_UARTCharPut(ulBase,cGetChar);
            cTxBuf[iCounter++]=cGetChar;

            //0x0d回車Enter,0x1b退出Esc
            if(cGetChar==0x0d||cGetChar==0x1b){
                UART_PRINT("\r\n發送的數據爲:%s\r\n",cTxBuf);
                UART_PRINT("\r\n當檢測到串口輸入的數據中包含回車或十六進制1b時進入此方法\r\n");

                cTxBuf[iCounter++]=0x0a;//回車(0x0d)和換行(0x0a),發送數據要在後面加0d0a,即\r\n

                iStatus=sl_Send(iSockID,cTxBuf,iCounter,0);//發送給服務端

                if(iStatus<=0){
                        ASSERT_ON_ERROR(sl_Close(iSockID));
                        UART_PRINT("發送數據失敗\n\r\n\r");
                        break;
                }

                //判斷輸入的到底是哪個
                if(cGetChar==0x0d){
                    iCounter=0;
                }else{
                    break;
                }
            }//if(cGetChar==0x0d||cGetChar==0x1b)

        }//if(cGetChar!=0xff)
        iStatus=sl_Recv(iSockID,cRxBuf,100,0);

        if(iStatus>0){
            if( cRxBuf[iStatus-2]==0x0d ){
                cRxBuf[iStatus]=0;
                UART_PRINT("\r\n\r\nsl_Recv方法執行成功,iStatus=%d,接收到的數據爲\r\n\r\n",iStatus);
                UART_PRINT("\r\n\r\n%s\r\n\r\n",cRxBuf);

                int cRxBufNum=atoi(cRxBuf);
                if(cRxBufNum==0){
                    GPIO_IF_LedOff(MCU_RED_LED_GPIO);//收到0滅燈
                }
                if(cRxBufNum==1){
                    GPIO_IF_LedOn(MCU_RED_LED_GPIO);//收到1亮燈
                }
                if(cRxBufNum==3){

                    //收到3返回溫度值
                    getTemp(cTemp);
                    sprintf(cTxBuf,"now temp=%s",cTemp);
                    iStatus=sl_Send(iSockID,cTxBuf,100,0);//發送給服務端

                    if(iStatus<=0){
                            ASSERT_ON_ERROR(sl_Close(iSockID));
                            UART_PRINT("發送數據失敗\n\r\n\r");
                            break;
                    }

                }
            }else{
                break;
            }
        }//if(iStatus>0)

    }//while(1)

    return iStatus;
}

4、爲了簡便,我還是用socket工具模擬服務器,
先打開串口助手,然後選擇連接到服務端,發送一個2,服務端顯示
【23:00:08 收到數據:2】
然後服務端發送1,單片機接收到數據打印在串口上,並讓LED燈點亮
服務端發送0,單片機串口顯示0,讓LED燈熄滅
服務端發送3,單片機串口顯示3,並且返回溫度信息,服務端顯示
【23:00:37 收到數據: now temp=29.43】

單片機串口
這裏寫圖片描述

服務端:
這裏寫圖片描述

其他數據的獲取函數

void getAcceleration(char* acc){
    int iRetVal=0;
    unsigned char ucData2[6];
    ucData2[0]=2;
    I2C_IF_Write(0x18,&ucData2[0],1,0);//地址指向加速度寄存器
    iRetVal=I2C_IF_Read(0x18,&ucData2[0],6);//讀取加速度值存入ucData2
     if(!iRetVal){//成功,處理加速度數據
         int i=0;
         i+=sprintf(acc+i,"x=%03d  ",ucData2[1]);
         i+=sprintf(acc+i,"y=%03d  ",ucData2[3]);
         i+=sprintf(acc+i,"z=%03d  ",ucData2[5]);
     }
}

void getMac(char *mac)
{
    //獲取mac地址
    _u8 macAddressVal[SL_MAC_ADDR_LEN];
    _u8 macAddressLen = SL_MAC_ADDR_LEN;
    sl_NetCfgGet(SL_MAC_ADDRESS_GET,NULL,&macAddressLen,(_u8 *)macAddressVal);
    //將整型數組轉換成字符串數組
    int dizhi=0,i=0;
    for(;i<6;i++){
        dizhi+=sprintf(mac+dizhi,"%x.",macAddressVal[i]);
    }
}

void getGPIO(char* gpio){

    UART_PRINT("\r\n\r\n進入getGPIO方法\r\n\r\n");

    float a=0;
    a=getTemp();

    if( a>30 ){//判斷是否大於30
        MAP_GPIOPinWrite(GPIOA1_BASE,2,2);//紅燈亮
                strcpy(gpio,"點亮");

    }else{
        MAP_GPIOPinWrite(GPIOA1_BASE,2,0);//紅燈熄滅
                strcpy(gpio,"熄滅");
    }

}

直接複製就能用

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章