55337575 发表于 2024-5-23 13:58:30

CDC串口模块在上位机重启后通讯异常的解决办法(已解决))

本帖最后由 STC32G12K128 于 2024-5-23 17:03 编辑

最近发现我的CDC转换模块的一个问题,在USB连接线同主机USB口连接状态下机器重新启动,此时主机设备管理器能看到CDC串口,串口助手也能看到但不能工作,
打开关闭串口照旧操作,发送数据时出现串口问题然后进行“修复”。我怀疑是下位我的CDC模块没有反应,需要重新初始化。然后我拔下USB线(CDC模块断电)
再插入,恢复正常。

说明:我的CDC模块采用STC32G12K128,HUGE模式编译。CDC核心代码借鉴于STC32G12K128-LQFP64-DIP64-DEMO-CODE例程包的例程18-CDC协议范例的代码。
代码修改:删除UsbInBusy变量,增加局部变量iCount做while()循环计数器

源代码
void uart_polling()
{
    BYTE dat;
    BYTE cnt;

    if (DeviceState != DEVSTATE_CONFIGURED)//如果USB配置没有完成,就直接退出

      return;

    if (!UsbInBusy && (TxRptr != TxWptr))
    {
      EUSB = 0;
      UsbInBusy = 1;
      usb_write_reg(INDEX, 1);
      cnt = 0;
      while (TxRptr != TxWptr)
      {
            usb_write_reg(FIFO1, TxBuffer);
            cnt++;
            if (cnt == EP1IN_SIZE) break;
      }
      usb_write_reg(INCSR1, INIPRDY);
      EUSB = 1;
    }
。。。。。。。。。。。。。


修改后代码
void CDC_polling()
{   
static BYTE cnt;   
static u16 iCount;   
if (DeviceState != DEVSTATE_CONFIGURED)      
return;    if (TxRptr != TxWptr)   
{      
EUSB = 0;
      iCount=4000;
                     
      while (usb_read_reg(INCSR1) & INIPRDY)
      {      
         if(--iCount==0)
         {
            usb_write_reg(INCSR1, INFLUSH);
            break;                //500uS左右溢出
         }      
         }      
         if(iCount>0)
       {   
      usb_write_reg(INDEX, 1);
          cnt = 0;
         while (TxRptr != TxWptr)
         {
             usb_write_reg(FIFO1, TxBuffer);
             cnt++;
             if (cnt == EP1IN_SIZE) break;
         }
         usb_write_reg(INCSR1, INIPRDY);
      }
      EUSB = 1;
    }
。。。。。。。。。。
修改后问题解决!



32G12K128 发表于 2024-5-23 17:03:54

感谢楼主的分享!
页: [1]
查看完整版本: CDC串口模块在上位机重启后通讯异常的解决办法(已解决))