字符串操作案例1.拼接字符串
static char SEND_S[13] = {'A','T','+','C','I','P','S','E','N','D','=','1',','};
static char SEND_X[23] = {',','"','1','9','2','.','1','6','8','.','1','0','.','1','"',',','8','8','8','9','\r','\n'};
static char COMMAND[99];
memset( COMMAND, 0, sizeof( COMMAND) );
strcat( COMMAND, SEND_S);
strcat( COMMAND, SEND_X);
2.对⽐字符串
if( strstr(_udp_rece,"WIFI DISCONNECT") != 0 )  //wifi断开
{
}
3.字符串转整型
int char_int( const char *cha )  //字符串转整型
{
u8 data[8]={0,0,0,0,0,0,0,0};
int temp = 0,ret = 0;
u8 num = 0,err = 0,i = 0,j=0; //位数正负
while( *cha )
{
if( ( *cha >= '0') && ( *cha <= '9' ) )
{
data[num] = (*cha - '0');
num++;
}
if( *cha == '-' )  //负号
{
err = 1;
}
字符串函数例子cha++;
}
for( j = 0; j < num; j++  )
{
temp = data[j];
for( i = num - j - 1; i>0 ; i-- )
{
temp *= 10;
}
ret += temp;
}
if( err == 1 )
{
ret = -ret;
}
return ret;
}
4.整型转字符串
void itoa (int n,char *s)  //整型转字符串
{
char temp[10];
int i = 1,j = 0,sign = 0;
memset( temp, 0 ,10 );
if( n < 0 )//记录符号
{
n=-n;//使n成为正数
sign = -1;
}
do
{
temp[i++]=n%10+'0';//取下⼀个数字
}
while ((n/=10)>0);//删除该数字
if(sign<0)
{
temp[i++]='-';
}
temp[0]='\0';
for(j=i-1;j>=0;j--)//⽣成的数字是逆序的,所以要逆序输出
{
*s = temp[j];
s++;
}
}
5.取出指定的数据:
字符串数据为:mid:xxx,x:xxx,y:xxx,z:xxx,yaw:xxx,h:xxx中间数据位数不固定static void req_tello(const char *req)
{
u8 step = 0,i=0;
u16 j = 0;
char *mid = "mid:";
char *yaw = ";yaw:";
char *h = ";h:";
char *temp;
j = _rece_num;
while(j--)
{
switch ( step )
{
case0: //取出mid数据
temp = strstr( req,mid);
while( *temp != ':' )
{
temp++;
}
while(1)
{
temp++;
if( *temp == ';' ) //跳出
{
i = 0;
step = 1;
break;
}
else
{
requ_tello[step][i] = *temp;
i++;
}
}
break;
case1:  //取出x轴坐标数据
while( *temp != ':' )
{
temp++;
}
while(1)
{
temp++;
if( *temp == ';' ) //跳出
{
i = 0;
step = 2;
break;
}
else
{
requ_tello[step][i] = *temp;
i++;
}
}
break;
case2:  //取出y轴坐标数据
while( *temp != ':' )
{
temp++;
}
while(1)
{
temp++;
if( *temp == ';' ) //跳出
{
i = 0;
step = 3;
break;
}
else
{
requ_tello[step][i] = *temp;
i++;
}
}
break;
case3:  //取出z轴坐标数据
while( *temp != ':' )
{
temp++;
}
while(1)
{
temp++;
if( *temp == ';' ) //跳出
{
i = 0;
step = 4;
break;
}
else
{
requ_tello[step][i] = *temp;
i++;
}
}
break;
case4:  //取出航偏⾓数据
temp = strstr( temp,yaw);
while( *temp != ':' )
{
temp++;
}
while(1)
{
temp++;
if( *temp == ';' ) //跳出
{
i = 0;
step = 5;
break;
}
else
{
requ_tello[step][i] = *temp;
i++;
}
}
break;
case5:  //取出⾼度数据
temp = strstr( temp,h);
while( *temp != ':' )
{
temp++;
}
while(1)
{
temp++;
if( *temp == ';' ) //跳出
{
i = 0;
step = 6;
break;
}
else
{
requ_tello[step][i] = *temp;
i++;
}
}
break;
case6:  //将取出的字符串数据转换为整型
for( i=0; i<6; i++ )
{
tello_data[i] = char_int( &requ_tello[i][0] );      }
_send_data[0] = 0x6A;
_send_data[1] = 0x6A;
_send_data[2] = BYTE1( tello_data[0] );      _send_data[3] = BYTE0( tello_data[0] );      _send_data[4] = BYTE1( tello_data[1] );      _send_data[5] = BYTE0( tello_data[1] );      _send_data[6] = BYTE1( tello_data[2] );      _send_data[7] = BYTE0( tello_data[2] );      _send_data[8] = BYTE1( tello_data[3] );      _send_data[9] = BYTE0( tello_data[3] );      _send_data[10] = BYTE1( tello_data[4] );      _send_data[11] = BYTE0( tello_data[4] );      _send_data[12] = BYTE1( tello_data[5] );      _send_data[13] = BYTE0( tello_data[5] );
memset(requ_tello,0,sizeof(requ_tello));
_sendflag = 1;
step = 7;
break;
}
if( step == 7 )
{
break;
}
}
}
6.利⽤空闲中断接收不固定长度的数据
stm32f103系列:
void USART1_Configuration(void)      //串⼝1配置---M
{
DMA_InitTypeDef DMA_InitStructure;
USART_InitTypeDef USART_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//  DMA_InitTypeDef DMA_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&( USART1->DR);
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)_udp_rece;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = RESUM;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //HalfWord
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular ;      // DMA_Mode_Normal
DMA_InitStructure.DMA_Priority =  DMA_Priority_High; //DMA_Priority_Low  DMA_Priority_Medium  DMA_Priority_High  DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA1_Channel5, &DMA_InitStructure);
//NVIC 设置,使能中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                    //选择中断分组1
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;            //选择串⼝3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;      //抢占式中断优先级设置为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;            //响应式中断优先级设置为1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                //使能中断
NVIC_Init(&NVIC_InitStructure);
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);//开启中断
//USART1
//TX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//RX
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_OverSampling8Cmd(USART1, ENABLE);
USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_DMACmd(USART1,USART_DMAReq_Rx,ENABLE);
DMA_Cmd(DMA1_Channel5, ENABLE);
USART_Cmd(USART1, ENABLE);
USART1->SR;
USART1->DR;
}
void USART1_IRQHandler(void)
{
flagus1 = USART1->SR;
if( USART_GetFlagStatus( USART1, USART_FLAG_IDLE ) == SET ) //发⽣空闲中断
{
DMA_Cmd(DMA1_Channel5, DISABLE);  //关闭DMA输出
_rece_num = RESUM - DMA1_Channel5 ->CNDTR; //获取读到的字节数for( u8 i = 0; i < _rece_num; i++ )
{
_rece_data[i] = _udp_rece[i];
}
//处理数据
DMA1_Channel5->CNDTR = RESUM;  //重新填充
DMA_Cmd(DMA1_Channel5, ENABLE);  //开启DMA传输
USART_ClearITPendingBit( USART1, USART_IT_IDLE ); //清除中断}
USART1->SR;
USART1->DR;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。