基於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,"熄滅");
}
}
直接複製就能用