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.
您好!
我们使用 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 示例。
我相信您不需要 RTS/CTS 与 RS485通信、但我会仔细检查您要通信的器件的 UART 规格(MAX485)
此致、
罗格利奥
您好!
现在、我正在使用 UART2库。 我认为 MAX 485需要 RST 引脚。 当我在 UART2上启用流量控制器时、我无法写入 Modbus 帧 Tx 引脚、但禁用流量控制器时、我从同一引脚获得正确的 Modbus 帧。 它为什么以这种方式运行?
引脚配置 UART2
代码片段
void uart_test(){
//初始化 UART2参数
UART2_Params 参数;
UART2_params_init (¶ms);
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、¶ms);
//检查 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 (¶ms);
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、¶ms);
//检查 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
逻辑 分析器:
引脚 配置: