ymodem在on_begin内发送can无法断开连接,而且RTT会报hardfault

发布于 2015-07-01 12:21:43
我使用ymodem组件接收文件,在on_begin内做了文件名判断,如果文件名不对,就return RYM_CODE_CAN 。但是发现发送方没有断开连接,rtt成功跳出rym_recv_on_device。发送方在没有收到接收方响应一段时间后断开连接,RTT立马报hardfault。
-------------------------------------------------------------------------
后来我发现_rym_do_handshake做了err判断后,没有发送命令,于是我添加了 _rym_putchar(ctx, RYM_CODE_NAK);
_rym_putchar(ctx, RYM_CODE_CAN);
但是这样做发送方依然没有断开连接,RTT跳出rym_recv_on_device后,马上报hardfault。

最终发现,是发送方取消了连接后,RTT就会报故障。

这是我的修改代码:

static rt_err_t _rym_do_recv(
struct rym_ctx *ctx,
int handshake_timeout)
{
rt_err_t err;

ctx->stage = RYM_STAGE_NONE;

ctx->buf = rt_malloc(_RYM_STX_PKG_SZ);
if (ctx->buf == RT_NULL)
return -RT_ENOMEM;

err = _rym_do_handshake(ctx, handshake_timeout);
if (err != RT_EOK)
{
_rym_putchar(ctx, RYM_CODE_NAK);
_rym_putchar(ctx, RYM_CODE_CAN);
return err;
}
err = _rym_do_trans(ctx);
if (err != RT_EOK)
return err;

return _rym_do_fin(ctx);
}


这是显示的故障:
5.jpg
这是超级终端:
6.jpg
7.jpg

查看更多

关注者
0
被浏览
1.9k
5 个回答
grissiom
grissiom 2015-07-01
发送 CAN 的时候要多发几个,发送端才会真正取消发送。

至于为什么 hardfault,需要根据 PC 来确定具体是死在哪一行上再进行判断。
mermew
mermew 2015-07-01
我连续发多个CAN后终于可以了。
pc每次都指向
E8BD83F8 POP {r3-r9,pc}


我发现ymodem和finsh 共用一个串口,不会报故障
如果ymodem和finsh 分别用不同的口,就会报这个hardfault
bernard
bernard 2015-07-01
分开用两个串口应该更安全才是的,共用一个,这个不应该啊。
mermew
mermew 2015-07-02
终于解决了,主要是因为ymodem使用的串口我之前没有使用,也就是没有设置过回调函数和进行open。我只要在rym_recv_on_device之前给串口设置一个空的回调函数,并open。

或许是进行了下面的代码的缘故:
    int_lvl = rt_hw_interrupt_disable();
rt_sem_detach(&ctx->sem);

dev->flag = odev_flag;
rt_device_set_rx_indicate(dev, odev_rx_ind);
rt_hw_interrupt_enable(int_lvl);

撰写答案

请登录后再发布答案,点击登录

发布
问题

分享
好友

手机
浏览

扫码手机浏览