You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:35:17