打印
[应用相关]

用DMA发送的方式,为什么串口无法发出数据?

[复制链接]
1158|56
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
powerantone|  楼主 | 2023-8-28 16:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
看老代码发现的bug。修改波特率的时候,先关闭串口设备,然后再打开,打开的时候多加了一个RT_DEVICE_FLAG_DMA_TX,此时,rt_device_write(env_dev, 0, string, strlen(string));这样最基础的发送函数都发不出来。
初始化时代码如下
struct serial_configure pconfig;
/* 初始化串口 /
if (env_dev == RT_NULL)
{
env_dev = rt_device_find(ENV_NAME);
RT_ASSERT(env_dev);
pconfig.baud_rate = BAUD_RATE_9600;
pconfig.data_bits = DATA_BITS_8;
pconfig.stop_bits = STOP_BITS_1;
pconfig.parity = PARITY_NONE;
pconfig.bit_order = BIT_ORDER_LSB;
pconfig.invert = NRZ_NORMAL;
pconfig.bufsz = 4096;
pconfig.reserved = 0;
/ 设置串口参数 */
rt_device_control(env_dev, RT_DEVICE_CTRL_CONFIG, &pconfig);
/*设置串口的回调函数 */
rt_device_set_rx_indicate(env_dev, env_recv_ind);
}
// if(RT_EOK ==rt_device_open(env_dev, RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_DMA_TX))
if(RT_EOK ==rt_device_open(env_dev, RT_DEVICE_FLAG_INT_RX ))
{
LOG_D("Screen serial open success.\r\n");
// return RT_EOK;
}
else
{
LOG_D("Screen serial open failure.\r\n");
// return RT_ERROR;
}
修改波特率时的代码如下
tmp_baud = (tmp_baud == 1)?2:1;
struct serial_configure pconfig;
if (tmp_baud == 1)
{
pconfig.baud_rate = BAUD_RATE_9600;
}
else if (tmp_baud == 2)
{
pconfig.baud_rate = BAUD_RATE_115200;
}
sys_para.env_bdrate = tmp_baud;//修改全局变量
// USART3->BRR =
pconfig.data_bits = DATA_BITS_8;
pconfig.stop_bits = STOP_BITS_1;
pconfig.parity = PARITY_NONE;
pconfig.bit_order = BIT_ORDER_LSB;
pconfig.invert = NRZ_NORMAL;
pconfig.bufsz = 4096;
pconfig.reserved = 0;
rt_device_close(env_dev);
/* 设置串口参数 */
rt_device_control(env_dev, RT_DEVICE_CTRL_CONFIG, &pconfig);
// rt_device_open(env_dev, RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_DMA_TX);
rt_device_open(env_dev, RT_DEVICE_FLAG_INT_RX );
打开的时候rt_device_open(env_dev, RT_DEVICE_FLAG_INT_RX | RT_DEVICE_FLAG_DMA_TX); 此时旧无法发送。
很奇怪,env_dev是串口3,也没有和别的DMA有冲突啊,就算有冲突也可以仲裁啊。谢谢
补充一下发送的内容
//数组是全局变量
static const rt_uint8_t cmd1[] = {0x01, 0x03, 0x00, 0x02, 0x00, 0x02, 0x65, 0xCB};//light
static const rt_uint8_t cmd2[] = {0x02, 0x03, 0x00, 0x02, 0x00, 0x01, 0x25, 0xF9};//ch5
static const rt_uint8_t cmd3[] = {0x03, 0x03, 0x00, 0x02, 0x00, 0x01, 0x24, 0x28};//h2s
static const rt_uint8_t cmd4[] = {0x04, 0x03, 0x00, 0x00, 0x00, 0x02, 0xC4, 0x5E};//pm2.5
//发送部分代码
//根据索引
if (index == 0)
{
rt_kprintf("write cmd1\n");
rt_device_write(serial, 0, cmd1, 8);
}
else if (index == 1)
{
rt_kprintf("write cmd2\n");
rt_device_write(serial, 0, cmd2, 8);
}
else if (index == 2)
{
rt_kprintf("write cmd3\n");
rt_device_write(serial, 0, cmd3, 8);
}
else if (index == 3)
{
rt_kprintf("write cmd4\n");
rt_device_write(serial, 0, cmd4, 8);
}
index++;
if (index == 4)
{
index = 0;
}

使用特权

评论回复
沙发
Stahan| | 2023-9-2 23:29 | 只看该作者
初始化的问题?

使用特权

评论回复
板凳
eefas| | 2023-9-5 10:37 | 只看该作者
如果串口发送缓冲区溢出,将导致数据无法发送。请确保DMA的传输大小和缓冲区大小匹配,并根据需要适当调整缓冲区的大小。

使用特权

评论回复
地板
chenci2013| | 2023-9-5 10:56 | 只看该作者
检查你的代码是否正确地向发送缓冲区写入数据,并且确保发送缓冲区没有溢出。

使用特权

评论回复
5
febgxu| | 2023-9-5 11:33 | 只看该作者
在使用DMA发送数据时,需要注意DMA控制器与串口控制器的中断信号是否正确配置

使用特权

评论回复
6
janewood| | 2023-9-5 12:14 | 只看该作者
DMA传输模式不正确               

使用特权

评论回复
7
earlmax| | 2023-9-5 12:51 | 只看该作者
检查串口模块是否有损坏或者短路等故障。

使用特权

评论回复
8
usysm| | 2023-9-5 13:29 | 只看该作者
如果中断信号未正确配置,那么可能会导致数据的丢失或错误。

使用特权

评论回复
9
10299823| | 2023-9-5 13:44 | 只看该作者
检查是否存在误用或硬件故障,如错误连接或损坏的芯片、线缆或外设等。

使用特权

评论回复
10
juliestephen| | 2023-9-5 14:25 | 只看该作者
如果波特率设置错误,可能会导致数据无法正常发送。

使用特权

评论回复
11
jackcat| | 2023-9-5 14:42 | 只看该作者
确保串口和DMA相关的引脚配置正确,并且电源供应稳定。检查是否有其他硬件或电源问题导致串口无法工作。

使用特权

评论回复
12
lzbf| | 2023-9-5 15:30 | 只看该作者
如果未初始化DMA控制器,那么DMA将无法正确地发送数据

使用特权

评论回复
13
everyrobin| | 2023-9-5 16:52 | 只看该作者
在使用DMA发送数据之前,需要先初始化DMA控制器,包括设置DMA的起始地址、结束地址、数据大小、传输方向、优先级等参数。

使用特权

评论回复
14
robertesth| | 2023-9-5 17:49 | 只看该作者
DMA通道与串口发送寄存器(如USART_SR和USART_DR)连接正确,并且DMA的传输方向设置为从内存到外设(例如USART)。还要确保DMA的触发源和优先级设置正确。

使用特权

评论回复
15
uiint| | 2023-9-5 18:09 | 只看该作者
检查串口的波特率、数据位、停止位和校验位等参数是否设置正确。

使用特权

评论回复
16
everyrobin| | 2023-9-5 18:38 | 只看该作者
如果数据格式不匹配,那么可能会导致数据的丢失或错误。

使用特权

评论回复
17
backlugin| | 2023-9-5 18:55 | 只看该作者
在使用DMA发送数据时,需要注意DMA控制器与串口控制器的数据格式是否匹配

使用特权

评论回复
18
saservice| | 2023-9-5 19:47 | 只看该作者
DMA传输完成后,需要相应的中断或事件处理来通知串口发送完成。确保在中断服务程序或事件处理程序中执行必要的操作,如清除标志位、重置DMA等。

使用特权

评论回复
19
macpherson| | 2023-9-5 20:36 | 只看该作者
在使用DMA传输模式时,需要将数据缓存到内存中,然后再通过DMA传输到串口。

使用特权

评论回复
20
alvpeg| | 2023-9-5 20:56 | 只看该作者
程序不正确或者存在 bug,可能会导致串口无法正常工作。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

466

主题

1728

帖子

4

粉丝