Raspberry Pi 4与NUCLEO-8S208RB串口单向通信异常求助
树莓派4B与NUCLEO-8S208RB串口通信故障排查记录
我正在尝试通过Tx/Rx引脚实现树莓派4B与NUCLEO-8S208RB的串口通信,目前遇到以下问题:
- STM32板发送的数据可被树莓派正常接收,但树莓派发送的消息完全丢失
- 以下场景通信均正常:
- 两者通过USB传输数据
- 树莓派串口自环测试
- STM32串口自环测试
- Arduino MEGA2560分别与树莓派、STM32通信
- 改用UART3后,双向通信恢复正常
树莓派代码
import serial import time if __name__ == '__main__': ser = serial.Serial('/dev/ttyAMA0', 500000, timeout=0) ser.reset_input_buffer() while True: ser.write(b"Hell\n") if ser.in_waiting > 0: line = ser.readline().decode('utf-8').rstrip() print(line) time.sleep(1)
STM32代码
main.c
/* MAIN.C file * * Copyright (c) 2002-2005 STMicroelectronics */ #include <stm8s.h> #include "Serial.h" #include "ISR.h" #include "delay.h" main() { InitCLK(); InitSer(); Serial_Send_String("xd\n"); InitISR(); while(1){ delay_ms(500); } } @svlreg @far @interrupt void ISR_Ser(void){ //已在中断向量文件中配置对应中断 char n=UART1 -> DR; Serial_Tx(n); }
Serial.c
#include "Serial.h" #include <stdlib.h> #include <stdio.h> #include <math.h> #include <string.h> #include <stm8s.h> void InitSer(){ GPIO_DeInit(GPIOA); GPIO_Init(GPIOA,GPIO_PIN_5, GPIO_MODE_OUT_PP_HIGH_FAST); GPIO_Init(GPIOA,GPIO_PIN_4, GPIO_MODE_IN_PU_NO_IT); UART1_DeInit(); UART1_Init(500000,UART1_WORDLENGTH_8D,UART1_STOPBITS_1,UART1_PARITY_NO,UART1_SYNCMODE_CLOCK_DISABLE,UART1_MODE_TXRX_ENABLE); UART1_ITConfig(UART1_IT_RXNE, ENABLE); UART1_Cmd(ENABLE); } void Serial_Tx(uint8_t data){ while(!(UART1 -> SR & UART1_SR_TC)); UART1 -> DR = data; } void Serial_Send_Int(int32_t num) { if(num<0) { Serial_Send_String("-"); num=-num; } if(num==0){Serial_Tx('0');} else { char str[10]; // 定义用于转换数字的字符串(最多10位) char i; // 循环计数器 for(i=0;i<10;i++) str[i]=0; // 清空字符串 i=10; while (num) { str[i]=num%10+'0'; // 将数字转换为字符串(从最低位开始) num/=10; i--; } for (i=0;i<10;i++) // 逐个字符发送字符串 if (str[i]) Serial_Tx(str[i]); } } void Serial_Send_Hex(int32_t num){ if(num<0) { Serial_Send_String("-"); num=-num; } Serial_Send_String("0x"); if(num==0)Serial_Tx('0'); else{ char str[10]; // 定义用于转换数字的字符串(最多10位) char i; // 循环计数器 long remainder; //余数 for(i=0;i<10;i++) str[i]=0; // 清空字符串 i=0; while (num) { remainder = num % 16; if (remainder < 10)str[i++] = 48 + remainder; else str[i++] = 55 + remainder; num/=16; Serial_Tx(''); } for (i=0; i<10; i++) // 逐个字符发送字符串 if (str[9-i]) Serial_Tx(str[9-i]); } } void Serial_Send_String(char *string1) { int i=0; for(i=0;i<strlen(string1);i++) { Serial_Tx(string1[i]); } } void SerialN() { Serial_Tx(13); Serial_Tx(10); }
Arduino代码
int incomingByte = 0; // 存储接收的串口数据 void setup() { Serial.begin(9600); // 初始化串口,波特率9600 } void loop() { // 仅当收到数据时发送响应 if (Serial.available() > 0) { // 读取收到的字节 incomingByte = Serial.read(); // 输出收到的数据 Serial.print("I received: "); Serial.println(incomingByte, DEC); } }
内容的提问来源于stack exchange,提问作者Kingsley
相关产品推荐
相关产品推荐

