STM32单⽚机串⼝接收中断函数的编写
其实学单⽚机使⽤的时候,往往⼤家都觉得简单,很快就过了,但其实有⼀些东西是值得深思的,我以前在写程序的时候往往都是发送数据,那么调⽤重写的printf()函数就可以了,但这次的项⽬中⽤到了NRF双全⼯通讯,这就需要串⼝的收发,这回就发⽣了写问题,具体的流⽔账就不说了。简单说就是串⼝收可⽐发讲究多了。
1.
void USART1_IRQHandler(void)//串⼝1中断服务程序
2.
{
3.
u8 i;
4.
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
//如果寄存器中有数据
5.
{
USART_RX_BUF[RxCounter++] = USART_ReceiveData(USART1);
7.
//在这个位置,没有加这条数据帧判断语句,出现了类似于移位的错误,我需要连续发送40次才能得到正确的序列,具体原因不明8.
//当时我考虑的是报上位机的发送,移到下位机,没想到⼀下⼦就可以了
9.
if( (USART_RX_BUF[
0]==
'$') &&  (USART_RX_BUF[
1]==
'M') && (USART_RX_BUF[
2] ==
'<' )&& (USART_RX_BUF[
27] ==
'<' )&& (USART_RX_BUF[
28] ==
'<' ) )
10.
{
11.
12.
{
13.
RxCounter =
0;
14.
}
15.
text函数什么意思}
16.
}
17.
19.
上述代码段是我地⾯站的串⼝中断程序,虽然不难,但是有讲究:
20.
1.串⼝每次中段读出的是多少数据,那么打开固件库看,是⼀个
uint16_t类型,所以说每次串⼝是读了⼀个字进来,那我们⽤
uint16_t的⼀个变量接受⾃然没问题,那么⽤u8接收可以么,因为我马上就要将串⼝数据⽆线发出去,⽆线通讯中⼀般都是
char型为基本单元,答案是可以,所以应该是发⽣了隐式类型转换,如果编译器不允许,那么考虑拆分字节传输。
21.
2.我没加这条协议判断语句的时候USART_RX_BUF⾥⾯的内容⼀致不是我想要的,数据头和尾⼀直内容不对,后来我发现,我连续上位机传输
40次的时候就出现了正确序列,这说明上位机确实将正确数据发出去了,我在上位机的debug中也验证这⼀点,那么地⾯站程序接受的时候不知道发⽣了什么。
22.
怀疑:串⼝地⾯站接受程序有问题,上位机因为是linux的qt写的,考虑上位机输出有问题。
23.
void USART1_IRQHandler(void)//串⼝1中断服务程序25.
{
26.
u8 i;
27.
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //如果寄存器中有数据
28.
{
29.

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。