本帖最后由 oxlm_1 于 2025-1-6 00:25 编辑
1号本来想验证485通信能力的,但是由于调试问题,一直没调通485接口,刚好周末有时间,就再一次验证485接口的功能。
经过调试,发现我所使用的启明6m5的2号485接口存在功能不良的情况,刚好板卡的1号485接口功能完好,便切换到1号485接口做485通信功能验证。
首先,还是老方法,先上接线图
我使用的RS232接口做RTT的msh接口,1号485接口做测试接口,使用5V供电为启明6M5提供供电。
代码编写
#include <rtthread.h>
#include "hal_data.h"
#include <rtdevice.h>
#define CTS_PIN BSP_IO_PORT_05_PIN_03 /* 485 Follow control pins */
#define SAMPLE_UART_NAME "uart5"
static rt_device_t serial;
struct rx_msg
{
rt_device_t dev;
rt_size_t size;
};
struct rt_ringbuffer rb;
rt_uint8_t pool[1024];
static rt_uint8_t buffer[BSP_UART4_RX_BUFSIZE + 1];
static rt_err_t uart_input(rt_device_t dev, rt_size_t size)
{
rt_uint32_t rx_length;
rx_length = rt_device_read(dev, 0, buffer, size);
if(rx_length)
{
rt_ringbuffer_put(&rb, buffer, rx_length);
}
return RT_EOK;
}
static void serial_thread_entry(void *parameter)
{
rt_uint32_t rx_length;
static rt_uint8_t rx_buffer[1024];
while (1)
{
rx_length = rt_ringbuffer_data_len(&rb);
if(rx_length)
{
rx_length = rt_ringbuffer_get(&rb, rx_buffer, rx_length);
rt_kprintf("%s\n",rx_buffer);
rt_memset(rx_buffer, 0x00, rx_length);
}
rt_thread_mdelay(1);
}
}
static int uart_loop_sample(int argc, char *argv[])
{
rt_err_t ret = RT_EOK;
char uart_name[RT_NAME_MAX];
char str[] = "hello RT-Thread!\r\n";
if (argc == 2)
{
rt_strncpy(uart_name, argv[1], RT_NAME_MAX);
}
else
{
rt_strncpy(uart_name, SAMPLE_UART_NAME, RT_NAME_MAX);
}
serial = rt_device_find(uart_name);
if (!serial)
{
rt_kprintf("find %s failed!\n", uart_name);
return RT_ERROR;
}
rt_ringbuffer_init(&rb, pool, 1024);
rt_device_set_rx_indicate(serial, uart_input);
rt_device_open(serial, RT_DEVICE_FLAG_RX_NON_BLOCKING | RT_DEVICE_FLAG_TX_BLOCKING);
rt_pin_write(CTS_PIN, PIN_HIGH);
rt_device_write(serial, 0, str, (sizeof(str) - 1));
rt_pin_write(CTS_PIN, PIN_LOW);
rt_thread_t thread = rt_thread_create("serial", serial_thread_entry, RT_NULL, 2048, 25, 10);
if (thread != RT_NULL)
{
rt_thread_startup(thread);
}
else
{
ret = RT_ERROR;
}
return ret;
}
MSH_CMD_EXPORT(uart_loop_sample, uart device loop sample);
基础收发测试
使用常用波特率115200做通信,查看通信的稳定性,从收发上看,115200收发很稳定。
进一步的收发测试
突然发现我另一台电脑上的sscom可以跑到2M的速率,因此把代码配置成2M再一次测试(从打印上看,一如既往地稳定)。
终极测试
遗憾的是,RA6M5的485支持的速率貌似到不了6M,甚至4M都到不了(查规格书发现,板子上所使用的串口转485芯片MAX3485可以到10Mbps,如果不是这芯片的问题的话,那就大概率是走线或者RA6M5本身的能力问题了,因为RA6M5规格书也没提及串口支持的速率上限),因此这部分的测试并没有测出RainbowLink的能力上限,毕竟坛子里已经有测出Rainbowlink 6M速率下,485还能稳定收发了。
本来想使用6M以上的速率去测试,但是想想还是保险起见,先使用CH344Q上限的6M去测试。结果有些惨不忍睹,可以很明显的看到,启明6M5发出的数据,RainbowLink已经无法正确识别了。而RainbowLink发出的信号,启明6M5也出现了明显的误码了
退而求其次,使用4M测试,还是惨不忍睹。
总结
经过这么测试,我发现我并没有测出Rainbowlink的能力上限,但2M的速率,其实已经满足我的日常调试使用了,唯一的遗憾是供电不带开关,在调试时稍有不便。