This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LAUNCHCC3220MODASF:RS 至485 Modbus 的 UART 参数设置

Guru**** 1955920 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1280249/launchcc3220modasf-uart-parameter-setting-for-rs-485-modbus

器件型号:LAUNCHCC3220MODASF

您好!


我们使用 RS485 Modbus (max485)、它是半双工通信。 如何设置 UART 参数?
我们使用下面的 UART 参数结构


uart.c

typedef 结构{
UART_Mode readMode;/*!<所有读调用的模式*/
UART_Mode writeMode;/*!<所有写调用的模式*/
uint32_t readTimeout;/*!<阻塞模式下读取调用的超时。 */
uint32_t writeTimeout;/*!<阻塞模式下写入调用的超时。 */
UART_Callback readCallback;/*!<指向回调模式的读回调函数的指针。 */
UART_Callback writeCallback;/*!<指向回调模式的回调函数的指针。 */
UART_ReturnMode readReturnMode;/*!<接收返回模式*/
UART_DataMode readDataMode;/*!<正在读取的数据类型*/
UART_DataMode writeDataMode;/*!<正在写入的数据类型*/
UART_Echo readEcho;/*!<回送接收的数据*/
uint32_t 波特率;/*!< UART 的波特率*/
UART_LEN dataLength;/*!< UART 的数据长度*/
UART_STOP stopbits;/*!< UART 的停止位*/
uart_par parityType;/*!< UART 的奇偶校验位类型*/
void *定制;/*!<驱动程序实施使用的自定义参数*/
} UART_Params;

它需要流量控制吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    大家好。

    感谢您的联系、我将对此进行探讨、并将在明天进行跟进。

    此致、

    罗格利奥

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好
    有更新吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Noushadali、

    为了更好地熟悉 UART 外设的使用方法、我建议查看 SDK 中的 Uart2echo 示例。

    https://dev.ti.com/tirex/explore/node?node=A__AAQFAEWlt8mkqF8DfPTC7A__com.ti.SIMPLELINK_CC32XX_SDK__fc2e6sr__LATEST

    我相信您不需要 RTS/CTS 与 RS485通信、但我会仔细检查您要通信的器件的 UART 规格(MAX485)

    此致、

    罗格利奥

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    现在、我正在使用 UART2库。 我认为 MAX 485需要 RST 引脚。 当我在 UART2上启用流量控制器时、我无法写入 Modbus 帧 Tx 引脚、但禁用流量控制器时、我从同一引脚获得正确的 Modbus 帧。 它为什么以这种方式运行?
     
    引脚配置 UART2



    代码片段

    void uart_test(){
    //初始化 UART2参数
    UART2_Params 参数;
    UART2_params_init (&params);
    params.baudrate = 9600;
    params.readMode = UART2_Mode_Polling;
    params.writeMode = UART2_Mode_Blocking;
    params.readReturnMode=UART2_ReadReturnMode_partial;
    //打开 UART
    UART2_Handle UART;
    UART = UART2_OPEN (CONFIG_UART_RS485、&params);

    //检查 UART 是否成功打开
    if (uart == NULL){
    //打印错误消息并相应地返回或处理错误
    display_printf (display、0、0、"Error opening UART\n");
    返回;


    //将 Modbus 帧写入 UART
    uint8_t modbusFrame[]={0x01、0x03、0x00、0x01、0x00、 0x01、0xC4、0x39};
    int32_t writeStatus = UART2_write (UART、modbusFrame、sizeof (modbusFrame)、NULL);

    if (writeStatus <0){
    //处理写入 UART 时发生的错误
    display_printf (display、0、0、"Error writing to UART\n");

    //从 UART 读取响应

    int32_t readStatus = UART2_read (UART、缓冲区、BUFSIZE、&bytesRead);

    if (readStatus <0){
    //处理从 UART 读取时发生的错误
    display_printf (display、0、0、"Error reading from UART\n");
    }其他{
    //在"缓冲区"中处理接收到的数据
    display_printf (display、0、0、"Success reading from UART\n");
    display_printf (display、0、0、"readbytet size %d\n"、bytesRead);
    //以十六进制格式打印每个字节
    for (size_t i = 0;i < bytesRead;i++){
    display_printf (display、0、0、"Byte %zu:0x%02x\n"、i、buffer[i]);


    //关闭 UART
    UART2_Close (UART);



    Modbus 原理图  





  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您的假设是错误的。 不应使用硬件流控制。 您应该通过 GPIO 手动设置 RTS 引脚。

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    我尝试了 RTS 引脚作为 GPIO、那么如何在写入和红色操作期间控制该 GPIO 引脚? 。 我尝试在写入操作之前将 GPIO 设置为输出并将 GPIO 设置为高电平、并在写入操作后将其设置为低电平、但 Modbus 没有响应。

    代码片段

    GPIO_WRITE (CONFIG_GPIO_0、1);
    //将 Modbus 帧写入 UART
    uint8_t modbusFrame[]={0x01、0x03、0x00、0x01、0x00、 0x01、0xC4、0x39};
    int32_t writeStatus = UART2_write (UART、modbusFrame、sizeof (modbusFrame)、NULL);
    GPIO_WRITE (CONFIG_GPIO_0、0);

    此时、我观察到时序图 TX 和 GPIO 也不正确。 下面是我在 MAX485与 ESP 通信期间观察到的实际时序图(ESPS、我使用 Tx、RX 和 RTS 引脚)

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    很难解释为什么在没有更深入的调试的情况下您会在 TX 线上看到不同的数据输出。 但是从您上面的图像看、它看起来是正确的引脚状态。

    确保您的 DE 信号在数据 TX 之前具有适当的提前时间(请参阅 MAX485数据表的开关特性)。  但这不能解决 RX 线路的问题。

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好
    如何通过 GPIO 手动设置 RTS 引脚以进行读取和写入? 启用流控后、Tx 线没有收到数据。 如果我们禁用在同一 TX 引脚上接收数据。

    流量控制禁用


    流量控制启用



    如何解决?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    我认为您的问题与启用流控制时的 CTS 引脚有关。 您已配置 CTS 引脚、但可能未使用该引脚。 这意味着 UART 外设"认为"另一侧正忙、没有发送数据。 有关 CC3220中 UART 外设如何工作的更多详细信息、请参阅TRM

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    当我在 UART 写入操作期间将 LaunchPad Tx、Rx、RST 和 CST 直接连接到逻辑分析仪时



    为什么 CST 引脚始终为高电平? 因此 TX 不接收数据

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    您希望 CTS 引脚处于什么状态、尤其是未连接到其他硬件时? CTS (允许发送)是 CC3220侧的输入引脚。

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    Launchpad 的所有引脚均直接连接到逻辑分析仪、不连接其他硬件。 在本例中、CST 引脚的性质是什么?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    抱歉、描述 RTS/CTS 硬件流控制的工作方式超出了此论坛的范围。 在互联网上,你发现许多文章在这个主题。

    1月

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    当我使用 GPIO 引脚控制 RS485的 RE 和 DE 引脚时、我已使用逻辑分析仪成功测试了 RS485 Modbus 通信。 但是、我目前遇到这样一个问题、即无法通过 Launchpad 上的 Rx 引脚接收 Modbus 响应。 尝试读取读取读取字节的大小时、仅显示一个字节、且读取缓冲区看起来为空。 我的读取函数是否存在潜在问题?

    代码片段:

    size_t 字节 Read;
    uint8_t 缓冲器[25];

    void uart_test(){
    //初始化 UART2参数
    UART2_Params 参数;
    UART2_params_init (&params);
    params.baudrate = 9600;
    params.readMode = UART2_Mode_Blocking;
    params.writeMode = UART2_Mode_Blocking;
    params.readReturnMode = UART2_ReadReturnMode_partial;
    //打开 UART
    UART2_Handle UART;
    UART = UART2_OPEN (CONFIG_UART_RS485、&params);
    //检查 UART 是否成功打开
    if (uart == NULL){
    //打印错误消息并相应地返回或处理错误
    display_printf (display、0、0、"Error opening UART\n");
    返回;

    while (1){
    GPIO_WRITE (CONFIG_GPIO_0、1);
    //将 Modbus 帧写入 UART
    uint8_t modbusFrame[]={0x03、0x03、0x00、0x00、0x00、 0x01、0x85、0xE8};
    int32_t writeStatus = UART2_write (UART、modbusFrame、sizeof (modbusFrame)、NULL);
    delayMilliseconds(8);
    GPIO_WRITE (CONFIG_GPIO_0、0);
    if (writeStatus <0){
    //处理写入 UART 时发生的错误
    display_printf (display、0、0、"Error writing to UART\n");

    睡眠(2);
    //从 UART 读取响应

    uint32_t readStatus = UART2_read (UART、缓冲区、sizeof (buffer)、&bytesRead);
    display_printf (display、0、0、"readbytet size %d\n"、bytesRead);
    if (readStatus!= UART2_STATUS_SUCCESS){
    //处理从 UART 读取时发生的错误
    display_printf (display、0、0、"Error reading from UART\n");
    }其他{
    //在"缓冲区"中处理接收到的数据
    display_printf (display、0、0、"Success reading from UART\n");
    //以十六进制格式打印每个字节

    display_printf (display、0、0、" data:%x\n"、buffer[1]);
    display_printf (display、0、0、" data:%x\n"、buffer[2]);
    display_printf (display、0、0、" data:%x\n"、buffer[3]);
    display_printf (display、0、0、" data:%x\n"、buffer[4]);
    display_printf (display、0、0、" data:%x\n"、buffer[5]);
    display_printf (display、0、0、" data:%x\n"、buffer[6]);
    display_printf(显示, 0, 0 ,"数据:%x\n", buffer[7]


    睡眠(5);

    //关闭 UART
    UART2_Close (UART);

    控制台日志:

    readbytet 大小1
    从 UART 成功读取
    数据:0
    数据:0
    数据:0
    数据:0
    数据:0
    数据:0
    数据:0

    逻辑  
    分析器:



    引脚  配置:



  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好
    有更新吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!
    是否有更新?

x 出现错误。请重试或与管理员联系。