基于stm32F1发送串口指令控制LED,并将指令打印到串口调试助手 |
您所在的位置:网站首页 › fpga温度传感器控制led亮灭 › 基于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) { ;//等待 } }功能实现: 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 |