最近在做项目的时候,需要用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;
}
}
}