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

您所在的位置:网站首页 fpga温度传感器控制led亮灭 基于stm32F1发送串口指令控制LED,并将指令打印到串口调试助手

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

2024-07-09 02:35| 来源: 网络整理| 查看: 265

已经完全实现用汉字指令控制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[]数组中,然后再逐个字节的返回。 效果: 在这里插入图片描述 在这里插入图片描述 至于单片机执行命令的视频就不发了,太难拍视频了。。。

希望对大家有帮助。

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3