硬汉嵌入式论坛

 找回密码
 立即注册
查看: 408|回复: 3
收起左侧

[UART] 请教硬汉哥关于安富莱的源码例子中的Modbus问题

[复制链接]

22

主题

66

回帖

132

积分

初级会员

积分
132
发表于 2024-1-24 15:07:20 | 显示全部楼层 |阅读模式

在modbus\V7-083_Modbus RTU从站例程\User\bsp\src\bsp_uart_fifo.c文件中的串口中断函数中标红部分我认为是多余的操作吧 虽然正常情况下不会进入 因为出错了发送了也是出错数据 _pUart->usTxCount--;在发送完成中断持续发送不是很理解



        /* 数据bit位全部发送完毕的中断 */
        if (((isrflags & USART_ISR_TC) != RESET) && ((cr1its & USART_CR1_TCIE) != RESET))
        {
                //if (_pUart->usTxRead == _pUart->usTxWrite)
                if (_pUart->usTxCount == 0)
                {
                        /* 如果发送FIFO的数据全部发送完毕,禁止数据发送完毕中断 */
                        //USART_ITConfig(_pUart->uart, USART_IT_TC, DISABLE);
                        CLEAR_BIT(_pUart->uart->CR1, USART_CR1_TCIE);

                        /* 回调函数, 一般用来处理RS485通信,将RS485芯片设置为接收模式,避免抢占总线 */
                        if (_pUart->SendOver)
                        {
                                _pUart->SendOver();
                        }
                       
                        _pUart->Sending = 0;
                }
                else
                {
                        /* 正常情况下,不会进入此分支 */


                        /* 如果发送FIFO的数据还未完毕,则从发送FIFO取1个数据写入发送数据寄存器 */
                        //USART_SendData(_pUart->uart, _pUart->pTxBuf[_pUart->usTxRead]);
                        _pUart->uart->TDR = _pUart->pTxBuf[_pUart->usTxRead];
                        if (++_pUart->usTxRead >= _pUart->usTxBufSize)
                        {
                                _pUart->usTxRead = 0;
                        }
                        _pUart->usTxCount--;
                }
        }


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2024-1-25 00:32:56 | 显示全部楼层
可以不加的。
回复

使用道具 举报

22

主题

66

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2024-1-29 16:32:49 | 显示全部楼层

#define S_RX_BUF_SIZE                30
#define S_TX_BUF_SIZE                128

typedef struct
{
        uint8_t RxBuf[S_RX_BUF_SIZE];
        uint8_t RxCount;
        uint8_t RxStatus;
        uint8_t RxNewFlag;

        uint8_t RspCode;

        uint8_t TxBuf[S_TX_BUF_SIZE];
        uint8_t TxCount;
}MODS_T;

        /* 硬件定时中断,定时精度us 硬件定时器1用于MODBUS从机, 定时器2用于MODBUS主机*/
        bsp_StartHardTimer(1, ModbusBaudRate.usTimeOut, (void *)MODS_RxTimeOut);

        if (g_tModS.RxCount < S_RX_BUF_SIZE)
        {
                g_tModS.RxBuf[g_tModS.RxCount++] = _byte;//接收的字节数据放入g_tModS.RxBuf中
        }
谢谢硬汉哥的解答  另外我想请问在教程中在标红的地方使用的不是fifo缓冲形式吗 这里为什么不直接接收到缓冲里面 而且用这种变量 而且接收的一个buf为什么最多是30,modebus不是最多接收252个字节吗 那如果这样不会溢出吗。这里没有看懂

23png.png
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106649
QQ
发表于 2024-1-29 17:50:35 | 显示全部楼层
2360985396 发表于 2024-1-29 16:32
#define S_RX_BUF_SIZE                30
#define S_TX_BUF_SIZE                128

1、缓冲大小,大家根据自己的应用加大即可。
2、Modbus没有使用串口的FIFO空间处理,主要是为了方便帧数据的解析。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-27 22:21 , Processed in 0.477079 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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