CH395常见问题汇总及解答(持续更新)

@今世未央

您好,正常情况下回复03表示产生了发送缓冲区空和发送完成两个中断,表示数据发送完成以及发送缓冲区空可以再次调用发送函数发送数据。


如果返回00,可以检查一下:

  1. 查询socket中断时输入的socket id是否发生了偏差。

  2. 检查一下此时socket状态(手册0x2F命令码),如果是关闭状态,检查一下是否触发了软件中的close_socket函数。

  3. 在返回00前,如果产生了断开中断和超时中断,CH395默认关闭socket,需要在这连个中断中重新打开socket,如果是做TCP_server,还需要重新监听。

后续有其他问题可邮箱交流(lq@wch.cn)


UDP模式,单播通信,初始化完成后,while循环控制周期发送数据,但正常通信一段时间后,再次发送数据前查询发送缓冲区空中断,一种是得到00回复,另一种情况是得到41的回复,41是超时中断数据发送失败,00是什么原因呢?这两种情况怎么处理呢?


UDP模式,单播通信,初始化完成后,while循环控制周期发送数据,但正常通信一段时间后,再次发送数据前查询发送缓冲区空中断,得到41的回复,41是超时中断数据发送失败,之后重新打开socket通道,然后发送数据查询发送缓冲区空中断得到的回复还是41,应该怎么处理呢


您好,

1.产生超时中断后,395会默认关闭对应的socket,在超时中断中重新调用open_socket函数打开socket即可。

2.中断码如果是在正常通信报03的同时有00产生,这是因为报了空中断,但中断码不会多报所以会夹杂着返回00,这是正常现象,不会影响正常的通信。

3.在查询socket中断时可以同步再查一下此时socket的状态是打开还是关闭,如果socket已经是关闭状态,此时去查询socket中断会报00,如果socket处于打开状态但没有收发数据,此时去查询socket中断也是00,如果socket处于打开状态并且在正常通信,那么查询到的00是上面的第二种情况。

4.如果查询socket状态已经关闭了,要么就是触发了代码中的close_socket函数,要么是之前已经产生了超时导致socket被关闭,可以通过日志看一下具体情况。


后续问题可邮箱交流方便些(邮箱:lq@wch.cn)


收到超时中断(收到回复41),我重新打开socket后发送数据还是超时,收到超时回复直接打开通道就可以吧,不需要发送指令先关闭通道再打开通道吧?

您回复的第四条内容,触发了代码中的close_socket函数,是指现有逻辑可能会触发395中关闭通道函数吗?还有这个日志内容怎么查看呢


您好,

1,在超时中断中重新打开socket即可,不用先关闭。

2,重新打开socket后发数据还是超时,可以在打开socket后查一下socket状态确认是否已经成功打开,同时可以wireshark抓包看一下。

3,之前说会报00,可能是因为正常通信过程中socket被代码某处的close函数给关掉了,所以可以排除一下这个原因

4,可以从上电正常通信开始一直打印socket的中断码和socket状态,等到出现异常现象时,通过打印推测一下问题原因。


可以把抓包和打印的信息邮箱发过来看一下(lq@wch.cn)


正常通信一段时间后,收到00回复,我查询了通道状态,回复是05 00,说明通道是正常打开的,那怎么还会收到00回复

c1470feef082e80cb292b27ab9a75fd1.jpg


所给例程中我看在while循环中,先读取INT引脚为低电平,然后获取全局中断得到对应socket中断,最后才查询socket中断,得到发送缓冲区空中断才发送数据,必须按照这个流程来吗?我是完成初始化后,在发送数据前只会查询一下socket中断,得到空中断就发数据,这个会影响我之前出现的那些问题吗?


您好,395的事务处理机制为中断的方式,可以通过395的中断脚判断是否需要执行查询中断的命令,也可以采用轮询的方式定时查询中断命令,您那边收到的socket中断状态为0x41(超时中断以及发送缓冲区空闲中断)

image.png

建议通过MCU外部中断或轮询方式及时处理395报上来的中断,防止出现某中断没有及时处理影响其他功能。此外数据发送失败也会出现timeout超时中断。可以通过FUN_PARA_FLAG_SOCKET_CLOSE来控制是否自动关闭socket,如果是自动关闭socket的模式需要注意再报timeout后需要重新创建socket才能继续通信。

image.png

如有其他问题可通过邮箱沟通(zl@wch.cn)


CH395 上联主控GD32 MCU ,但CH395INT#中断信号线没有链接MCU,获取中断时,gpio_input_bit_get(GPIOAGPIO_PIN_1== RESET是否可以取消,while里面直接调用中断函数

while(1)

        {    

            if(gpio_input_bit_get(GPIOAGPIO_PIN_1== RESET)

            {      

                CH395GlobalInterrupt();

            }



您好,可以采用轮询的方式定时查询CH395GlobalInterrupt();如果应用比较简单也可在while里直接直接调用CH395GlobalInterrupt();


您好,轮询方式能给个实例代码嘛?


您好,while中直接调用CH395GlobalInterrupt();也是轮询方式的一种,如果想要定时查询可参考GD32的定时器中断例程。如有其他问题可邮件沟通(zl@wch.cn)。


您好,请问外部复位信号RSTI先输出一个低电平,再输出一个高电平,然后成功完成CH395初始化,但是发送第一帧数据就失败了(查询中断回复41),为什么成功完成复位初始化操作,发送数据会失败呢?(UDP模式单播通信)


udp广播通信,上位机周期100ms发送数据,大约几个小时后,ch395q芯片死机,这是什么问题了,有人遇到吗


只有登录才能回复,可以选择微信账号登录