赞
踩
已经完全实现用汉字指令控制LED,并且将汉字指令打印到串口调试助手上
串口调试助手是XCOM2.0
代码是在正点原子“串口实验”基础上进行的改动。
源代码实现的功能:单片机通过串口和PC端进行通话,单片机收到PC端发过来的字符串后,原原本本的返回给PC端。
所以关于串口的配置,以及如何实现单片机将字符串原原本本的返回给PC端就不怎么说了,因为正点原子原视频讲的很详细,主要是定义了一个协议,而这个协议很重要(不过我还是不太理解,会拿过来用就好了)。
下面的是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 © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。