请选择 进入手机版 | 继续访问电脑版
查看: 1579|回复: 16

[求助] 串口接收进死循环

[复制链接]
  • TA的每日心情
    开心
    2020-12-18 10:54
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    40

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    977
    最后登录
    2024-3-10
    发表于 2020-9-29 15:29:13 | 显示全部楼层 |阅读模式
    使用了lpc1768的串口2进行接收,我外部使用485转换芯片的,上电默认处于接收状态,在线仿真的配置文件如下,应该是没啥问题的
    uart2-8.png
    当时进入之后,上位机发送之后,变成了下面的状态
    uart2-9.png
    请教下,在单片机开发板上是可以的,为啥到了项目上面的板子就变成了错误状态

    最佳答案

    wdliming-222461 发表于 2020-9-30 09:18 如果fifo深度=1,那么就只能用其他方式判断一帧结束了,因为我是485半双工的。。不能像232一样接收就发送 ... 484有485帧结束的判断方式,用的是帧与帧之间的时间间隔,注意 ...
    哎...今天够累的,签到来了~
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2021-1-25 11:21
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    0

    主题

    10

    帖子

    0

    注册会员

    Rank: 2

    积分
    53
    最后登录
    2021-8-27
    发表于 2020-9-29 15:41:31 | 显示全部楼层
    今天配置了LPC1788的UART2,用来调试程序,用的库开发的,代码如下,希望对你有帮助



    #include "uart2_config.h"

    uint8_t uart2_rec_table[uart2_rec_max_len];
    uint8_t uart2_rec_len = 0;
    uint8_t uart2_rec_complete_flag = 0;
    uint8_t uart2_receiving_flag = 0;
    uint8_t uart2_rec_counter = 0;
    /**
    * pin 123      P4[22]      uart2 txd
    * pin 129      P4[23]      uart2 rxd
    */
    void sys_uart2_config(void)
    {
        UART_CFG_Type UARTConfigStruct;
        UART_FIFO_CFG_Type UART_FIFO_CFG_ConfigStruct;

        CLKPWR_ConfigPPWR(CLKPWR_PCONP_PCUART2,ENABLE);
        /*
         * Initialize UART2 pin connect
         * P4.22: TXD
         * P4.23: RXD
         */
        PINSEL_ConfigPin(4, 22, 2);
        PINSEL_ConfigPin(4, 23, 2);//P4[22] 、P4[23] function select <LPC178X_7X_UM.pdf> page 131

        /* Initialize UART Configuration parameter structure to default state:
         * Baudrate = 9600bps
         * 8 data bit
         * 1 Stop bit
         * None parity
         */
        // UARTConfigStruct.Baud_rate = 115200;
        UARTConfigStruct.Baud_rate = 1000000;

        UARTConfigStruct.Databits = UART_DATABIT_8;
        UARTConfigStruct.Parity = UART_PARITY_NONE;
        UARTConfigStruct.Stopbits = UART_STOPBIT_1;

        // Initialize DEBUG_UART_PORT peripheral with given to corresponding parameter
        UART_Init(LPC_UART2, &UARTConfigStruct);

        // Enable UART Transmit
        UART_TxCmd(LPC_UART2, ENABLE);


        UART_FIFO_CFG_ConfigStruct.FIFO_DMAMode = DISABLE;
        UART_FIFO_CFG_ConfigStruct.FIFO_Level = UART_FIFO_TRGLEV0;
        UART_FIFO_CFG_ConfigStruct.FIFO_ResetRxBuf = ENABLE;
        UART_FIFO_CFG_ConfigStruct.FIFO_ResetTxBuf = ENABLE;
        UART_FIFOConfig(LPC_UART2,&UART_FIFO_CFG_ConfigStruct);
        // UART_FIFOConfigStructInit(LPC_UART2);

        UART_IntConfig(LPC_UART2,UART_INTCFG_RBR,ENABLE);
        NVIC_EnableIRQ(UART2_IRQn);
    }

    void sys_uart2_send_byte(uint8_t tmep_data)
    {
        UART_SendByte(LPC_UART2,tmep_data);
        while(SET == UART_CheckBusy(LPC_UART2));//wait busy
    }

    void sys_uart2_send_array_hex(uint8_t* pointer,uint8_t len)
    {
        uint8_t i;
        for(i = 0;i < len;i++)
            sys_uart2_send_byte(pointer);
    }

    void sys_uart2_send_array_ascii(uint8_t* pointer,uint8_t len)
    {
        uint8_t i;
        for(i = 0;i < len;i++)
            printf("%02x ",pointer);
    }

    void sys_uart2_send_string(uint8_t* s)
    {
        while(*s)                               //Check the end of the string
            sys_uart2_send_byte(*s++);          //Send current char and increment string ptr
    }

    void UART2_IRQHandler(void)
    {
         uint8_t Status;
         Status=UART_GetLineStatus(LPC_UART2);

         if(Status & 0x01)
         {
            uart2_rec_table[uart2_rec_len++] = UART_ReceiveByte(LPC_UART2);
            uart2_receiving_flag = 1;
            uart2_rec_counter = 0;
         }
    }



    void uart2_data_process(void)
    {
        uint8_t command = 0;
        uint16_t us_temp_data = 0;

        command = uart2_rec_table[0];
        if(uart2_rec_complete_flag)
        {
            sys_uart2_send_array_ascii(uart2_rec_table,uart2_rec_len);
            sys_uart2_send_string("start!\r\n");
            switch(command)
            {
                case 0x00:
                    break;
                case 0x01:
                    break;
                case 0x02:         
                    break;
                case 0x03:               
                    break;
                default:
                    break;
            }

            uart2_rec_complete_flag = 0;
            uart2_rec_len = 0;
        }
    }


    /*
    串口重定向、使用printf功能。调试的时候使用
    */
    #pragma import(__use_no_semihosting)

    struct __FILE
    {
        int handle;
    };

    FILE __stdout;
    _sys_exit(int x)
    {
        x = x;
    }


    int fputc(int ch, FILE *f)
    {
        /* 发送串口数据 */
        sys_uart2_send_byte((uint8_t) ch);
        return (ch);
    }






    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-12-18 10:54
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    40

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    977
    最后登录
    2024-3-10
     楼主| 发表于 2020-9-29 15:56:49 | 显示全部楼层
    helloomryang 发表于 2020-9-29 15:41
    今天配置了LPC1788的UART2,用来调试程序,用的库开发的,代码如下,希望对你有帮助

    首先谢谢你,但是我还是解决不了,为啥接收就不行, 发送都是可以的
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-1-25 11:21
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    0

    主题

    10

    帖子

    0

    注册会员

    Rank: 2

    积分
    53
    最后登录
    2021-8-27
    发表于 2020-9-29 16:52:16 | 显示全部楼层
    你上面说在开发板上可以,在项目的板子上不可以。有条件的话,在项目的板子直接用usb转TTL给单片机发数据,如果直接用usb转TTL给板子发数据,可以正常接收数据,那我觉得就是硬件的问题了
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-12-18 10:54
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    40

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    977
    最后登录
    2024-3-10
     楼主| 发表于 2020-9-29 17:49:08 | 显示全部楼层
    helloomryang 发表于 2020-9-29 16:52
    你上面说在开发板上可以,在项目的板子上不可以。有条件的话,在项目的板子直接用usb转TTL给单片机发数据, ...

    好的,谢谢提醒
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-12-18 10:54
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    40

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    977
    最后登录
    2024-3-10
     楼主| 发表于 2020-9-29 19:46:42 来自手机 | 显示全部楼层
    helloomryang 发表于 2020-9-29 16:52
    你上面说在开发板上可以,在项目的板子上不可以。有条件的话,在项目的板子直接用usb转TTL给单片机发数据, ...

    很奇怪的现象是,使用232的方式在项目上也是可以通信的,但是我使用485后,能接受一帧数据,但是当我要发送到时候,就出现了串口FIFO错误,从而导致死循环了。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-12-18 10:54
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    40

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    977
    最后登录
    2024-3-10
     楼主| 发表于 2020-9-29 19:48:25 来自手机 | 显示全部楼层
    我使用了FIFO深度为8的时候,先读取7个数据,然后超市中断了才读取剩余字节,这个思路可以用在485通信吗?我感觉是可以的,但是为啥死循环。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-12-18 10:54
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    40

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    977
    最后登录
    2024-3-10
     楼主| 发表于 2020-9-29 20:31:47 | 显示全部楼层
    我使用gpio的通用口,来作为max485的方向切换线,这样的方式,作为通信可以吗?为啥232通信收发都正常,而多了一个引脚就不正常了呢?
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-12-18 10:54
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    40

    主题

    262

    帖子

    0

    高级会员

    Rank: 4

    积分
    977
    最后登录
    2024-3-10
     楼主| 发表于 2020-9-29 21:06:59 | 显示全部楼层
    UARTn FIFO 被禁止。禁止在应用中使用
    fifo这样禁止后,可以使用串口接收功能吗??还是说,fifo是一定要打开的??
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2021-1-25 11:21
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    0

    主题

    10

    帖子

    0

    注册会员

    Rank: 2

    积分
    53
    最后登录
    2021-8-27
    发表于 2020-9-30 09:06:59 | 显示全部楼层
    wdliming-222461 发表于 2020-9-29 21:06
    UARTn FIFO 被禁止。禁止在应用中使用
    fifo这样禁止后,可以使用串口接收功能吗??还是说,fifo是一定要打 ...

    可以把fifo深度设置为一个字节触发
    另外,中断允许寄存器(IER),只开启RBRIE

    可以这样试一下
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-3-29 20:33 , Processed in 0.141325 second(s), 31 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表