【cc3200】向服务器发送温度数据

来源:互联网 发布:数据库添加数据 编辑:程序博客网 时间:2024/05/22 02:03

基于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,"熄灭");    }}

直接复制就能用

原创粉丝点击