小编刚刚经历了劫难似的毕业答辩,在经历过对十几个人的毕设帮助后,小编成功对于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);//等待发送成功;有这句话,就比较严谨,不会出现上一个还没发出去,这次就发出去的现象。
}
看了上述例子有没有清晰,如果没有的话,欢迎关注我们的公众号,可以和我们在线沟通,也支持远程网络调试哦。
领取专属 10元无门槛券
私享最新 技术干货