首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

你容易搞混字符串?其实我也是

小编刚刚经历了劫难似的毕业答辩,在经历过对十几个人的毕设帮助后,小编成功对于C语言字符串的各种应用,以及在单片机中的各种应用了熟于心。

切入正文,在单片机当中,经常需要对字符串进行各种骚操作,最常见的莫过于使用串口发送数据或者是接收数据,那么接下来,我们就f以最常用的stmf10x系列单片机的应用为例,对字符、字符串的操作做详解。

单片机需要通过串口接收数据,然后做处理。假设接收到的数据是要给一个PWM占空比控制寄存器赋值,那么最简单的一句话就是:

res =USART_ReceiveData(USART2);//串口接收函数;

TIM_SetCompare2(TIM3,res);//改变TIM3的CH2通道的占空比;

但是这一次只能接收一个8位的数而已,即最大的接收值是255,而且在用串口助手发送时,以十六进制格式(HEX)发送,先得把十进制转化为十六进制,比较麻烦,因此我们引入字符串,在串口助手发送数据时,以文本模式发送,此时,文本模式下输入100,那么通过串口将会发送三个数据,即1的ASCII码49(0X31),0的ASCII码48(0X30),0的ASCII码48(0X30),也就是说串口实际会发送 0X31 0X30 0X30,(大部分串口助手文本模式发送时,会自带发送\r\n两个符号,这也就是为什么,我们有时候用串口助手发送AT指令配置某模块时会出错的缘故了)。

既然发送过来的是三个ASCII码,那么我们接收也应该是用数据去接收的,当然,大家的接收函数也不一定非要相同,只要接收到的数据可以放进一个数组里就可以了:

/*这是将接收到的数据放进str这个数组当中*/

int buffer=20;//这个长度根据自己需要可以定义

u8 i;

u8 str[buffer];

u8 res;

if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//接收到数据

{

res =USART_ReceiveData(USART2);

if(USART2_RX_STA

{

TIM_SetCounter(TIM4,0);//计数器清空

if(buffer==0)TIM4_Set(1);//使能定时器4的中断

str[buffer++]=res;//记录接收到的值

}

else

{

USART2_RX_STA|=1

}

在接收完数据后,我们就要做进一步的处理,需要用到一个C语言的库函数,因此,需要调用头文件,用到的函数是int atoi(const char *nptr);atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数;具体用法如下:

int num;

num = atoi( (char*) str );

此时num就是转化完的整型数据,值得注意的是,atoi函数在发现某一 个值不是数字时,就会终止转化。

2.串口发送,这个就简单的不能在简单了,不废话,直接看例子:

UART3SendString("hello world \r\n",strlen("hello world \r\v"));

void UART3SendString(u8 *cmd,u16 len)

{

u16 i=0;

while((*(cmd+i)!=0)&&(i

{

UART3SendByte(*(cmd+i));

i++;

}

}

但是吧,上述例子好像并没有体现出数组,那我在来一个数组的吧:

u8 str[]="hello world";

u8 i;

for(i=0;i

{

USART_SendData(USART3,str[ i ]);//发送一个8位的数据;

while(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == RESET);//等待发送成功;有这句话,就比较严谨,不会出现上一个还没发出去,这次就发出去的现象。

}

看了上述例子有没有清晰,如果没有的话,欢迎关注我们的公众号,可以和我们在线沟通,也支持远程网络调试哦。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180608G0W5FC00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券