stm32串口一直快速发送空字符串

stm32串口一直快速发送空字符串,第1张

程序中的逻辑错误。
STM32串口快速发送空字符串的原因,程序中的逻辑错误:在程序中可能存在逻辑错误,导致串口在没有接收到数据的情况下不停地发送空字符串。
STM32串口是指STMicroelectronics公司生产的STM32系列单片机上的串行通信接口,STM32串口通常包括USART、UART和SPI等几种不同的接口类型,其中USART和UART是最常用的两种。

在STM32串口实验中,要实现发送1亮灯的功能,需要进行以下步骤:
1 首先,需要在STM32的开发环境中创建一个工程,并选择使用串口进行通信。
2 在工程中,需要编写相应的程序代码,包括初始化串口和LED等外设。
3 在程序中,需要定义发送数据和接收数据的缓冲区,并设置串口的波特率、数据位、校验位和停止位等参数。
4 在发送数据的函数中,需要将要发送的数据放入发送缓冲区中,并启动串口发送中断。
5 在接收数据的函数中,需要从接收缓冲区中读取数据,并进行相应的处理。
6 在程序中,需要通过适当的逻辑判断实现发送1亮灯的功能,例如当接收到字符“1”时,控制LED亮起。
7 最后,需要将程序下载到STM32单片机中,并连接相应的硬件设备进行测试。
总之,实现STM32串口实验发送1亮灯需要掌握串口通信的相关知识和编程技巧,同时需要熟悉STM32的硬件架构和相应的开发工具。

int UART_WriteBuf(u8 byCom, u8 pBuf, u16 Len)
{
int i = 0;;
if(Len == 0)
return 0;
switch(byCom)
{
case 1 :
Uart_datasend_len = Len - 1;
Uart_dataj = 1;
memmove(Uart_datasend_buff,pBuf,Len);
USART_ITConfig(USART1, USART_IT_TC, ENABLE);
USART_SendData(USART1, pBuf);
break;
case 2 :
Uart_datasend_len = Len - 1;
Uart_dataj = 1;
memmove(Uart_datasend_buff,pBuf,Len);
USART_ITConfig(USART2, USART_IT_TC, ENABLE);
USART_SendData(USART2, pBuf);
break;
case 3 :
Uart_datasend_len = Len - 1;
Uart_dataj = 1;
memmove(Uart_datasend_buff,pBuf,Len);
USART_SendData(USART3, pBuf);
USART_ITConfig(USART3, USART_IT_TXE, ENABLE);
break;

}
return Len;
}
void USART3_IRQHandler(void)
{
int j = 0;
if(USART_GetITStatus(USART3,USART_IT_RXNE))
{
USART_ClearITPendingBit(USART3,USART_IT_RXNE);
Uart_datarec_buff[Uart_datarec_len] = USART_ReceiveData(USART3);
Uart_datarec_len ++;
if(Uart_datarec_len >= UART_DATA_SIZE) //防止数组越界
Uart_datarec_len = UART_DATA_SIZE - 1;
}
else if(USART_GetITStatus(USART3,USART_IT_TXE))
{
USART_ClearITPendingBit(USART3,USART_IT_TXE);
USART_ClearFlag(USART3,USART_FLAG_TC);
if(Uart_dataj <= Uart_datasend_len)
{
// printf("TC = %d,TXE = %d,FLAG_TC = %d\n\r",USART_GetITStatus(USART3,USART_IT_TC),USART_GetITStatus(USART3,USART_IT_TXE),USART_GetFlagStatus (USART3,USART_FLAG_TC));
USART_SendData(USART3,Uart_datasend_buff[Uart_dataj]);
while(j < 800)
j++;
// printf("interrupt:j = %d,len = %d,buff[%d] = %c,buff = %s\n\n\r",Uart_dataj,Uart_datalen,Uart_dataj,Uart_databuff[Uart_dataj],Uart_databuff);
}
else
USART_ITConfig(USART3, USART_IT_TXE, DISABLE);
Uart_dataj++;
}
}

先编写usart1的接收程序,把接收到的数据存在数组里面,再编写can的发送程序,把数组的数据通过can发送出去,难点是usart的初始化,中断接收和can初始化,其实很简单的。先调好串口中断接收,再调试can发送。

首先你配置的寄存器和波特律都对了吗?然后串口有发送和接受,还有地线这三根线对接得对不,硬件上很容易把线接错的。然后你的函数里的形参为什么是两个字节的?容易造成溢出等问题。所以你慢慢来,先从硬件查问题,软件问题不外乎寄存器配置和自己所写的逻辑代码,最好软件方面单步调试更清楚。

最小的资源开销是1个定时器中断,一个中断引脚。 如果需要多路串口接收的话,那就接到普通引脚,再接一个二极管到中断引脚。引脚中断后去查询IO是那路串口接收到数据位。(最好有上升下降沿中断。不然就下降沿中断,定时器中断轮询)发送也用同一个定时器。定时器的中断速率最好比波特率快几倍,3倍是最好的。。这样出来的多通道串口的波特率是一样的。。。其他的波特率代码要复杂点 查看原帖>>
麻烦采纳,谢谢!


欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/yw/13380205.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-25
下一篇 2023-07-25

发表评论

登录后才能评论

评论列表(0条)

保存