基于stm32F1发送串口指令控制LED,并将指令打印到串口调试助手

已经完全实现用汉字指令控制LED,并且将汉字指令打印到串口调试助手上

串口调试助手是XCOM2.0
代码是在正点原子“串口实验”基础上进行的改动。

源代码实现的功能:单片机通过串口和PC端进行通话,单片机收到PC端发过来的字符串后,原原本本的返回给PC端。

所以关于串口的配置,以及如何实现单片机将字符串原原本本的返回给PC端就不怎么说了,因为正点原子原视频讲的很详细,主要是定义了一个协议,而这个协议很重要(不过我还是不太理解,会拿过来用就好了)。

第一个过程中(没有用源代码收发协议),只是通过检测发送的十六进制0X00和0XFF分别控制LED的亮灭,如下:

下面的是usart.c程序中的中断函数

// An highlighted block
void USART1_IRQHandler(void)                	//串口1中断服务程序
{
	uint8_t Res = 0;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
	{
		Res =USART_ReceiveData(USART1);	//读取接收到的数据
		printf("发送的消息是:%d\r\n",Res);
		if(Res==0XFF)
			{
				GPIO_SetBits(GPIOC,GPIO_Pin_13);
				delay_ms(1000);
			}
		if(Res==0X00)
		{
			GPIO_ResetBits(GPIOC,GPIO_Pin_13);
            delay_ms(1000);
		}		
    while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待数据发送完		
	}	
}

下面的是主函数,主函数中除了有关的声明外并没有执行任何操作:

// An highlighted block
int main(void)
{	
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 	 //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);
	delay_init();
	LED_Init();	
	while(1)
	{
		;//等待
	}	 	
}

功能实现:
在这里插入图片描述
可以实现控制LED的亮灭,但是有一个问题,串口调试助手除了显示发送的0X00和0XFF以外,还会自动跟上一个0X0D(也就是13)结尾。

0XOD虽然我懵懵懂懂知道它是一个判断数据结束的标志位,但是我一直想怎么才能让串口调试助手不显示最后的这个判断位,而只是显示有效数值。

一遍又一遍的尝试,我尝试把这个程序和正点原子的源程序结合一下。

如图:
在这里插入图片描述
主函数一点没有改动,结果怎么样那?

我用调试助手调试时,

①勾选上“以16进制发送”时,单片机能够根据指令做出相应的动作,但是串口却不显示我发送的命令。

②当我不勾选“以16进制发送”时,发送什么能原原本本的显示什么,但是单片机不做出相应的动作,不执行命令。

我愁啊,但是最后很幸运,看见了一位大佬的博客,一击致命。

uasrt.c文件没有改动(也就是说原子哥定义的收发协议没有改动),只是把单片机的执行命令函数放在了主函数中,而且用的是非常巧妙的方法:

// An highlighted block
if(!(strcmp(USART_RX_BUF,"打开"))) 
			{
			    LED2=0;//PC13
			}
      if(!(strcmp(USART_RX_BUF,"关闭"))) 
			{
			    LED2=1;
			}

用的strcmp函数,和我们要发送的数据进行判断,判断结果肯定是想让两者相等
自己仔细想一下,其实很对,我们最终是怎么把数据返回给PC端的那?

是通过自己将信息先存放在 USART_RX_BUF[]数组中,然后再逐个字节的返回。
效果:
在这里插入图片描述
在这里插入图片描述
至于单片机执行命令的视频就不发了,太难拍视频了。。。

希望对大家有帮助。

串口 一个很重要的应用,我要了解它的东西还有很多
加油。

  • 20
    点赞
  • 134
    收藏
    觉得还不错? 一键收藏
  • 23
    评论
评论 23
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值