针对于stm32FreeRTOS和JETSON nano串口通信一段时间,stm32接收不到数据问题。(附python代码和stm32代码)

最近在做项目的时候,需要用stm32和jetson nano通信时,stm32初始化代码后,stm32可以接收到jetson nano的数据但是到要发送数据的时候,就接收不到数据了,经分析在初始化后,如果曾经接收正常过,说明基础配置是没有问题的,过一段时间后收不到任何数,并且程序还在跑,并没有硬件错误之类的,这种情况一般是数据量太大导致了串口的过载宕机。

硬件平台:正点原子stm32阿波罗F429

操作系统:FreeRTOS

代码库:HAL库

上位机:JETSON NANO 4G

解决方法:

(1)利用你程序里已经开的定时器,直接判断ORE是否被置位,判断ORE的方法如下:

标准库查询函数USART_GetITStatus(USARTx, USART_IT_ORE)

hal库查询函数__HAL_UART_GET_FLAG(&huart1,UART_FLAG_ORE);

(2)利用创建的任务,判断ORE是否被置位。

如果__HAL_UART_GET_FLAG返回1,则调用

HAL_UART_Receive_IT(&UART3_Handler, (u8 *)aRxBuffer3, RXBUFFERSIZE);

stm32代码:

if(__HAL_UART_GET_FLAG(&UART3_Handler,UART_FLAG_ORE)==1){
			HAL_UART_Receive_IT(&UART3_Handler, (u8 *)aRxBuffer3, RXBUFFERSIZE);
		}

jetson nano中python代码:(不懂如何进行stm32和jetson nano通信的同学可以参考一下):

#!/usr/bin/python3
import time
import serial

serial_port = serial.Serial(
    port="/dev/ttyTHS1",
    baudrate=115200,
    bytesize=serial.EIGHTBITS,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
)
# Wait a second to let the port initialize
time.sleep(1)
print("串口初始化成功")
_Now=0
_Last_Time=0
Task_flag=0

def Send_usart():
    # serial_port.write("aaaa\r\n".encode())  #发送数据
    Send_data=[]
    data=[]
    global _Now,_Last_Time
    _Now=time.time()
    Sampling_Time=(_Now-_Last_Time)
    _Last_Time=_Now
    data=str(Sampling_Time)
    Send_data="s"+data[2:8]+"e"
    # print(Send_data)
    serial_port.write(Send_data.encode())  #发送数据
    time.sleep(0.01)

def Receive_usart():
    global Task_flag
    if serial_port.inWaiting() > 0:         ## 当接收缓冲区中的数据不为零时,执行下面的代码
        Receive_data = serial_port.read(3)           #接收数据
        Task_flag=chr(Receive_data[1])
        print(Task_flag)

if __name__=="__main__":
    while True:
        Send_usart()
        Receive_usart()
    

stm32串口处理代码:(stm32初始化就不介绍了,正点原子程序代码直接移植)

	else if(huart->Instance==USART3)//如果是串口3
	{
		float Sampling_Time=0;
		if(aRxBuffer3[0]=='s'){      //接收开始
			USART3_START=1;
		}
		if(USART3_START==1){
			USART_RX_BUF3[USART3_RX_STA++]=aRxBuffer3[0];
			if(aRxBuffer3[0]=='e'){   //接收结束
				if(USART3_RX_STA==8){   //低9位才进入
					//s010826e
					Sampling_Time=(USART_RX_BUF3[1]-'0')*0.1+(USART_RX_BUF3[2]-'0')*0.01+(USART_RX_BUF3[3]-'0')*0.001+
							(USART_RX_BUF3[4]-'0')*0.0001+(USART_RX_BUF3[5]-'0')*0.00001+(USART_RX_BUF3[6]-'0')*0.000001;
					printf("%f\r\n",Sampling_Time);
					Point_x=0;
					Point_y=0;
					Point_angle=0;
			
				}
				
				
				USART3_START=0;
				USART3_RX_STA=0;
			}
		}

	}

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏打不会碱

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值