stm32如何用串口接收的16进制数控制单片机的端口位,求大神给指导下

如题所述

第1个回答  2016-12-08
串口一般只能接受8位的数据,也就是按字节进行传输,要是数据超过1个字节的和数据,你就需要建立协议来进行数据重组。这就涉及到大小端问题(你是先发送高8位还是低8位),断帧问题(可通过添加特定字符组成的帧头帧尾来识别,或者通过时间间隔来识别)。
简单的介绍一下操作方法,每接收一个字节数据,你就在串口中断函数里面把数据取出来放到一个足够长的数组中去,记得依次往后增加地址。
接着你可以通过以上提到的两种方式断帧,判定为此次收到一帧数据后,重组数据并处理数据,接着清空上面的数组,好让后面收到的数据有空间放进去,以此不断循环即可实现协议通讯。追问

求个实历

追答

实例倒是有,但你那里也没有配套的硬件啊,你怎么测试?怎么看效果?怎么根据自己的需求修改?
你在网上搜一些STM32的串口例程就行了,人家有注释有解释,多看看就学会了。我给的,你都不一定看得懂,而且需要很多前提条件程序才能正常执行,毕竟这是项目上的,等你搞懂,N多个程序你都写出来了。

追问


我定义了个数,我随便发个数都有变化,但是好像不是按16进制数变化的,比如我发个A二进制应该是1010但是B端口实际变化是1000001(后面估计还有我只用了7个脚,后面不管)但也对不上号呀

追答

第42行的if判断,括号中你确定是一个赋值?而不是一个等值判断?是否该用“==”符号?
为什么在一个中断接受里面,你执行了两次获取收到的串口数据(第一次收到的数据被发送出去了,第二次收到的是什么我都不能确认)?
你是通过PB并口显示的数据?PB0-PB7都初始化了么?为什么不直接使用断点看数据?
想把收到的数据再发出去,正确的顺序应该是(40行开始):
a=USART_ReC........(UART1);
USART_Send...(UART1,a);
GPIO_Write(GPIOB,a);
这样才对吧?
另外,中断标志貌似没有清除。

本回答被网友采纳
第2个回答  2016-12-08
做个协议,对8位数据重组就行了本回答被提问者采纳
相似回答