MyCollege1999 2025-11-27 18:52 采纳率: 59.2%
浏览 4

c程序读不到单片机发的UART1串口消息

调试中发现一个问题,python和c程序都会打开一个串口设备/dev/ttyAMA1, 这个设备是通过UART1和单片机通信的。当单片机发一个字符串比如bt时,python程序能读到,但是c程序却read阻塞了(正常情况下期望c程序了也读到单片机发的消息),这个是什么情况?

  • 写回答

3条回答 默认 最新

  • 阿里嘎多学长 2025-11-27 18:56
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题分析

    • 单片机通过UART1发送串口消息
    • Python程序能够读到串口消息
    • C程序无法读到串口消息

    可能原因

    1. 串口配置不一致: Python程序和C程序可能使用了不同的串口配置,导致C程序无法读到消息。
    2. 缓冲区问题: C程序可能没有正确处理串口缓冲区,导致消息丢失。
    3. 串口设备文件描述符: C程序可能没有正确打开串口设备文件描述符,导致无法读到消息。

    解决方案

    1. 检查串口配置: 确保Python程序和C程序使用了相同的串口配置,包括波特率、数据位数、停止位数等。
    2. 使用串口缓冲区函数: 使用tcdrain()函数清空串口缓冲区,确保消息被正确读取。
    3. 检查串口设备文件描述符: 确保C程序正确打开了串口设备文件描述符,并且使用了正确的文件描述符来读取消息。

    核心代码

    #include <stdio.h>
    #include <fcntl.h>
    #include <termios.h>
    
    int main() {
        // 打开串口设备文件描述符
        int fd = open("/dev/ttyAMA1", O_RDWR | O_NOCTTY | O_NDELAY);
        if (fd < 0) {
            perror("open");
            return -1;
        }
    
        // 配置串口
        struct termios options;
        tcgetattr(fd, &options);
        cfsetispeed(&options, B9600);
        cfsetospeed(&options, B9600);
        options.c_cflag = (options.c_cflag & ~CSIZE) | CS8;
        options.c_iflag &= ~IGNBRK;
        options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
        options.c_oflag &= ~OPOST;
        tcsetattr(fd, TCSANOW, &options);
    
        // 清空串口缓冲区
        tcdrain(fd);
    
        // 读取串口消息
        char buffer[1024];
        read(fd, buffer, 1024);
    
        // 关闭串口设备文件描述符
        close(fd);
    
        return 0;
    }
    

    注意: 以上代码仅供参考,具体实现可能需要根据实际情况进行调整。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月27日