要实现接收串口字符串信息就要进行数据对比,本来使用的是for循环
#include <stdio.h>
int main()
{
char str[256];
scanf("%s",str);
int a,b,c;
for(int m=0;m<=254;m++)
{
if(str[m]=='L'&str[m+1]=='E'&str[m+2]=='D')
return printf("LED亮");
}
}
特意在devC++上测试了一下可行性,发现可行然后就放到了工程主函数里面
经过测试,灯是亮了但是发送了20多次,然后询问学长,学了一下strstr函数,只能说是真的好用,上面那一堆变成了两行。
if(strstr((const char *)str,"LED"))//判断参数二是否是1的子串
{
LED1_TOGGLE;//LED1状态翻转翻转
}
完整主函数是这样的
/* 包含头文件 ----------------------------------------------------------------*/
#include "stm32f10x.h"
#include "usartx.h"
#include "led.h"
#include <string.h>
uint8_t Rxflag=0;
uint8_t ucTemp;
int main(void)
{
uint8_t ucaRxBuf[256];
uint16_t usRxCount;
LED_GPIO_Init();
/* USART 配置模式为 115200 8-N-1,中断接收 */
USARTx_Init();
Usart_SendString("这是一个串口中断接收回显实验\n");
Usart_SendString("输入数据并以回车键结束\n");
/* 简单的通信协议,遇到回车换行符认为1个命令帧 */
usRxCount = 0;
/* 无限循环 */
while (1)
{
if(Rxflag)
{
if (usRxCount < sizeof(ucaRxBuf))//sizeof为占用空间字节数关键字
{
ucaRxBuf[usRxCount++] = ucTemp;
}
else
{
usRxCount = 0;
}
/* 遇到换行字符,认为接收到一个命令 */
if (ucTemp == 0x0A) /* 换行字符 */
{
// Usart_SendStr_length(ucaRxBuf,usRxCount);//串口发送字符串
// usRxCount = 0;
unsigned char str[256];
for(unsigned int m=0;m<sizeof (ucaRxBuf);m++)
{
str[m]=ucaRxBuf[m];
}
for(int m=0;m<=254;m++)
{
if(strstr((const char *)str,"LED"))//判断参数二是否是1的子串
{
LED1_TOGGLE;//LED1状态翻转翻转
}
else
{
Usart_SendStr_length(ucaRxBuf,usRxCount);//如果没有LEd,输出输入字符串
}
}
usRxCount = 0;
}
Rxflag=0;
}
}
}
/******************************************************************************/
/* STM32F10x Peripherals Interrupt Handlers */
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
/* available peripheral interrupt handler's name please refer to the startup */
/* file (startup_stm32f10x_xx.s). */
/******************************************************************************/
//外设中断处理函数
void USARTx_IRQHANDLER(void)
{
if(USART_GetITStatus(USARTx, USART_IT_RXNE) != RESET)//判断中断函数是否置位
{
Rxflag=1;
ucTemp = USART_ReceiveData(USARTx);//串口接收数据函数,一次一字节
}
}
如果大家有更好的办法欢迎讨论。